scrapyアーキテクチャプロセス

1.クローラスパイダーはディスパッチャスケジューラを介してエンジンに要求を渡し

2.schedulerは、要求キュー、ダウンローダーでダウンロード要求に要求キューを持っています

ダウンロードされたインターネットサーバから3.downloader要求データ、

レスポンスボディからダウンロード4.私たち自身のクモを書くために返され、レスポンスボディはそれに応じて扱わ

5.処理の後、体に応答して2つのケースがあり、1):もしパイプラインデータ処理2)のデータパイプライン:それはダウンローダに、キューに処理要求を待機するための要求、その後、ディスパッチャであり、場合その上、処理、及び、何の要求が生成されませんがあるまで、

 

 

 

Redisの-scrapyは、フレームアセンブリscrapyに基づいています

scrapyクローラフレームが一般的であり、分散操作、scrapy-RedisのサポートされていないRedisの成分(成分のみ)ベースの一部を提供し、scrapy分散クロールより便利です

scrapyは、4つの成分(成分)は、成分4種類を提供し、4つのモジュールがそれに応じて修正されることを意味します。

  1. スケジューラ
  2. 重複フィルター
  3. アイテムのパイプライン
  4. ベースクモ

要求された量が非常に大きい場合、我々はRedisの指紋データベースにキューの重みにこれを置けばScrapy重複排除をメモリ内で実行され、scrapy占有メモリは、非常に高くなり、その後、非常に便利になります

パイプラインのScrapyデータscrapy-Redisの中で処理される、データは、データベースのRedisに直接格納し、その後、我々はRedisの、メモリベースのストレージので、データMongoDBのための永続性またはMySQLのプロセスであります永続的なデータには適していません

スケジューラ:

scrapy改造了python本来的collection.deque(双向队列)形成了自己的scrapy queue,但是scrapy多个spider不能共享待爬取队列scrapy queue,即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中的优先级,来决定该入到哪个队列中,出列时则是按照优先级较小的优先出列。对于这个较高级别的队列结构,scrapy要提供一系列的方法来管理它,原有的scrapy scheduler以无法满足,此时需要使用scrapy-redis中的scheduler组件。

duplication filter:

scrapy中用集合来实现request的去重功能。scrapy中将已经发送的request指纹信息放入到set中,然后把将要发送的request指纹信息和set中的进行比较,如果存在则返回,否则继续进行操作。核心实现功能代码如下:

 1 def request_seen(self,request):
 2     #self.request_figerprints就是一个指纹集合
 3     fp=self.request_fingerprint(request)
 4 
 5     #这就是判重的核心操作
 6     if fp in self.fingerprints:
 7         return True
 8     self.fingerprints.add(fp)
 9     if self.file:
10         self.file.write(fp+os.linesep)

 

 

 

おすすめ

転載: www.cnblogs.com/cang-yuan/p/10967110.html