這個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_domains
和start_urls
:
-
scrapy-redis將從在構造方法
__init__()
里動態定義爬蟲爬取域范圍,也可以選擇直接寫allowd_domains
。 -
必須指定redis_key,即啟動爬蟲的命令,參考格式:
redis_key = 'myspider:start_urls'
-
根據指定的格式,
start_urls
將在 Master端的 redis-cli 里 lpush 到 Redis數據庫里,RedisSpider 將在數據庫里獲取start_urls。
執行方式:
-
通過runspider方法執行爬蟲的py文件(也可以分次執行多條),爬蟲(們)將處於等待准備狀態:
scrapy runspider mycrawler_redis.py
-
在Master端的redis-cli輸入push指令,參考格式:
$redis > lpush mycrawler:start_urls http://www.dmoz.org/
-
爬蟲獲取url,開始執行。