scrapy redis實現分布式爬蟲

2022-09-16 16:06:15 字數 3824 閱讀 6150

原來scrapy的scheduler維護的是本機的任務佇列(存放request物件及其**函式等資訊)+本機的去重佇列(存放訪問過的url位址)

所以實現分布式爬取的關鍵就是,找一台專門的主機上執行乙個共享的佇列比如redis,

然後重寫scrapy的scheduler,讓新的scheduler到共享佇列訪問request,並且去除重複的request請求,所以總結下來,實現分布式的關鍵就是三點:

#

1、共享佇列

#2、重寫scheduler,讓其無論是去重還是任務都去訪問共享佇列

#3、為scheduler定製去重規則(利用redis的集合型別)

以上三點便是scrapy-redis元件的核心功能

安裝:pip3 install scrapy-redis

#原始碼:

d:\python3.6\lib\site-packages\scrapy_redis

1、安裝

#

pip3 install scrapy-redis

2、爬蟲繼承redisspider,(原來繼承spider)

import

scrapy

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

print

(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

print

(item)

yield item

3、不能寫start_urls,需要寫redis_key,具體見2

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...