scrapy基礎知識のScrapyとscrapy-redisの違い:

3290 ワード

Scrapyとscrapy-redisの違い
Scrapyは一般的な爬虫類フレームワークであるが、分散はサポートされていない.Scrapy-redisは、Scrapy分散爬虫類をより容易に実現するために、redisベースのコンポーネント(コンポーネントのみ)をいくつか提供している.
pip install scrapy-redis
Scrapy-redisでは、次の4つのコンポーネント(components)が用意されています.(4つのコンポーネントは、この4つのモジュールが適切に変更されることを意味します)
  • Scheduler
  • Duplication Filter
  • Item Pipeline
  • Base Spider

  • scrapy-redisアーキテクチャScheduler :
    Scrapyはpythonの本来のcollectionを改造した.Deque(双方向キュー)は独自のScrapy queue(https://github.com/scrapy/queuelib/blob/master/queuelib/queue.pyただし、Scrapyは複数のspiderで共有できません.つまり、Scrapy自体が爬虫分布式をサポートしていません.scrapy-redisの解決は、このScrapy queueをredisデータベース(redisキュー)に変換し、同じredis-serverから爬虫するrequestを格納することで、複数のspiderを同じデータベースに読み込ませることができます.
    Scrapyにおいて「待ち行列」に直接関係するものは、スケジューラSchedulerであり、新たなrequestに対するエンキュー操作(Scrapy queueを加える)、次の登るrequest(Scrapy queueから取り出す)などの操作を担当する.待ち行列を優先順位に従って辞書構造を構築します.たとえば、次のようにします.
        {
               0 :   0
               1 :   1
               2 :   2
        }
    

    次にrequestの優先度に基づいて、どのキューに入れるかを決定し、列を出るときは優先度の小さい優先列で優先します.この比較的高度なキュー辞書を管理するために、Schedulerは一連の方法を提供する必要がある.しかし従来のSchedulerでは使用できなくなっているので、Scrapy-redisのschedulerコンポーネントを使用します.Duplication Filter
    Scrapyではこのrequestデリファクタ機能を集合で実現し,Scrapyでは既に送信されたrequest指紋を1つの集合に入れ,次のrequestの指紋を集合に持って行って照合し,その指紋が集合に存在する場合は,このrequestが送信されたことを説明し,なければ操作を継続する.このコアの重量判定機能はこのように実現されています.
        def request_seen(self, request):
            # self.request_figerprints         fp = self.request_fingerprint(request) #            if fp in self.fingerprints: return True self.fingerprints.add(fp) if self.file: self.file.write(fp + os.linesep) 

    scrapy−redisでの重量除去はDuplication Filterコンポーネントによって実現され,redisのsetの重複しない特性によってDuplication Filter重量除去が巧みに実現された.scrapy-redisスケジューラはエンジンからrequestを受け取り、requestの指紋をredisのsetに保存して重複するかどうかをチェックし、重複しないrequest pushをredisのrequest queueに書きます.
    エンジン要求request(Spider発行)の場合、スケジューラはredisのrequest queueキュー⾥から優先度popに従って1つのrequestをエンジンに返し、エンジンはこのrequestをspider処理に送信する.Item Pipeline :
    エンジンは(Spiderが返した)登ったItemをItem Pipelineに、scrapy-redisのItem Pipelineは登ったItemをredisのitems queueに格納します.Item Pipelineを修正すると、keyに基づいてitems queueからitemを抽出し、items processesクラスタを実装するのに便利である.Base Spider
    scrapyの既存のSpiderクラスは使用されず、書き換えられたRedisSpiderはSpiderとRedisMixinの2つのクラスを継承し、RedisMixinはredisからurlを読み出すためのクラスである.
    Spider継承RedisSpiderを生成するとsetup_が呼び出されますredis関数です.この関数はredisデータベースに接続され、signals(信号)が設定されます.
  • spiderが空いているときのsignalはspiderを呼び出します.idle関数、この関数はschedule_next_request関数を呼び出し、spiderが常に生きている状態であることを保証し、DontCloseSpider異常を放出する.
  • itemを捕まえたときのsignalでitem_が呼び出されますscraped関数です.この関数はschedule_next_request関数を呼び出し、次のrequestを取得します.

  • 転載先:https://www.cnblogs.com/huwei934/p/6971613.html