- コンセプト:一連のリソースの分散クロールと共同クロールを実行できるように、分散クラスターを構築する必要があります
- 役割:データのクロールの効率を向上させる
- 分散を実現する方法は?
- (redisデータベースを使用して)scrapy-redisコンポーネントをインストールします
- ネイティブscrapyは分散クローラーを実装できません。分散クローラーを実装するには、Scrapyをscrapy-redisコンポーネントと組み合わせる必要があります。
- ネイティブのスクレイプフレームワークが分散クローラーを実装できないのはなぜですか?
- 1.スケジューラーを分散クラスター
で共有できません2.パイプラインを分散クラスターで共有できません
- 1.スケジューラーを分散クラスター
- スクレイプリディスコンポーネントの役割:
- ネイティブのスクレイプフレームワークに共有スケジューラとパイプラインを提供できます
- 実装プロセス:
- プロジェクトを作成する
- CrawlSpiderに基づいてクローラーファイルを作成します
- 現在のクローラーファイルを変更します。
- 導包:scrapy_redis.spidersからRedisCrawlSpiderをインポートします
- start_urlsとallowed_dominsに注釈を付けます
- 新しい属性を追加します。redis_key= 'sun'は、共有できるスケジューラキューの名前です。
- データ分析関連の操作を書き込む
- 現在のクローラークラスの親クラスをRedisCrawlSpiderに変更します
- 構成ファイルの設定を変更する
- 共有できるパイプラインの使用を指定します(デッド、直接コピーできます)
ITEM_PIPELINES = { 'scrapy_redis.pipelines.RedisPipeline':400、} - 共有できるスケジューラーを指定します(デッド、直接コピーできます)#要求重複排除の永続性を実現するために、
Redisのセットコレクションを使用して要求された指紋データを格納する重複排除コンテナークラスの構成を追加しましたDUPEFILTER_CLASS = "scrapy_redis .dupefilter.RFPDupeFilter " #scrapy_redisコンポーネント独自のスケジューラーを使用するSCHEDULER =" scrapy_redis.scheduler.Scheduler "#スケジューラーを永続化するかどうか、つまり、クローラーが終了したときに、Redisで要求キューと重複排除フィンガープリントを空にするかどうかを構成します。セットする。Trueの場合は、クリアしないでください。つまり、クロールされていないデータのみをクロールし、クロールされたデータはクロールしません。SCHEDULER_PERSIST= True - residサーバーを指定します
。REDIS_HOST= 'redisリモートサーバーIP(自己変更)'
REDIS_PORT = 'ポート番号'
- 共有できるパイプラインの使用を指定します(デッド、直接コピーできます)
- Redis関連の操作設定:(インストールは新人チュートリアルを参照できます)
- redis構成ファイルを構成します。
- LinuxまたはMac:redis.conf
- Windows:redis.windows.conf
- 変更する構成ファイルを開きます(vi redis.windows.conf)(Windowsの直接メモ帳の変更):
- バインド127.0.0.1を削除します
- 保護モードをオフにする:保護モードをyesからnoに変更
- 構成ファイルを組み合わせて、redisサービスを開始します
- redis_server構成ファイル(redis.windows.conf)
- クライアントを起動します
- redis_cli.exe
- プロジェクトを実行します(スパイダーディレクトリに入ります)
- スクレイピーrunspiderxxx.py
- 開始URLをスケジューラーのキューに入れます。
- スケジューラのキューはredisクライアントにあります
- lpush xxx(キュー名)www.xxx.com
- スケジューラのキューはredisクライアントにあります
- クロールされたデータは、redis proName:itemsデータ構造に保存されます
- redis構成ファイルを構成します。
実際、主に構成に比較的時間がかかるため、分散コードは難しくありません。次のコードは前のブログを参照しています。
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from scrapy_redis.spiders import RedisCrawlSpider
from fenbushipro.items import FenbushiproItem
class FbsSpider(RedisCrawlSpider):
name = 'fbs'
# allowed_domains = ['www.xxx.com']
# start_urls = ['http://www.xxx.com/']
redis_key = 'sun'
rules = (
Rule(LinkExtractor(allow=r'id=1&page=\d+'), callback='parse_item', follow=True),
)
def parse_item(self, response):
li_list = response.xpath('/html/body/div[2]/div[3]/ul[2]/li')
for li in li_list:
new_num = li.xpath('/html/body/div[2]/div[3]/ul[2]/li[1]/span[1]/text()').extract_first()
new_title = li.xpath('/html/body/div[2]/div[3]/ul[2]/li[1]/span[3]/a/text()').extract_first()
print(new_num,new_title) #用于测试程序是否出错
item = FenbushiproItem()
item['new_num'] = new_num
item['new_title'] = new_title
yield item
ITEM_PIPELINES = {
'scrapy_redis.pipelines.RedisPipeline': 300,
}
#指定可以共享的调度器
#增加了一个去重容器类的配置,作用 使用Redis的set集合来存储请求的指纹数据,
#从而实现请求去重的持久化
DUPEFILTER_CLASS ="scrapy_redis.dupefilter.RFPDupeFilter"
#使用scrapy_redis组件自己的调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
#配置调度器是否要持久化,也就是当爬虫结束了,要不要清空Redis中请求队列和去重指纹的
#set。如果是True,不清空
SCHEDULER_PERSIST=True
#指定服务器
REDIS_HOST = '127.0.0.1'
REDIS_PORT = 6379