问题:Scrapy:爬行多个蜘蛛共享相同的项目、管道和设置,但具有单独的输出

我正在尝试使用基于官方文档中提供的代码的 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在同一进程上按顺序运行蜘蛛,您必须链接延迟。

尝试这个:

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()
Logo

学AI,认准AI Studio!GPU算力,限时免费领,邀请好友解锁更多惊喜福利 >>>

更多推荐