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

时间:2014-11-27 18:07:25

标签: python scrapy web-crawler screen-scraping

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

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

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

1 个答案:

答案 0 :(得分:1)

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

子流程还可以determine when the process is done

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

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