1. 程式人生 > >scrapy基礎知識之 RedisCrawlSpider:

scrapy基礎知識之 RedisCrawlSpider:

span 準備 動態 none efi pytho sel ext import

這個RedisCrawlSpider類爬蟲繼承了RedisCrawlSpider,能夠支持分布式的抓取。因為采用的是crawlSpider,所以需要遵守Rule規則,以及callback不能寫parse()方法。

同樣也不再有start_urls了,取而代之的是redis_key,scrapy-redis將key從Redis裏pop出來,成為請求的url地址。

from scrapy.spiders import Rule
from scrapy.linkextractors import LinkExtractor

from scrapy_redis.spiders import RedisCrawlSpider


class MyCrawler(RedisCrawlSpider):
  
    name = ‘mycrawler_redis‘
    redis_key = ‘mycrawler:start_urls‘

    rules = (
        # follow all links
        Rule(LinkExtractor(), callback=‘parse_page‘, follow=True),
    )

    # __init__方法必須按規定寫,使用時只需要修改super()裏的類名參數即可
    def __init__(self, *args, **kwargs):
        # Dynamically define the allowed domains list.
        domain = kwargs.pop(‘domain‘, ‘‘)
        self.allowed_domains = filter(None, domain.split(‘,‘))

        # 修改這裏的類名為當前類名
        super(MyCrawler, self).__init__(*args, **kwargs)

    def parse_page(self, response):
        return {
            ‘name‘: response.css(‘title::text‘).extract_first(),
            ‘url‘: response.url,
        }

註意:

同樣的,RedisCrawlSpider類不需要寫allowd_domainsstart_urls

  1. scrapy-redis將從在構造方法__init__()裏動態定義爬蟲爬取域範圍,也可以選擇直接寫allowd_domains

  2. 必須指定redis_key,即啟動爬蟲的命令,參考格式:redis_key = ‘myspider:start_urls‘

  3. 根據指定的格式,start_urls將在 Master端的 redis-cli 裏 lpush 到 Redis數據庫裏,RedisSpider 將在數據庫裏獲取start_urls。

執行方式:

  1. 通過runspider方法執行爬蟲的py文件(也可以分次執行多條),爬蟲(們)將處於等待準備狀態:

    scrapy runspider mycrawler_redis.py

  2. 在Master端的redis-cli輸入push指令,參考格式:

    $redis > lpush mycrawler:start_urls http://www.dmoz.org/

  3. 爬蟲獲取url,開始執行。

 

scrapy基礎知識之 RedisCrawlSpider: