【问题标题】:Scrapy runs all spiders at once. I want to only run one spider at a time. Scrapy crawl <spider>Scrapy 一次运行所有的蜘蛛。我想一次只运行一只蜘蛛。 Scrapy crawl <蜘蛛>
【发布时间】:2019-10-26 18:55:39
【问题描述】:

我是 Scrapy 的新手,正在尝试使用该框架。真正令人沮丧的是,当我运行“scrapy crawl (name of spider)”时,它会运行我的“spiders”文件夹中的每一个蜘蛛。所以我要么必须等待所有的蜘蛛都在运行,要么注释掉所有的蜘蛛,除了我正在使用的蜘蛛。这很烦人。我怎样才能让scrapy一次只运行一个蜘蛛?

【问题讨论】:

  • 你给你所有的蜘蛛都取了同一个名字(SpiderClass.name中定义的那个)?调用 scrapy crawl spider_name 不应同时运行多个蜘蛛。
  • 不,这就是奇怪的原因。它们的名称都不同。我检查了我的设置文件并试图查看我是否以错误的方式设置了一些东西,但我没有看到任何奇怪的东西。

标签: python-3.x web-scraping scrapy


【解决方案1】:

你可以从你的脚本(https://scrapy.readthedocs.io/en/latest/topics/practices.html#run-from-script)运行scrapy, 例如:

import scrapy
from scrapy.crawler import CrawlerProcess

class YourSpider(scrapy.Spider):
    # Your spider definition


process = CrawlerProcess()
process.crawl(YourSpider)
process.start() 

【讨论】:

    【解决方案2】:

    它不应该运行整个蜘蛛,尽管它确实编译并运行了一些东西,因为这就是它提取蜘蛛名称的方式(我认为还有其他原因,否则这似乎是一种奇怪的设置方式)。如果您发布您的蜘蛛,我们可以看到哪些可能正在运行,哪些没有。

    我遇到了同样的问题,因为我的蜘蛛修改了 csv 文件,包括重命名/删除它们,当我只想运行特定的蜘蛛时,这把事情搞砸了。我的解决方案是让蜘蛛仅在它们实际运行或关闭时才执行某些任务。此处的文档:https://docs.scrapy.org/en/latest/topics/signals.html 虽然我发现它缺乏。 这是我使用的代码。除了更改蜘蛛名称外,from_crawler 部分可以单独保留。把你想要的任何东西放在 spider_closed 部分

    @classmethod
    def from_crawler(cls, crawler, *args, **kwargs):
        spider = super(SixPMSpider, cls).from_crawler(crawler, *args, **kwargs)
        crawler.signals.connect(spider.spider_closed, signal=signals.spider_closed)
        return spider
    
    def spider_closed(self, spider):
        os.remove(self.name+'_price_list.csv')
        os.rename(self.name+'_price_list2.csv', self.name+'_price_list.csv')  
    

    【讨论】:

    • 所以问题是我有很多蜘蛛。我什至不确定我需要显示哪一个,因为整个文件夹都发生了错误。有些蜘蛛的写法与其他蜘蛛不同,但据我所知,它们没有联系。我现在正忙于另一个项目,但很快就会发布我的一些代码,也许你会看到我缺少的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多