clone github scrapy-redis源碼文件css
git clone https://github.com/rolando/scrapy-redis.git
git
研究項目自帶的demogithub
mv scrapy-redis/example-project ~/scrapyredis-project
redis
在domz爬蟲文件中,實現方式就是以前的crawlspider
類型的爬蟲bash
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
class DmozSpider(CrawlSpider):
"""Follow categories and extract links."""
name = 'dmoz'
allowed_domains = ['dmoztools.net']
start_urls = ['http://dmoztools.net/'] # 這裏修改了url
# 定義數據提取規則,使用了css選擇器
rules = [
Rule(LinkExtractor(
restrict_css=('.top-cat', '.sub-cat', '.cat-item')
), callback='parse_directory', follow=True),
]
def parse_directory(self, response):
for div in response.css('.title-and-desc'):
yield {
'name': div.css('.site-title::text').extract_first(),
'description': div.css('.site-descr::text').extract_first().strip(),
'link': div.css('a::attr(href)').extract_first(),
}
複製代碼
可是在settings.py中多瞭如下內容,這幾行表示scrapy_redis
中從新實現的了去重的類,以及調度器,而且使用RedisPipeline
管道類框架
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
SCHEDULER_PERSIST = True
ITEM_PIPELINES = {
'example.pipelines.ExamplePipeline': 300,
'scrapy_redis.pipelines.RedisPipeline': 400,
}
複製代碼
REDIS_URL = "redis://127.0.0.1:6379"
#或者使用下面的方式
# REDIS_HOST = "127.0.0.1"
# REDIS_PORT = 6379
複製代碼
繼續執行程序,會發現程序在前一次的基礎之上繼續日後執行,因此domz爬蟲是一個基於url地址的增量式的爬蟲dom
咱們從settings.py中的三個配置來進行分析 分別是:scrapy
RedisPipeline中觀察process_item,進行數據的保存,存入了redis中分佈式
RFPDupeFilter 實現了對request對象的加密ide
scrapy_redis調度器的實現了決定何時把request對象加入帶抓取的隊列,同時把請求過的request對象過濾掉
改寫網易招聘爬蟲,該爬蟲就是一個經典的基於url地址的增量式爬蟲
打開example-project項目中的myspider_redis.py文件
經過觀察代碼:
__init__
方法,該方法不是必須的,能夠手動指定allow_domainsscrapy crawl 爬蟲名
,使該節點的scrapy_redis爬蟲程序就位lpush redis_key 'start_url'
,使所有節點真正的開始運行DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
SCHEDULER_PERSIST = True
ITEM_PIPELINES = {
'example.pipelines.ExamplePipeline': 300,
'scrapy_redis.pipelines.RedisPipeline': 400,
}
REDIS_URL = "redis://127.0.0.1:6379"
複製代碼
改寫tencent爬蟲爲分佈式爬蟲
scrapy_redis的含義和可以實現的功能
scrapy_redis流程和實現原理
request對象進入隊列的條件
request指紋的實現
scarpy_redis實現增量式爬蟲、布式爬蟲
scrapy crawl spider
啓動爬蟲後,向redis_key放入一個或多個起始url(lpush或rpush均可以),纔可以讓scrapy_redis爬蟲運行