原來scrapy的scheduler維護的是本機的任務佇列(存放request物件及其**函式等資訊)+本機的去重佇列(存放訪問過的url位址)
所以實現分布式爬取的關鍵就是,找一台專門的主機上執行乙個共享的佇列比如redis,
然後重寫scrapy的scheduler,讓新的scheduler到共享佇列訪問request,並且去除重複的request請求,所以總結下來,實現分布式的關鍵就是三點:
#以上三點便是scrapy-redis元件的核心功能1、共享佇列
#2、重寫scheduler,讓其無論是去重還是任務都去訪問共享佇列
#3、為scheduler定製去重規則(利用redis的集合型別)
安裝:pip3 install scrapy-redis
#原始碼:
d:\python3.6\lib\site-packages\scrapy_redis
1、安裝
#2、爬蟲繼承redisspider,(原來繼承spider)pip3 install scrapy-redis
import3、不能寫start_urls,需要寫redis_key,具體見2scrapy
from cnblogs.items import
cnblogsmysqlitem
from scrapy_redis.spiders import
redisspider
class
cnblogspider(redisspider):
name = '
cnblog
'allowed_domains = ['
www.cnblogs.com']
redis_key
= 'myspider:start_urls
' #
start_urls = ['']
defparse(self, response):
# article_list = response.css('
.post-item')
for article in
article_list:
item =cnblogsmysqlitem()
title = article.css('
.post-item-title::text
').extract_first()
title_url = article.css('
.post-item-title::attr(href)
').extract_first()
summary = article.css('
.post-item-summary::text
').extract_first()
#將解析到的資料封裝至items物件中,注意:不支援item.title = title方式
item['
title
'] =title
item[
'title_url
'] =title_url
item[
'summary
'] =summary
#要繼續爬取詳情
#callback如果不寫,預設**到parse方法
#如果寫了,響應回來的物件就會調到自己寫的解析方法中
#meta將引數傳到**函式
yield scrapy.request(title_url, callback=self.parser_detail, meta=)
# pager = response.xpath('
//div[@class="pager"]')
next_page = pager.xpath('
.//a[last()]/text()
').extract_first()
#print(next_page)
if next_page is
">":
next_page_url = pager.xpath('
.//a[last()]/@href
').extract_first()
next_page_url_full = '
' %next_page_url
(next_page_url_full)
yield scrapy.request(next_page_url_full, callback=self.parse)
#yield scrapy.request(next_page_url_full, callback=self.parse)
defparser_detail(self, response):
item = response.meta.get('
item')
#item**來
content = response.css('
#cnblogs_post_body
').extract_first()
item[
'content
'] =content
(item)
yield item
4、setting中配置:
#示例啟動三個程序演示:使用scrapy-redis的去重
dupefilter_class = "
scrapy_redis.dupefilter.rfpdupefilter"#
使用scrapy-redis的scheduler
#分布式爬蟲的配置
scheduler = "
scrapy_redis.scheduler.scheduler"#
持久化的可以配置,也可以不配置
#開啟管道
item_pipelines =
#redis_host = '
localhost'#
主機名redis_port = 6379 #埠#
redis_pass = 'redisp@ssw0rd' # 密碼
redis_url = '
redis://user:pass@hostname:9001'#
連線url(優先於上面三行配置)
redis_params = {} #
redis連線引數
redis_params['
redis_cls
'] = '
myproject.redisclient'#
指定連線redis的python模組
redis_encoding = "
utf-8"#
redis編碼型別
5、現在要讓爬蟲執行起來,需要去redis中以myspider:start_urls為key,插入乙個起始位址
#lpush myspider:start_urls
使用scrapy redis實現分布式
要實現分布式,主機之間需要共享爬取佇列和去衝集合,scrapy redis就是將request排程佇列 請求佇列和獲取的item放在了乙個多台主機可以同時訪問的redis資料庫中。剖析原始碼的工作請根據需要自行學習,直接給出settings中的配置。一 必要配置 以下配置是scrapy redis實...
scrapy redis實現分布式爬蟲
redis資料庫 redis是乙個開源的支援網路 可基於記憶體亦可持久化的日誌型 非關係型 key value資料庫,其結構十分靈活。redis是記憶體中的資料結構儲存系統,處理速度快,提供佇列集合等多種儲存結構,方便佇列維護。redis提供了集合資料結構,排程伺服器借助redis結合實現url去重...
scrapy redis實現分布式爬蟲
一 認識與安裝scrapy redis庫 1 認識scrapy redis庫 scrapy redis庫 提供了所需的功能,scrapy redis改寫了scrapy的排程器 佇列等元件,利用這個庫可以方便地實現scrapy分布式架構。2 安裝scrapy redis庫 pip install sc...