首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Scrapy中顺序运行多个爬虫

在Scrapy中顺序运行多个爬虫
EN

Stack Overflow用户
提问于 2014-11-28 02:07:25
回答 1查看 2.5K关注 0票数 4

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

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

代码语言:javascript
运行
复制
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循环

代码语言:javascript
运行
复制
while True:
    if active_crawler_number < 10:
        start_the_next_crawler()#
    time.sleep(60)

我知道我可以这样做:

代码语言:javascript
运行
复制
self.crawler.signals.connect(self.next_site, signal=spider_closed)

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

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

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

EN

回答 1

Stack Overflow用户

发布于 2014-11-28 03:47:37

使用子进程和爬行器参数有什么问题?在您的示例中,您对所有爬行器使用单个进程,如果您有一个多核cpu,这将是一种浪费。

子进程也有一种determine when the process is done的方法。

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

我能想到的第三种方式是使用Scrapy signals,我认为engine_stopped就是你想要的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27176700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档