我正在尝试使用基于官方文档中提供的代码的 Python 脚本运行多个蜘蛛。我的scrapy项目包含多蜘蛛(Spider1、Spider2等),它抓取不同的网站并将每个网站的内容保存在不同的JSON文件(output1.json、output2.json等)中。
在不同网站上收集的项目共享相同的结构,因此蜘蛛使用 相同的项目、管道和设置类 。输出由管道中的自定义 JSON 类生成。
当我单独运行蜘蛛时,它们会按预期工作,但是当我使用下面的脚本通过 scrapy API 运行蜘蛛时,项目会在管道中混合。 Output1.json 应该只包含 Spider1 抓取的项目,但它也包含 Spider2 的项目。如何使用相同的项目、管道和设置,但生成单独的输出,使用scrapy API 抓取多个蜘蛛?
这是我用来运行多个蜘蛛的代码:
import scrapy
from scrapy.crawler import CrawlerProcess
from web_crawler.spiders.spider1 import Spider1
from web_crawler.spiders.spider2 import Spider2
settings = get_project_settings()
process = CrawlerProcess(settings)
process.crawl(Spider1)
process.crawl(Spider2)
process.start()
示例 output1.json:
{
"Name": "Thomas"
"source": "Spider1"
}
{
"Name": "Paul"
"source": "Spider2"
}
{
"Name": "Nina"
"source": "Spider1"
}
示例 output2.json:
{
"Name": "Sergio"
"source": "Spider1"
}
{
"Name": "David"
"source": "Spider1"
}
{
"Name": "James"
"source": "Spider2"
}
正常情况下,spider1("source":"Spider1")抓取到的名字都在output1.json中,spider2抓取到的名字("source":"Spider2")都在output2.json中
感谢您的帮助!
最佳答案
根据 docs 要在同一进程上按顺序运行蜘蛛,您必须链接 deferreds 。
试试这个:
import scrapy
from scrapy.crawler import CrawlerRunner
from web_crawler.spiders.spider1 import Spider1
from web_crawler.spiders.spider2 import Spider2
settings = get_project_settings()
runner = CrawlerRunner(settings)
@defer.inlineCallbacks
def crawl():
yield runner.crawl(Spider1)
yield runner.crawl(Spider2)
reactor.stop()
crawl()
reactor.run()
关于python - Scrapy:抓取共享相同项目、管道和设置但具有不同输出的多个蜘蛛,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45309220/