[Scrapyフレームワークはscrapy-のRedisに基づいて実装分散爬虫類] --2019-08-07 10時14分58秒

オリジナル:http://106.13.73.98/__/26/

Scrapy分散フレームワークは、2つの理由のために、独自のを達成することはできません

  1. それは、複数のマシンを割り当てることができない可能のでScrapyは、それぞれ独自のスケジューラを持つ複数のマシンに展開されstart_urlsたURLのリストを、つまり、複数のマシンが同じスケジューラを共有することはできません
  2. 複数のマシンパイプラインを介して永続ストレージを統一することはできませんクロールデータ、複数のマシンが同じパイプラインを共有することはできません
    ___

分散型クローラアセンブリscrapy、Redisの

インストール:pip install scrapy-redis

良いパッケージアセンブリは、複数のマシンと配管スケジューラのために共有することができ、私たちをscrapyは、Redisの、私たちは直接、分散クロールデータを実装するためにそれを使用することができます。

scrapy-Redisの共通鍵の名前

  1. 爬虫名:items タイプリスト、取得したデータの爬虫類、項目オブジェクト、JSON文字列の内容を保存します。
  2. 爬虫名:dupefilter URLクローラー用のセットタイプは、40文字の文字列のコンテンツURLハッシュ、再訪問します。
  3. 爬虫名:start_urls タイプリスト、デフォルトの共有スケジューラ名、他の名前を手動で始まるURLを書く必要があり、最初の起動時にURLクモのクロールを取得する、と指定することができます。
  4. 爬虫名:requests ZSETタイプは、スケジューリング要求のためのスケジューラは、シリアライズされた文字列のコンテンツのリクエストオブジェクトです。

手順を使用します

  1. 爬虫類の親クラスを変更し、爬虫類元のファイルベースの場合はスパイダー、親がに改正されなければならないRedisSpiderオリジナルのクローラベースのファイルならば、CrawlSpider、親クラスがに変更する必要がありRedisCrawlSpider
  2. 削除start_urlsリストと追加redis_keyスケジューラキュー名に属性scrapy-Redisのアセンブリの属性値を。
  3. 次のようにscrapy-Redisのコンポーネントにカプセル化ダクトの構成を開くために使用される構成ファイル内の設定のため。

関連

# 使用scrapy-redis组件中封装好的管道,直接将数据存入Redis中,不再需要pipelines文件
ITEM_PIPELINES = {
    'scrapy_redis.pipelines.RedisPipeline': 100
}

# 使用scrapy-redis组件的去重队列,不再使用scrapy默认的去重方式
DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter'

# 使用scrapy-redis组件的调度器,不使用默认的调度器
SCHEDULER = 'scrapy_redis.scheduler.Scheduler'

# 允许暂停,redis请求记录不会丢失
SCHEDULER_PERSIST = True
# 即:配置调度器是否允许持久化,即爬取结束后 是否清空Redis中的请求队列和去重指纹set


"""请求队列形式"""
# 1.按优先级(默认)
# SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue"
# 2.队列形式,请求先进先出
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderQueue"
# 3.栈形式,请求先进后出
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderStack"


"""连接Redis配置"""
REDIS_HOST = '9.0.0.1'  # Redis监听地址
REDIS_PORT = 6380  # Redis监听端口
REDIS_ENCODING = 'utf-8'  # 编码

# 如果你的Redis设置了连接密码:
# REDIS_PARAMS = {'password': 'Redis密码'}

開始

基づいて、最初のRedisSpider分散爬虫類:

# -*- coding: utf-8 -*-
import scrapy
from blog.items import  BlogItem
from scrapy_redis.spiders import RedisSpider  # pip install scrapy-redis


