スクレイプフレームワークの分散クローラー

  • コンセプト:一連のリソースの分散クロールと共同クロールを実行できるように、分散クラスターを構築する必要があります
    • 役割:データのクロールの効率を向上させる
    • 分散を実現する方法は?
      • (redisデータベースを使用して)scrapy-redisコンポーネントをインストールします
      • ネイティブscrapyは分散クローラーを実装できません。分散クローラーを実装するには、Scrapyをscrapy-redisコンポーネントと組み合わせる必要があります。
      • ネイティブのスクレイプフレームワークが分散クローラーを実装できないのはなぜですか?
        • 1.スケジューラーを分散クラスター
          で共有できません2.パイプラインを分散クラスターで共有できません
      • スクレイプリディスコンポーネントの役割:
        • ネイティブのスクレイプフレームワークに共有スケジューラとパイプラインを提供できます
      • 実装プロセス:
        • プロジェクトを作成する
        • 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 proName:itemsデータ構造に保存されます

実際、主に構成に比較的時間がかかるため、分散コードは難しくありません。次のコードは前のブログを参照しています。

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

おすすめ

転載: blog.csdn.net/qwerty1372431588/article/details/107303456