gpt4 book ai didi

python - Scrapy:爬取共享相同项目、管道和设置但具有单独输出的多个蜘蛛

转载 作者:太空宇宙 更新时间:2023-11-04 02:45:15 24 4
gpt4 key购买 nike

我正在尝试使用基于官方文档中提供的代码的 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中

感谢您的帮助!

最佳答案

第一个问题是蜘蛛在同一个进程中运行。通过链接 deferreds 顺序运行蜘蛛解决了这个问题:

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

#spiders
from web_crawler.spiders.spider1 import Spider1
from web_crawler.spiders.spider2 import Spider2

configure_logging()
settings = get_project_settings()
runner = CrawlerRunner(settings)

@defer.inlineCallbacks
def crawl():
yield runner.crawl(Spider1)
yield runner.crawl(Spider2)
reactor.stop()

crawl()
reactor.run()

我的管道中还有第二个错误:我没有在 close_spider 时清除我的结果列表。因此,spider2 将项目添加到已经包含 spider1 的项目的列表中。

class ExportJSON(object):

results = []

def process_item(self, item, spider):

self.results.append(dict(item))
return item

def close_spider(self, spider):

file = open(file_name, 'w')
line = json.dumps(self.results)
file.write(line)
file.close()

self.results.clear()

谢谢!

关于python - Scrapy:爬取共享相同项目、管道和设置但具有单独输出的多个蜘蛛,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45309220/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com