我正在使用内部API运行scrapy,到目前为止一切顺利。但我注意到它没有完全使用设置中提到的16的并发性。我已将延迟更改为0以及我可以执行的所有其他操作。但随后查看正在发送的HTTP请求,显然scrapy并不是在所有时间点下载16个站点。在某些时候它只下载3到4个链接。并且队列在那个时间点不是空的。
当我检查核心用法时,我发现的是2核心中的一个,一个是100%而另一个是大部分闲置。
那时我才知道scrapy所构建的扭曲库是单线程的,这就是为什么它只使用单核。
是否有任何解决方法可以说服scrapy使用所有核心?
答案 0 :(得分:0)
Scrapy基于扭曲的框架。 Twisted是基于事件循环的框架,因此它执行计划处理而不是多处理。这就是为什么你的scrapy抓取仅在一个进程上运行的原因。现在,您可以使用以下代码在技术上启动两个蜘蛛
import scrapy
from scrapy.crawler import CrawlerProcess
class MySpider1(scrapy.Spider):
# Your first spider definition
...
class MySpider2(scrapy.Spider):
# Your second spider definition
...
process = CrawlerProcess()
process.crawl(MySpider1)
process.crawl(MySpider2)
process.start() # the script will block here until all crawling jobs are finished
并没有什么可以阻止你为这两个蜘蛛提供相同的课程。
process.crawl
方法将*args
和**kwargs
传递给您的蜘蛛。因此,您可以使用此方法对您的蜘蛛进行参数化。我们假设您的蜘蛛要抓取100页,您可以在抓取工具类中添加start
和end
参数并执行以下操作
process.crawl(YourSpider, start=0, end=50)
process.crawl(YourSpider, start=51, end=100)
请注意,这两个抓取工具都有自己的设置,因此如果您为蜘蛛设置了16个请求,则两者的合并将实际为32个。
在大多数情况下,抓取不是关于CPU而是更多关于网络访问,在扭曲的情况下实际上是非阻塞的,所以我不确定这会给你一个非常大的优势,反对将CONCURRENT_REQUEST
设置为{@ 1}}在一只蜘蛛中。
PS:请考虑阅读此页面以了解更多https://doc.scrapy.org/en/latest/topics/practices.html#running-multiple-spiders-in-the-same-process
答案 1 :(得分:0)
另一种选择是使用Scrapyd运行您的蜘蛛,它允许您同时运行多个进程。请参阅documentation中的max_proc
和max_proc_per_cpu
选项。如果您不想以编程方式解决问题,可以采用这种方式。