scrapy同时运行多个spider

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启动所有爬虫文件了。

猜你喜欢

转载自my.oschina.net/u/3767248/blog/1790432