【问题标题】:Running Multiple spiders in scrapy for 1 website in parallel?在scrapy中同时为1个网站运行多个蜘蛛?
【发布时间】:2017-01-14 20:42:56
【问题描述】:

我想抓取一个包含 2 个部分的网站,但我的脚本没有我需要的那么快。

是否可以启动 2 个蜘蛛,一个用于抓取第一部分,第二个用于第二部分?

我尝试创建 2 个不同的类并运行它们

scrapy crawl firstSpider
scrapy crawl secondSpider

但我认为它并不聪明。

我阅读了documentation of scrapyd,但我不知道它是否适合我的情况。

【问题讨论】:

    标签: python web-scraping scrapy web-crawler scrapy-spider


    【解决方案1】:

    我认为您正在寻找的是这样的:

    import scrapy
    from scrapy.crawler import CrawlerProcess
    
    class MySpider1(scrapy.Spider):
        # Your first spider definition
        ...
    
    class MySpider2(scrapy.Spider):
        # Your second spider definition
        ...
    
    process = CrawlerProcess()
    process.crawl(MySpider1)
    process.crawl(MySpider2)
    process.start() # the script will block here until all crawling jobs are finished
    

    您可以阅读更多信息:running-multiple-spiders-in-the-same-process

    【讨论】:

    • 如果说我有 300 个蜘蛛需要运行。这个实现能坚持吗?
    • 我们也可以单独存储结果吗??
    • 此解决方案不会并行运行所有蜘蛛。蜘蛛会从最后一个到第一个运行。
    【解决方案2】:

    或者你可以这样运行,你需要将此代码保存在与scrapy.cfg相同的目录下(我的scrapy版本是1.3.3):

    from scrapy.utils.project import get_project_settings
    from scrapy.crawler import CrawlerProcess
    
    setting = get_project_settings()
    process = CrawlerProcess(setting)
    
    for spider_name in process.spiders.list():
        print ("Running spider %s" % (spider_name))
        process.crawl(spider_name,query="dvh") #query dvh is custom argument used in your scrapy
    
    process.start()
    

    【讨论】:

      【解决方案3】:

      更好的解决方案是(如果您有多个蜘蛛)它动态获取蜘蛛并运行它们。

      from scrapy import spiderloader
      from scrapy.utils import project
      from twisted.internet.defer import inlineCallbacks
      
      
      @inlineCallbacks
      def crawl():
          settings = project.get_project_settings()
          spider_loader = spiderloader.SpiderLoader.from_settings(settings)
          spiders = spider_loader.list()
          classes = [spider_loader.load(name) for name in spiders]
          for my_spider in classes:
              yield runner.crawl(my_spider)
          reactor.stop()
      
      crawl()
      reactor.run()
      

      (第二种解决方案): 因为 spiders.list() 在 Scrapy 1.4 中已弃用 Yuda 解决方案应转换为类似

      from scrapy import spiderloader    
      from scrapy.utils.project import get_project_settings
      from scrapy.crawler import CrawlerProcess
      
      settings = get_project_settings()
      process = CrawlerProcess(settings)
      spider_loader = spiderloader.SpiderLoader.from_settings(settings)
      
      for spider_name in spider_loader.list():
          print("Running spider %s" % (spider_name))
          process.crawl(spider_name)
      process.start()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-24
        • 1970-01-01
        • 2021-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多