第三百五十七節,Python分佈式爬蟲打造搜索引擎Scrapy精講—利用開源的scrapy-redis編寫分佈式爬蟲代碼

第三百五十七節,Python分佈式爬蟲打造搜索引擎Scrapy精講—利用開源的scrapy-redis編寫分佈式爬蟲代碼css

 

scrapy-redis是一個能夠scrapy結合redis搭建分佈式爬蟲的開源模塊python

 

scrapy-redis的依賴redis

  • Python 2.7, 3.4 or 3.5,Python支持版本
  • Redis >= 2.8,Redis版本
  • Scrapy >= 1.1,Scrapy版本
  • redis-py >= 2.10,redis-py版本,redis-py是一個Python操做Redis的模塊,scrapy-redis底層是用redis-py來實現的

 

下載地址:https://pypi.python.org/pypi/scrapy-redis/0.6.8dom

咱們以scrapy-redis/0.6.8版本爲講scrapy

 

1、安裝scrapy-redis/0.6.8版本的依賴分佈式

  首先安裝好scrapy-redis/0.6.8版本的依賴關係模塊和軟件ide

 

2、建立scrapy項目函數

  執行命令建立項目:scrapy startproject fbshpchpost

 

3、將下載的scrapy-redis-0.6.8模塊包解壓,解壓後將包裏的crapy-redis-0.6.8\src\scrapy_redis的scrapy_redis文件夾複製到項目中搜索引擎

 

 

4、分佈式爬蟲實現代碼,普通爬蟲,至關於basic命令建立的普通爬蟲

注意:分佈式普通爬蟲必須繼承scrapy-redisRedisSpider

#!/usr/bin/env python
# -*- coding:utf8 -*-

from scrapy_redis.spiders import RedisSpider    # 導入scrapy_redis裏的RedisSpider類
import scrapy
from scrapy.http import Request                 #導入url返回給下載器的方法
from urllib import parse                        #導入urllib庫裏的parse模塊




class jobboleSpider(RedisSpider):               # 自定義爬蟲類,繼承RedisSpider類
    name = 'jobbole'                            # 設置爬蟲名稱
    allowed_domains = ['blog.jobbole.com']       # 爬取域名
    redis_key = 'jobbole:start_urls'            # 向redis設置一個名稱儲存url

    def parse(self, response):
        """
        獲取列表頁的文章url地址,交給下載器
        """
        # 獲取當前頁文章url
        lb_url = response.xpath('//a[@class="archive-title"]/@href').extract()  # 獲取文章列表url
        for i in lb_url:
            # print(parse.urljoin(response.url,i))                                             #urllib庫裏的parse模塊的urljoin()方法,是自動url拼接,若是第二個參數的url地址是相對路徑會自動與第一個參數拼接
            yield Request(url=parse.urljoin(response.url, i),
                          callback=self.parse_wzhang)  # 將循環到的文章url添加給下載器,下載後交給parse_wzhang回調函數

        # 獲取下一頁列表url,交給下載器,返回給parse函數循環
        x_lb_url = response.xpath('//a[@class="next page-numbers"]/@href').extract()  # 獲取下一頁文章列表url
        if x_lb_url:
            yield Request(url=parse.urljoin(response.url, x_lb_url[0]),
                          callback=self.parse)  # 獲取到下一頁url返回給下載器,回調給parse函數循環進行

    def parse_wzhang(self, response):
        title = response.xpath('//div[@class="entry-header"]/h1/text()').extract()  # 獲取文章標題
        print(title)

 

 

5、分佈式爬蟲實現代碼,全站自動爬蟲,至關於crawl命令建立的全站自動爬蟲

注意:分佈式全站自動爬蟲必須繼承scrapy-redisRedisCrawlSpider

#!/usr/bin/env python
# -*- coding:utf8 -*-

from scrapy_redis.spiders import RedisCrawlSpider    # 導入scrapy_redis裏的RedisCrawlSpider類
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import Rule


class jobboleSpider(RedisCrawlSpider):               # 自定義爬蟲類,繼承RedisSpider類
    name = 'jobbole'                                 # 設置爬蟲名稱
    allowed_domains = ['www.luyin.org']              # 爬取域名
    redis_key = 'jobbole:start_urls'                 # 向redis設置一個名稱儲存url

    rules = (
        # 配置抓取列表頁規則
        # Rule(LinkExtractor(allow=('ggwa/.*')), follow=True),

        # 配置抓取內容頁規則
        Rule(LinkExtractor(allow=('.*')), callback='parse_job', follow=True),
    )


    def parse_job(self, response):  # 回調函數,注意:由於CrawlS模板的源碼建立了parse回調函數,因此切記咱們不能建立parse名稱的函數
        # 利用ItemLoader類,加載items容器類填充數據
        neir = response.css('title::text').extract()
        print(neir)

 

 

6、settings.py文件配置

# 分佈式爬蟲設置
SCHEDULER = "scrapy_redis.scheduler.Scheduler"                  # 使調度在redis存儲請求隊列
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"      # 確保全部的蜘蛛都共享相同的過濾器經過Redis複製
ITEM_PIPELINES = {
    'scrapy_redis.pipelines.RedisPipeline': 300                 # 存儲在redis刮項後處理
}

 

 

7、執行分佈式爬蟲

  一、運行命令:scrapy crawl jobbole(jobbole表示爬蟲名稱)

  二、啓動redis,而後cd到redis的安裝目錄,

    執行命令:redis-cli -h 127.0.0.1 -p 6379  鏈接一個redis客戶端

    在鏈接客戶端執行命令:lpush jobbole:start_urls http://blog.jobbole.com/all-posts/  ,向redis列隊建立一個起始URL

    說明:lpush(列表數據) jobbole:start_urls(爬蟲裏定義的url列隊名稱) http://blog.jobbole.com/all-posts/(初始url)

 

 

8、scrapy-redis編寫分佈式爬蟲代碼原理

 

 

其餘使用方法和單機版爬蟲同樣 

相關文章
相關標籤/搜索