我正在试图找出一种同时运行多个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)
但是这样,它会暂停程序,直到爬虫程序完成,所以我一次只能启动一个爬虫程序,而不是10个。
我真的不确定解决这个问题的最好方法是什么,所以如果你知道我应该走哪条路,请提交你的答案:)
如果需要我提供更多信息才能获得帮助,请让我知道我将编辑我的帖子并添加到其中。
发布于 2014-11-28 03:47:37
使用子进程和爬行器参数有什么问题?在您的示例中,您对所有爬行器使用单个进程,如果您有一个多核cpu,这将是一种浪费。
子进程也有一种determine when the process is done的方法。
另一种方法是使用Scrapyd。该项目是功能性的,但我们正在寻找新的维护者。
我能想到的第三种方式是使用Scrapy signals,我认为engine_stopped
就是你想要的。
https://stackoverflow.com/questions/27176700
复制相似问题