查看: 289|回复: 0

scrapy框架中多个spider,tiems,pipelines的使用及运行方法

[复制链接]
发表于 2020-2-27 15:05:08 | 显示全部楼层 |阅读模式
用scrapy只创建一个项目,创建多个spider,每个spider指定items,pipelines.启动爬虫时只写一个启动脚本就可以全部同时启动。
本文代码已上传至github,链接在文未。
一,创建多个spider的scrapy项目
  1. scrapy startproject mymultispider cd mymultispider scrapy genspider myspd1 sina.com.cn scrapy genspider myspd2 sina.com.cn scrapy genspider myspd3 sina.com.cn
复制代码
二,运行方法
1.为了方便观察,在spider中分别打印相关信息
  1. import scrapy class Myspd1Spider(scrapy.Spider):     name = 'myspd1'     allowed_domains = ['sina.com.cn']     start_urls = ['http://sina.com.cn/']
  2.     def parse(self, response):         print('myspd1')
复制代码
其他如myspd2,myspd3分别打印相关内容。
2.多个spider运行方法有两种,第一种写法比力简朴,在项目目次下创建crawl.py文件,内容如下
  1. from scrapy.crawler import Crawlerprocess from scrapy.utils.project import get_project_settings  process = CrawlerProcess(get_project_settings())  # myspd1是爬虫名 process.crawl('myspd1') process.crawl('myspd2') process.crawl('myspd3')  process.start()
复制代码
为了观察方便,可在settings.py文件中限定日志输出
  1. LOG_LEVEL = 'ERROR'
复制代码
右键运行此文件即可,输出如下

  
  
  3.第二种运行方法为修改crawl源码,可以从官方的github中找到:https://github.com/scrapy/scrapy/blob/master/scrapy/commands/crawl.py
在spiders目次的同级目次下创建一个mycmd目次,并在该目次中创建一个mycrawl.py,将crawl源码复制进来,修改此中的run方法,改为如下内容
  1. def run(self, args, opts):     # 获取爬虫列表     spd_loader_list = self.crawler_process.spider_loader.list()     # 遍历各爬虫     for spname in spd_loader_list or args:         self.crawler_process.crawl(spname, **opts.spargs)         print("此时启动的爬虫:" + spname)     self.crawler_process.start()
复制代码
在该文件的目次下创建初始化文件__init__.py
完成后机构目次如下

  
  使用下令启动爬虫
  1. scrapy mycrawl --nolog
复制代码
输出如下:

  
  
三,指定items
1,这个比力简朴,在items.py文件内创建相应的类,在spider中引入即可
items.py
  1. 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
  1. # -*- 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文件内:
  1. 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文件开启管道
  1. ITEM_PIPELINES = {    # 'mymultispider.pipelines.MymultispiderPipeline': 300,    'mymultispider.pipelines.Myspd1spiderPipeline': 300,    'mymultispider.pipelines.Myspd2spiderPipeline': 300,    'mymultispider.pipelines.Myspd3spiderPipeline': 300, }
复制代码
1.2spider中设置管道,例myspd1
  1. # -*- 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
复制代码
指定管道的代码
  1. custom_settings = {         'ITEM_PIPELINES': {'mymultispider.pipelines.Myspd1spiderPipeline': 300},     }
复制代码
1.3运行crawl文件,运行效果如下

  
  2,方法二,在pipelines.py文件内判断是哪个爬虫的效果
2.1 pipelines.py文件内
  1. 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这个管道文件
  1. ITEM_PIPELINES = {    'mymultispider.pipelines.MymultispiderPipeline': 300,    # 'mymultispider.pipelines.Myspd1spiderPipeline': 300,    # 'mymultispider.pipelines.Myspd2spiderPipeline': 300,    # 'mymultispider.pipelines.Myspd3spiderPipeline': 300, }
复制代码
2.3spider中屏蔽掉指定pipelines的相关代码
  1. # -*- 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
  

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?用户注册

x

相关技术服务需求,请联系管理员和客服QQ:2753533861或QQ:619920289
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

帖子推荐:
客服咨询

QQ:2753533861

服务时间 9:00-22:00

快速回复 返回顶部 返回列表