class Blog01Spider(RedisSpider):  # 更改继承类为RedisSpider
    name = 'blog01'

    # 删掉起始url列表,使用下面的redis_key
    # start_urls = ['http://www.xxx.com/']

    # 指定共享的调度器队列名称(起始url列表)
    redis_key = 'cmda'  # cmda:中国医师协会简称
    # 如果你不指定此属性,则默认的共享调度器队列名称为:blog01:start_urls

    present_page = 1  # 用于标识当前页面
    max_page = 1000  # 你想爬取多少页数据
    url = 'http://db.pharmcube.com/database/cfda/detail/cfda_cn_instrument/%d'  # 用于计算页面的url


    def parse(self, response):

        # 解析每一个页面
        item = BlogItem()
        item['num'] = response.xpath('/html/body/div/table/tbody/tr[1]/td[2]/text()').extract_first()  # 注册证编号
        item['company_name'] = response.xpath('//html/body/div/table/tbody/tr[2]/td[2]/text()').extract_first()  # 注册人名称
        item['company_address'] = response.xpath('/html/body/div/table/tbody/tr[3]/td[2]/text()').extract_first()  # 注册人住所
        
        yield item
        # 在items文件中写好要保存的字段
        # 这里会将item对象提交给scrapi-redis组件的管道

        # 下面开始递归爬取所有页面
        urls = []
        if self.present_page <= self.max_page:
            self.present_page += 1
            url = format(self.url % self.present_page)
            yield scrapy.Request(url, callback=self.parse)

# 注意修改你的配置文件,写入相关的配置

基づいて、第2、RedisCrawlSpider分散爬虫類。

# -*- coding: utf-8 -*-
import scrapy
from blog.items import ChoutiProItem
from scrapy_redis.spiders import RedisCrawlSpider  # pip install scrapy-redis
from scrapy.linkextractors import LinkExtractor
# LinkExtractor:链接提取器,用于提取起始url页面中符合匹配规则的链接
from scrapy.spiders import CrawlSpider, Rule
# CrawlSpider:是Spider的一个子类,除了继承了Spider的特性和功能外,还派生了自己独有的强大特性和功能
# Rule:规则解析器,用于将链接提取器提取到的链接对应的页面源码数据根据指定的解析方法(回调函数)进行解析


class Blog02Spider(RedisCrawlSpider):  # 更改继承类为RedisCrawlSpider
    name = 'blog02'

    # allowed_domains = ['www.xxx.com']

    # 删掉起始url列表,使用下面的redis_key
    # start_urls = ['http://www.xxx.com/']

    # 指定共享的调度器队列名称(共享的起始url列表)
    redis_key = 'chouti' # https://dig.chouti.com/r/scoff/hot
    # 如果你不指指定此属性,则默认的共享调度器队列名称为:blog01:start_urls

    # 定义链接提取规则
    link = LinkExtractor(allow=r'/r/scoff/hot/\d+')

    # 在这里定义规则解析器
    rules = (
        Rule(link, callback='parse_item', follow=True),
    )

    def parse_item(self, response):
        div_list = response.xpath('//div[@id="content-list"]/div')
        for div in div_list:
            item = ChoutiProItem()
            item['title'] = div.xpath('.//div[@class="part1"]/a/text()').extract_first()  # 段子标题
            item['author'] = div.xpath('.//div[@class="part2"]/a[4]/b/text()').extract_first()  # 段子内容
            print(item.__dict__)

            yield item
            # 在items文件中写好要保存的字段
            # 这里会将item对象提交给scrapi-redis组件的管道

# 注意修改你的配置文件,写入相关的配置

準備ができて、Redisのサーバーとクライアントを起動すると、すべての爬虫類のマシン上でコマンドを実行scrapy runspider 爬虫文件路径、実行クローラ、その後、Redisのクライアントを実行lpush redis_key属性值 起始url開始URLを渡します。この時点で、すべてのクローラは、作業を開始します。

データを正常にクロールした後、あなたはRedisのクライアントを使用することができますsmembers 爬虫名:dupefilterクロールデータを表示します。
___

他の人の行動を理解するために、すべての熱心、挙動が弱いです。強力な人々は、最初のステップは、孤独に学ぶために、第2のステップは解釈されるべきではない学ぶために、第3のステップは、圧延に結果を使用することです。さあ!

オリジナル:http://106.13.73.98/__/26/

おすすめ

転載: www.cnblogs.com/gqy02/p/11313587.html