【问题标题】:Run Multiple Spider sequentially顺序运行多个蜘蛛
【发布时间】:2016-03-20 01:50:40
【问题描述】:
Class Myspider1
#do something....

Class Myspider2
#do something...

以上是我的 spider.py 文件的架构。我试图先运行 Myspider1,然后根据某些条件多次运行 Myspider2。我怎么能这样做???有小费吗?

configure_logging()
runner = CrawlerRunner()
def crawl():
    yield runner.crawl(Myspider1,arg.....)
    yield runner.crawl(Myspider2,arg.....)
crawl()
reactor.run()

我正在尝试使用这种方式。但不知道如何运行它。我应该在 cmd 上运行 cmd(什么命令?)还是只运行 python 文件??

非常感谢!!!

【问题讨论】:

  • 您只需运行 python 脚本本身。这就是 CrawlerProcess + CrawlerRunner 类的构建目的。但请明确你所说的条件。这些条件是在运行脚本之前定义的,还是在第一个 Spider 类的运行期间/从运行中检索到这些条件?
  • 感谢回复,对于这两个蜘蛛,第一个蜘蛛Myspider1负责爬取一系列链接,第二个蜘蛛Myspider2负责爬取之前链接中缺失的链接(links在 Spider1 中使用),所以我必须先运行第一个蜘蛛,一旦它关闭,查找是否缺少任何 url,然后选择是否打开 spider2..

标签: python scrapy web-crawler scrapy-spider


【解决方案1】:

运行 python 文件
例如: test.py

import scrapy
from twisted.internet import reactor, defer
from scrapy.crawler import CrawlerRunner
from scrapy.utils.log import configure_logging

class MySpider1(scrapy.Spider):
    # Your first spider definition
    name = "dmoz"
    allowed_domains = ["dmoz.org"]
    start_urls = [
               "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/"
    ]

    def parse(self, response):
        print "first spider"

class MySpider2(scrapy.Spider):
    # Your second spider definition
    name = "dmoz"
    allowed_domains = ["dmoz.org"]
    start_urls = [
                "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
    ]

    def parse(self, response):
        print "second spider"

configure_logging()
runner = CrawlerRunner()

@defer.inlineCallbacks
def crawl():
    yield runner.crawl(MySpider1)
    yield runner.crawl(MySpider2)
    reactor.stop()

crawl()
reactor.run() # the script will block here until the last crawl call is finished

现在运行 python test.py > output.txt
您可以从 output.txt 中观察到您的蜘蛛是按顺序运行的。

【讨论】:

  • 是否可以将 crawl() 更改为 for i in range(1,10): runner.crawl(MySpider,args[i*2]) runner.crawl(MySpider,args[i* 2+1) d = runner.join() 产生 d?我想并行运行 2 个蜘蛛,但让它们按顺序运行 N 次...
  • 好吧,它确实做了一些工作(我的第一条评论)......唯一的缺点是它会等待所有“并行”任务完成,然后再执行更多“并行”任务 - 如果它经常发生一个任务比其他任务长得多,它实际上变成了顺序而不是并行......
【解决方案2】:

您需要使用process.crawl()返回的Deferred对象,它允许您在爬取完成时添加回调。

这是我的代码

def start_sequentially(process: CrawlerProcess, crawlers: list):
    print('start crawler {}'.format(crawlers[0].__name__))
    deferred = process.crawl(crawlers[0])
    if len(crawlers) > 1:
        deferred.addCallback(lambda _: start_sequentially(process, crawlers[1:]))

def main():
    crawlers = [Crawler1, Crawler2]
    process = CrawlerProcess(settings=get_project_settings())
    start_sequentially(process, crawlers)
    process.start()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-08
    • 2016-06-17
    • 1970-01-01
    相关资源
    最近更新 更多