2019独角兽企业重金招聘Python工程师标准>>>

scrapy爬虫的运行通常是通过scrapy crawl spidername 一个个运行的,如有多个spider文件需要批量运行,常见的有两种方法:
1、使用CrawlProcess实现
2、使用修改crawl源码+自定义命令的方式实现

本文主要讲一下方法2的实现。
思路:1、根据scrapy中crawl命令的源码,进行相应的修改,并写一个自己的python文件,相当于定义了一个新命令。
      2、还需要使用scrapy添加自定义命令的功能为我们所写的代码添加一个自定义命令,然后就可以根据这个自定义命令,运行多个爬虫文件了。

1、首先创建一个scrapy项目,并在该项目中创建多个爬虫文件。
    创建scrapy项目mymultispider
    scrapy startproject mymultispider
    创建三个spider文件myspd1, myspd2, myspd3
    scrapy gensipder -t basic myspd1 sina.com.cn
    scrapy gensipder -t basic myspd2 sina.com.cn
    scrapy gensipder -t basic myspd3 sina.com.cn
    
2、修改crawl源码
    查看Crawl源码(可以从scrapy官方的github项目中找到:https://github.com/scrapy/scrapy/blob/master/scrapy/commands/crawl.py),发现crawl命令的源码文件中,
    Command类下面的run()方法中指定了要运行哪些爬虫文件,具体通过crawler_process.crawl(spname, **opts.spargs)实现爬虫文件的运行,spname指的是爬虫名。
    所以,我们要实现一次运行多个爬虫文件,关键是需要修改run()方法。同时,我们还需要通过crawler_process.spider_loader.list()实现获取所有的爬虫文件。
    根据此思路,我们可以修改crawl命令的源码来建立自己的自定义命令所对应的python源码。
    
    a、在spiders目录的同级目录下创建一个mycmd目录,并在该目录中创建一个mycrawl.py,将crawl源码复制过来,修改run()方法。
    源码中的run()方法:
        def run(self, args, opts):
            if len(args) < 1:
                raise UsageError()
            elif len(args) > 1:
                raise UsageError('running "scrapy crawl" with more than one spider is no longer supported')
            spname = args[0]
            
            self.crawler_process.crawl(spname, **opts.spargs) #运行爬虫
            self.crawler_process.start()
    修改为:
        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()
                
    在run()方法中先获取爬虫列表,然后再依次通过for循环遍历各爬虫,遍历时使用crawler_process.crawl()运行当前得到的spider爬虫文件,并输出当前爬虫文件的信息,便于调试与观察。
    最后,在该文件的同级目录下添加一个初始化文件__init__.py 。
    
    
    b、通过需要添加一个自定义命令。
        可以在项目配置文件(setting.py)中进行相应配置,格式:"COMMANDS_MODULE='项目核心目录.自定义命令源码目录'",具体如下:
            COMMANDS_MODULE = 'mymultispd.mycmd'
        随后,在命令行中进入该项目所在目录,并输入scrapy -h,可以查看是否有命令mycrawl 。如果有,就可以使用自定义命令mycrawl启动所有爬虫文件了。

转载于:https://my.oschina.net/u/3767248/blog/1790432

scrapy同时运行多个spider相关推荐

  1. Python爬虫:scrapy 的运行流程和各模块的作用

    scrapy的运行流程 爬虫 -> 起始URL封装Request -> 爬虫中间件 -> 引擎 -> 调度器(Scheduler): 缓存请求, 请求去重 调度器 -> ...

  2. Python3.7 Scrapy crawl 运行出错解决方法

    Python3.7 Scrapy crawl 运行出错解决方法 参考文章: (1)Python3.7 Scrapy crawl 运行出错解决方法 (2)https://www.cnblogs.com/ ...

  3. PHP如何启动scrapy,python,_新手Scrapy爬虫运行问题,python - phpStudy

    新手Scrapy爬虫运行问题 新人刚开始学习Scrapy,成功安装Scrapy,运行第一个程序还是报错,望高手帮忙解答,感激不尽 错误提示 Traceback (most recent call la ...

  4. Scrapy:运行爬虫程序的方式

    Windows 10家庭中文版,Python 3.6.4,Scrapy 1.5.0, 在创建了爬虫程序后,就可以运行爬虫程序了.Scrapy中介绍了几种运行爬虫程序的方式,列举如下: -命令行工具之s ...

  5. 解决scrapy爬虫框架多个spider指定pipeline

    现在来看一个问题:当存在多个爬虫的时候如何指定对应的管道呢? 这里定义了两个爬虫:film.meiju 1.首先想到settings设置文件. settings里针对item_pipelines的设置 ...

  6. Scrapy框架(二)——Spider

    这里我将spiders的意思理解为在项目Spiders目录下创建的各个py文件(除__init__).它们的作用是负责网页的抓取逻辑,以及数据的解析逻辑.所以Spider是Scrapy爬虫中相对核心的 ...

  7. scrapy没有运行结果_关于Scrapy爬虫项目运行和调试的小技巧(下篇)

    前几天给大家分享了关于Scrapy爬虫项目运行和调试的小技巧上篇,没来得及上车的小伙伴可以戳超链接看一下.今天小编继续沿着上篇的思路往下延伸,给大家分享更为实用的Scrapy项目调试技巧. 三.设置网 ...

  8. Scrapy Crawl 运行出错 AttributeError: 'xxxSpider' object has no attribute '_rules' 的问题解决...

    按照官方的文档写的demo,只是多了个init函数,最终执行时提示没有_rules这个属性的错误日志如下: ......File "C:\ProgramData\Anaconda3\lib\ ...

  9. scrapy组件、中间件、spider中类方法from_crawler的作用

    @classmethod def from_crawler(cls, crawler, *args, **kwargs):spider = cls(*args, **kwargs)spider._se ...

最新文章

  1. 全球5G专利能力榜T0P15出炉:谁是冠军?
  2. 视觉库—OpenCV
  3. 非涉密计算机检查的通知,关于开展非涉密计算机及可移动存储介质专项清理活动的紧急通知...
  4. Mine Sweeper II
  5. 可以在循环体内声明局部变量吗?
  6. 比特币的缺陷以及改进
  7. 【linux】Linux配置环境变量
  8. 关于微信支付接口,curl错误代码58
  9. Servlet doGet doPost 中获取参数 中文乱码
  10. word文字校对工具_如何在Word中使用校对面板
  11. 无标度网络(scale-free network)
  12. 网页设计css入门,网页设计基础:Div+CSS布局入门教程
  13. linux文件夹压缩与分卷压缩
  14. Python办公自动化实战 01 | Python优势与自动化思维让你的工作化繁为简
  15. 机顶盒播放流媒体服务器的文件,IPTV机顶盒的流媒体播放器设计
  16. 解决百度网盘登录安全验证显示空白页
  17. sudo rosdep init找不到命令或失败解决办法
  18. redis命令之string类型incr/decr命令用法详情
  19. pyside2 系列之介绍,安装,简单例子
  20. tensorflow2.0 预测新文本(一)

热门文章

  1. 对比Compose 、kotlin、flutter 移动端跨平台的未来。
  2. Android 颜色设置:透明度换算
  3. Linux中ELF格式 可执行文件+动态链接器 的加载
  4. 【Redis】17.Cluster集群结构搭建
  5. 15-垃圾回收相关算法
  6. maven(android-maven-plugin3.8.0)打包apk无法启动,apklib依赖包的资源索引出错(R文件与主模块冲突)问题解析
  7. Weka java.lang.reflect.InvocationTargetException
  8. html5-6 Frame框架窗口类型
  9. 关于如何正确地在android项目中添加第三方jar包
  10. Sharepoint学习笔记—Site Definition系列-- 5、List Definition与List Template之比较