scrapy-redis分布型爬虫類の構築過程(理論編)


1.背景
Scripyは汎用的な爬虫枠ですが、分散はサポートされていません。Scripy-redisはScrrapy分散型の這い取りをより便利に実現するために、redisをベースとしたいくつかのコンポーネントを提供しています。
 2.環境
  • システム:win 7
  • scrapy-redis
  • redis 3.05
  • python 3.6.1
  • 3.原理
    3.1.scrapyとSrapy-redisのアーキテクチャ図を比較してください。
    scrapyアーキテクチャ図:
    这里写图片描述
    scrapy-redisアーキテクチャ図:
    这里写图片描述
    一つのredisコンポーネントが多くなりました。主に二つのところに影響します。一つ目はスケジューラです。二つ目はデータの処理です。3.2.Srapy-redis分散戦略。
    这里写图片描述
    分散型爬虫類としては、マスター端末(コアサーバ)が必要です。マスターの端に、Redisデータベースを構築して、start_を保存します。urls、request、items。マスターの役割は、url指紋の判定、Requestの割り当て、およびデータの記憶を担当する(一般的にマスターの端には、mongodbをインストールして、redisの中のitemsを記憶する)。マスター以外にも、slaaver(爬虫類プログラムの実行端)というキャラクターがいます。主に爬虫類プログラムを実行してデータを取得し、登山中に新しいRequestをMasterのredisデータベースに提出します。
    上の図のように、私達は4台のコンピュータがあると仮定します。A、B、C、Dのいずれかのコンピュータがマスターの端末またはスラバーの端末として使えます。全体の流れは:
  • まずSlaver端はMasterからタスクを持ってデータをキャプチャし、Slaverはデータを取り込むと同時に、新たなタスクを生み出すRequestはMasterに提出します。
  • Masterの端にはRedisデータベースが一つしかありません。未処理のRequestを重いものにして、任務を割り当てて、処理後のRequestを行列に参加して、這って取るデータを保存します。
  • 这里写图片描述 
    这里写图片描述
    Scripy-redisはデフォルトで使っています。このポリシーは簡単に実現できます。タスクスケジュールなどの作業がもうできました。私たちはRedis Spider、指定redis_を引き継ぎます。keyでいいです。
    欠点は、Scripy-redisスケジューリングのタスクは、Requestオブジェクトであり、情報量が大きい(urlだけでなく、calback関数、headersなどの情報も含む)ため、爬虫速度を低下させたり、Redisの多くの格納空間を占有したりする可能性がありますので、効率を保証するためには、ある程度のハードウェアレベルが必要です。
    4.運行フロー
    第一歩:slaaver端の爬虫類の中で、redis gauを指定します。keyは、redisデータベースのアドレスを指定します。例えば、
    
    class MySpider(RedisSpider):
      """Spider that reads urls from redis queue (myspider:start_urls)."""
      name = 'amazon'
      redis_key = 'amazonCategory:start_
    
    #   redis        
    'REDIS_HOST': '172.16.1.99',
    'REDIS_PORT': 6379,
    ステップ2:slaaver側の爬虫類を起動し、爬虫類は待機状態に入り、redis中にredis_が出現するのを待つ。key,Logは以下の通りである
    
    2017-12-12 15:54:18 [scrapy.utils.log] INFO: Scrapy 1.4.0 started (bot: scrapybot)
    2017-12-12 15:54:18 [scrapy.utils.log] INFO: Overridden settings: {'SPIDER_LOADER_WARN_ONLY': True}
    2017-12-12 15:54:18 [scrapy.middleware] INFO: Enabled extensions:
    ['scrapy.extensions.corestats.CoreStats',
     'scrapy.extensions.telnet.TelnetConsole',
     'scrapy.extensions.logstats.LogStats']
    2017-12-12 15:54:18 [myspider_redis] INFO: Reading start URLs from redis key 'myspider:start_urls' (batch size: 110, encoding: utf-8
    2017-12-12 15:54:18 [scrapy.middleware] INFO: Enabled downloader middlewares:
    ['scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware',
     'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware',
     'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware',
     'redisClawerSlaver.middlewares.ProxiesMiddleware',
     'redisClawerSlaver.middlewares.HeadersMiddleware',
     'scrapy.downloadermiddlewares.retry.RetryMiddleware',
     'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware',
     'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware',
     'scrapy.downloadermiddlewares.redirect.RedirectMiddleware',
     'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware',
     'scrapy.downloadermiddlewares.stats.DownloaderStats']
    2017-12-12 15:54:18 [scrapy.middleware] INFO: Enabled spider middlewares:
    ['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware',
     'scrapy.spidermiddlewares.offsite.OffsiteMiddleware',
     'scrapy.spidermiddlewares.referer.RefererMiddleware',
     'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware',
     'scrapy.spidermiddlewares.depth.DepthMiddleware']
    2017-12-12 15:54:18 [scrapy.middleware] INFO: Enabled item pipelines:
    ['redisClawerSlaver.pipelines.ExamplePipeline',
     'scrapy_redis.pipelines.RedisPipeline']
    2017-12-12 15:54:18 [scrapy.core.engine] INFO: Spider opened
    2017-12-12 15:54:18 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
    2017-12-12 15:55:18 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
    2017-12-12 15:56:18 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
    ステップ3:スクリプトを起動し、redisデータベースにredis_を記入します。key(start_)urls
    
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    
    import redis
    
    #  start_url    redis  redis_key ,      
    redis_Host = "172.16.1.99"
    redis_key = 'amazonCategory:start_urls'
    
    #   redis     
    rediscli = redis.Redis(host = redis_Host, port = 6379, db = "0")
    
    #   redis  requests    
    flushdbRes = rediscli.flushdb()
    print(f"flushdbRes = {flushdbRes}")
    rediscli.lpush(redis_key, https://www.baidu.com)
    这里写图片描述
    ステップ4:slaaver端の爬虫類はデータを登り始めます。ログは以下の通りです
    
    2017-12-12 15:56:18 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
    parse url = https://www.baidu.com, status = 200, meta = {'download_timeout': 25.0, 'proxy': 'http://proxy.abuyun.com:9020', 'download_slot': 'www.baidu.com', 'download_latency': 0.2569999694824219, 'depth': 7}
    parse url = https://www.baidu.com, status = 200, meta = {'download_timeout': 25.0, 'proxy': 'http://proxy.abuyun.com:9020', 'download_slot': 'www.baidu.com', 'download_latency': 0.8840000629425049, 'depth': 8}
    2017-12-12 15:57:18 [scrapy.extensions.logstats] INFO: Crawled 2 pages (at 2 pages/min), scraped 1 items (at 1 items/min)
    ステップ5:スクリプトを起動し、redisのitemsをmongodbに保存します。
    この部分のコードは、scrapy-redis分布爬虫類の構築過程(コード編)を参照してください。
    5.環境設置及びコード作成
    5.1.scrapy-redis環境インストール
    
    pip install scrapy-redis
    这里写图片描述 
    这里写图片描述
    コードの位置:後でカスタマイズができます。
    这里写图片描述 
    5.2.scrapy-redis分布型爬虫類の編纂
    第一歩は、公式サイトの例示的なコードをダウンロードする。アドレス:https://github.com/rmax/scrapy-redis(gitをインストールする必要がある)
    
    git clone https://github.com/rmax/scrapy-redis.git
    这里写图片描述
    公式サイトでは、Spider+redisとCrawlSpider+redisをそれぞれ引き継ぐ2つの例示的なコードを提供しています。
    这里写图片描述
    第二のステップは、公式サイトが提供する例示的なコードに従って修正される。
    ここで、scrapy-redisの分布型爬虫類の構築過程(理論編)についての記事を紹介します。もっと関連したscrapy redisの分布型爬虫類の構築内容は以前の文章を検索してください。または次の関連記事を引き続きご覧ください。これからもよろしくお願いします。