gpt4 book ai didi

python - 在 Scrapy 中顺序运行多个爬虫

转载 作者:太空宇宙 更新时间:2023-11-03 11:51:13 25 4
gpt4 key购买 nike

我正在尝试找出一种同时运行多个 Scrapy 爬虫而不会遇到内存问题等的方法。

目前,这是我的运行脚本:

from twisted.internet import reactor
from scrapy.crawler import Crawler
from scrapy import log
from CSTest.spiders.CStest import MySpider
from scrapy.utils.project import get_project_settings


def setup_crawler(urls):
spider = MySpider(urls=urls)
settings = get_project_settings()
crawler = Crawler(settings)
crawler.configure()
crawler.crawl(spider)
crawler.start()

filename_ = raw_input("Enter filename of seed list: ") # Enter name of list of seed sites separated by newline
log.start()


with open(filename_, "r") as starturlfile:
urls = [x.strip() for x in starturlfile.readlines()] # Put urls into a list

for domain in urls:
setup_crawler([domain]) # Setup a crawler for each domain in seedlist




reactor.run() # Start reactor

这会加载种子站点列表并为每个站点启动爬虫。这工作正常,但是如果我有一个包含 100 多个站点的种子列表,它将崩溃,因为它无法同时处理运行 100 多个爬虫。

为了解决这个问题,我希望能够一次运行 10 个爬虫,依次遍历种子列表,直到爬完所有 100 多个域。

我需要以某种方式检测爬虫何时完成,以便我可以在该位置启动另一个爬虫。

是否有一个函数可以找出有多少活跃的爬虫?所以我可以像这样放一个 while 循环

while True:
if active_crawler_number < 10:
start_the_next_crawler()#
time.sleep(60)

我知道我可以做类似的事情:

self.crawler.signals.connect(self.next_site, signal=spider_closed)

但是,它会暂停程序,直到爬虫完成,所以我一次只能启动 1 个爬虫,而不是 10 个。

我不太确定解决这个问题的最佳方法是什么,所以如果您知道我应该走哪条路,请提交您的答案:)

如果需要我提供更多信息才能获得帮助,请告诉我我将编辑我的帖子并将其添加。

最佳答案

使用 subprocess 和 spider 参数有什么问题?在您的示例中,您为所有蜘蛛使用了一个进程,如果您有一个多核 cpu,这是一种浪费。

子进程也有办法determine when the process is done .

另一种方法是使用 Scrapyd .该项目可以正常运行,但我们正在寻找新的维护者。

我能想到的第三种方法是使用 Scrapy signals ,我认为 engine_stopped 就是您要找的那个。

关于python - 在 Scrapy 中顺序运行多个爬虫,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27176700/

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