我试图找到一种同时运行多个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个。
我不确定解决这个问题的最佳方法是什么,所以如果你知道我应该走哪条路,请提交答案:)
如果我需要更多信息以便能够获得帮助,请告诉我我将编辑我的帖子并将其添加进来。
答案 0 :(得分:1)
使用子进程和蜘蛛参数有什么问题?在您的示例中,您对所有蜘蛛使用单个进程,如果您拥有多核CPU,这将是一种浪费。
子流程还可以determine when the process is done。
另一种方法是使用Scrapyd。该项目功能齐全,但我们正在寻找新的维护者。
我能想到的第三种方法是使用Scrapy signals,我认为engine_stopped
就是你要找的那个。