scrapy基礎知識之 RedisCrawlSpider:
阿新 • • 發佈:2017-06-09
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_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,開始執行。
scrapy基礎知識之 RedisCrawlSpider: