我试图找出一种同时运行多个 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 个。

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

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

最佳答案

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

Subprocess 也有一种方法 determine when the process is done

另一种方法是使用 Scrapyd 。该项目功能正常,但我们正在寻找新的维护者。

我能想到的第三种方法是使用 Scrapy signals ,我认为 engine_stopped 是您正在寻找的方法。

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

10-12 14:01