増量式爬虫類と脱重

9081 ワード

増量式爬虫類:前回の基礎の上で引き続き爬取して、登ったことがあるのはもう爬取しません.
分散型爬虫類:複数のサーバが2つのキューを共有できるため、データを同時に爬虫類することができます.Scrapy-Redisプラグイン:
pip install scrapy-redisのインストール
元の爬虫類と比較すると、設定ファイルの4行のコードだけが違います.
インクリメンタルおよび分散型爬虫コアコード
REDIS_URL = "redis://127.0.0.1:6379"
#       
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
#        
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
#           ,        ,     redis    
SCHEDULER_PERSIST = True

Scrapy-Redisでの重量除去:
# scrapy_redis.dupefilter.RFPDupeFilter

def request_seen(self, request):
    #       ,True    ,False      
	#           
    fp = self.request_fingerprint(request)
    
    #               ,     ,   True,    False
    #  Redis     Set  (    )       
    #      ,              ,  1
    #       ,            ,  0
    added = self.server.sadd(self.key, fp)
    if added == 1:
        return False
    elif added == 0:
        return True
    # return added == 0

フィーチャー値の計算方法:
# from scrapy.utils.request import request_fingerprint
def request_fingerprint(request, include_headers=None):
	#           
    #             
    #       :           
    #      、   、          ,        
    #            url  
    #       User-Agent Cookie Referer      ,              
    #               
    # url   ,          ,   url         ,          ,      
    #	http://www.example.com/query?id=111&cat=222
    #	http://www.example.com/query?cat=222&id=111
    
    #            ,       ,          
    if include_headers:
        include_headers = tuple(to_bytes(h.lower())
                                 for h in sorted(include_headers))
    cache = _fingerprint_cache.setdefault(request, {})
    
    #          
    if include_headers not in cache:
        fp = hashlib.sha1()
        #       
        fp.update(to_bytes(request.method))
        #          url  
        fp.update(to_bytes(canonicalize_url(request.url)))
        #      
        fp.update(request.body or b'')
        #      ,     
        if include_headers:
            for hdr in include_headers:
                if hdr in request.headers:
                    fp.update(hdr)
                    for v in request.headers.getlist(hdr):
                        fp.update(v)
        #          ,    
        cache[include_headers] = fp.hexdigest()
    return cache[include_headers]

特徴値hashアルゴリズム(ハッシュアルゴリズム、md 5、sha 1、sha 256、sha 384)の特徴:
1、同じ明文を暗号化した結果は必ず同じである
2、異なる明文暗号化後の結果は異なるはず
例外:
異なる明文暗号化の結果は同じです.衝突と呼ぶ.
md 5、山東大学の女性教授は、衝突の確率を高めた.
既存の爬虫類は、4行のコードを追加することで、リクエストキューとデリバリーキューをredisに格納することができ、インクリメンタル爬虫類(古いurlアドレスや登ったurlアドレスを登らず、新しいものだけを登る)を実現します.
RedisSpider
分散爬虫類(同じプログラムを複数のサーバで同時に実行し、効率を向上させる)を実現するためにもscrapy-redisの4行設定コードを設定する必要があります.
既存の爬虫類との違い:
1、継承した親が異なるRedisSpider
2、start_がないurlsではなくREDIS_を提供していますKEY
3、起動中に爬虫類を開き、redisに開始経路を追加する必要がある
4、プロファイルの4行コード(文章の先頭の4行)
インクリメンタル爬虫類と分布式爬虫類の違い:
1、spider継承のクラス異なる増分式爬虫継承のクラスがCrawlSpider分布式爬虫継承のクラスがRedisSpider 2、開始爬虫を指定するurl方式異なる増分式spiderにstart_を指定するurl=""アドレス分散spiderでredis_を設定するkey="とredisデータベースでlpush redis_keyの値3、インクリメンタル爬虫類と分布式爬虫類と通常爬虫類の起動方式が同じ分布式爬虫類は爬虫類を起動した後も爬虫類を開始せず、redisデータベースのredis_を読み込むkey開始アドレスurlは、取得してから登り始めます