在Scrapy中依次运行多个爬虫程序

4

我正在尝试找到一种同时运行多个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个。

我不太确定该如何解决这个问题,所以如果您有任何想法可以指导我,就请提交您的答案 :)

如果需要从我这里获取更多信息才能得到帮助,请告诉我,我会编辑我的帖子并添加进去。


2
尝试使用“线程”同时创建多个进程。 - user2961646
1个回答

1

在使用 subprocess 和 spider 参数方面有什么问题吗?在您的示例中,如果您有多核 CPU,则使用单个进程处理所有蜘蛛是浪费的。

Subprocess 还有一种方法可以 确定进程何时完成

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

我能想到的第三种方式是使用 Scrapy 信号, 我认为 engine_stopped 是您要找的信号。


因为子进程会占用大量内存,所以我们使用了Twisted。它应该能够处理并发IO... 这也是它的全部目的。 - Chris
@Chris 我不知道你在蜘蛛程序里运行了什么。但正常的蜘蛛程序不应该超过100MB。无论如何,这里是更新后的文档链接:http://doc.scrapy.org/en/master/topics/practices.html#running-multiple-spiders-in-the-same-process - nramirezuy
哦不,它远远低于100 MB...如果是100 MB,我会遇到严重麻烦的!为每个抓取生成子进程仍然相当笨重。 - Chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接