scrapyフレームワーク複数のクモ、tiems、パイプライン及び使用の動作方法

Scrapyは、複数のクモ、各クモ指定した項目、パイプラインを作成し、一つだけのアイテムを使用して作成。ちょうどあなたがクロール同時に、すべてのスタートを開始することができ、スタートアップスクリプトを書きます。

本稿では、コードはgithubのにアップロードされた、テキストでリンクしていません。

まず、複数のクモのscrapyプロジェクトを作成します

scrapy startprojectのmymultispider 
CD mymultispider 
scrapy genspider myspd1 sina.com.cn 
scrapy genspider myspd2 sina.com.cn 
scrapy genspider myspd3 sina.com.cn

第二に、操作の方法

観察、クモのそれぞれにおける印刷関連情報を容易にするために1

インポートscrapyの
 クラスMyspd1Spider(scrapy.Spider): = ' myspd1 ' 
    allowed_domains = [ ' sina.com.cn ' ] 
    start_urls = [ ' http://sina.com.cn/ ' ] 

DEF 構文解析(自己、応答): 印刷' myspd1 '

このようmyspd2など他のものは、myspd3は、印刷関連のコンテンツです。

最初の比較的単純な書か2.クモランつ以上の方法で、以下のように、プロジェクトディレクトリにcrawl.pyファイルを作成します

scrapy.crawler インポートCrawlerProcess
 から scrapy.utils.project インポートget_project_settingsが

処理 = CrawlerProcess(get_project_settings()) 

myspd1是爬虫名 
process.crawl(' myspd1 ' 
process.crawl(' myspd2 ' 
process.crawl(' myspd3 ' 

process.start()

観測便宜上、出力がログファイルに定義することができsettings.py

LOG_LEVEL = ' ERROR '

次のように右実行し、このファイルを出力することができます

 

 

 前記操作の第二の方法は、公式githubの中に見出すことができるクロールソースコードを変更することである。https://github.com/scrapy/scrapy/blob/master/scrapy/commands/crawl.py

以下に、同じディレクトリスパイダーにディレクトリを作成するディレクトリのMycmd、このディレクトリでmycrawl.pyを作成し、クロール源、前記修飾された実行方法でコピー

DEF RUN(セルフ、引数、OPTS):
    爬虫類の取得リスト 
    spd_loader_list = self.crawler_process.spider_loader.list()
    各爬虫類横断
    のため SPNameの spd_loader_list または引数:
        self.crawler_process.crawl(SPName、 ** opts.spargs)
         印刷" 爬虫類の起動:" + SPName)
    self.crawler_process.start()

ファイルのディレクトリに__init__.py初期化ファイルを作成します。

次の機関カタログの完了後

 

 クローラを起動するコマンドを使用します

scrapy mycrawl --nolog

次のように出力されます。

 

 

第三に、指定されたアイテム

図1は、これは比較的単純で、クモの導入部で、items.pyファイルに対応するクラスを作成します

items.py

import scrapy


class MymultispiderItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    pass

class Myspd1spiderItem(scrapy.Item):
    name = scrapy.Field()

class Myspd2spiderItem(scrapy.Item):
    name = scrapy.Field()

class Myspd3spiderItem(scrapy.Item):
    name = scrapy.Field()

spider内,例myspd1

# -*- coding: utf-8 -*-
import scrapy
from mymultispider.items import Myspd1spiderItem

class Myspd1Spider(scrapy.Spider):
    name = 'myspd1'
    allowed_domains = ['sina.com.cn']
    start_urls = ['http://sina.com.cn/']

    def parse(self, response):
        print('myspd1')
        item = Myspd1spiderItem()
        item['name'] = 'myspd1的pipelines'
        yield item

四,指定pipelines

1,这个也有两种方法,方法一,定义多个pipeline类:

pipelines.py文件内:

class Myspd1spiderPipeline(object):
    def process_item(self,item,spider):
        print(item['name'])
        return item

class Myspd2spiderPipeline(object):
    def process_item(self,item,spider):
        print(item['name'])
        return item

class Myspd3spiderPipeline(object):
    def process_item(self,item,spider):
        print(item['name'])
        return item

1.1settings.py文件开启管道

ITEM_PIPELINES = {
   # 'mymultispider.pipelines.MymultispiderPipeline': 300,
   'mymultispider.pipelines.Myspd1spiderPipeline': 300,
   'mymultispider.pipelines.Myspd2spiderPipeline': 300,
   'mymultispider.pipelines.Myspd3spiderPipeline': 300,
}

1.2spider中设置管道,例myspd1

# -*- coding: utf-8 -*-
import scrapy
from mymultispider.items import Myspd1spiderItem

class Myspd1Spider(scrapy.Spider):
    name = 'myspd1'
    allowed_domains = ['sina.com.cn']
    start_urls = ['http://sina.com.cn/']
    custom_settings = {
        'ITEM_PIPELINES': {'mymultispider.pipelines.Myspd1spiderPipeline': 300},
    }

    def parse(self, response):
        print('myspd1')
        item = Myspd1spiderItem()
        item['name'] = 'myspd1的pipelines'
        yield item

指定管道的代码

custom_settings = {
        'ITEM_PIPELINES': {'mymultispider.pipelines.Myspd1spiderPipeline': 300},
    }

1.3运行crawl文件,运行结果如下

 

 2,方法二,在pipelines.py文件内判断是哪个爬虫的结果

2.1 pipelines.py文件内

class MymultispiderPipeline(object):
    def process_item(self, item, spider):
        if spider.name == 'myspd1':
            print('myspd1的pipelines')
        elif spider.name == 'myspd2':
            print('myspd2的pipelines')
        elif spider.name == 'myspd3':
            print('myspd3的pipelines')
        return item

2.2 settings.py文件内只开启MymultispiderPipeline这个管道文件

ITEM_PIPELINES = {
   'mymultispider.pipelines.MymultispiderPipeline': 300,
   # 'mymultispider.pipelines.Myspd1spiderPipeline': 300,
   # 'mymultispider.pipelines.Myspd2spiderPipeline': 300,
   # 'mymultispider.pipelines.Myspd3spiderPipeline': 300,
}

2.3spider中屏蔽掉指定pipelines的相关代码

# -*- coding: utf-8 -*-
import scrapy
from mymultispider.items import Myspd1spiderItem

class Myspd1Spider(scrapy.Spider):
    name = 'myspd1'
    allowed_domains = ['sina.com.cn']
    start_urls = ['http://sina.com.cn/']
    # custom_settings = {
    #     'ITEM_PIPELINES': {'mymultispider.pipelines.Myspd1spiderPipeline': 300},
    # }

    def parse(self, response):
        print('myspd1')
        item = Myspd1spiderItem()
        item['name'] = 'myspd1的pipelines'
        yield item

2.4 运行crawl.py文件,结果如下

 

 

代码git地址:https://github.com/terroristhouse/crawler

 

python系列教程:

链接:https://pan.baidu.com/s/10eUCb1tD9GPuua5h_ERjHA 

提取码:h0td 

 

 

おすすめ

転載: www.cnblogs.com/nmsghgnv/p/12369656.html