scrapy基礎知識のScrapyとscrapy-redisの違い:
3290 ワード
Scrapyとscrapy-redisの違い
Scrapyは一般的な爬虫類フレームワークであるが、分散はサポートされていない.Scrapy-redisは、Scrapy分散爬虫類をより容易に実現するために、redisベースのコンポーネント(コンポーネントのみ)をいくつか提供している.
pip install scrapy-redis
Scrapy-redisでは、次の4つのコンポーネント(components)が用意されています.(4つのコンポーネントは、この4つのモジュールが適切に変更されることを意味します)
scrapy-redisアーキテクチャ
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において「待ち行列」に直接関係するものは、スケジューラ
次にrequestの優先度に基づいて、どのキューに入れるかを決定し、列を出るときは優先度の小さい優先列で優先します.この比較的高度なキュー辞書を管理するために、Schedulerは一連の方法を提供する必要がある.しかし従来のSchedulerでは使用できなくなっているので、Scrapy-redisのschedulerコンポーネントを使用します.
Scrapyではこのrequestデリファクタ機能を集合で実現し,Scrapyでは既に送信されたrequest指紋を1つの集合に入れ,次のrequestの指紋を集合に持って行って照合し,その指紋が集合に存在する場合は,このrequestが送信されたことを説明し,なければ操作を継続する.このコアの重量判定機能はこのように実現されています.
scrapy−redisでの重量除去は
エンジン要求request(Spider発行)の場合、スケジューラはredisのrequest queueキュー⾥から優先度popに従って1つのrequestをエンジンに返し、エンジンはこのrequestをspider処理に送信する.
エンジンは(Spiderが返した)登ったItemをItem Pipelineに、scrapy-redisのItem Pipelineは登ったItemをredisのitems queueに格納します.
scrapyの既存のSpiderクラスは使用されず、書き換えられた
Spider継承RedisSpiderを生成するとsetup_が呼び出されますredis関数です.この関数はredisデータベースに接続され、signals(信号)が設定されます. spiderが空いているときのsignalはspiderを呼び出します.idle関数、この関数は itemを捕まえたときのsignalでitem_が呼び出されますscraped関数です.この関数は
転載先:https://www.cnblogs.com/huwei934/p/6971613.html
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(信号)が設定されます.
schedule_next_request
関数を呼び出し、spiderが常に生きている状態であることを保証し、DontCloseSpider異常を放出する.schedule_next_request
関数を呼び出し、次のrequestを取得します.転載先:https://www.cnblogs.com/huwei934/p/6971613.html