2017-08-13 42 views
0

我使用他們的內部API運行scrapy,一切都很好,到目前爲止。但我注意到它沒有完全使用設置中提到的16的併發性。我已將延遲更改爲0以及我可以做的所有其他事情。但是,然後查看發送的HTTP請求,明確scrapy在所有時間點都沒有正確下載16個站點。在某個時間點,它只下載3到4個鏈接。在那個時間點隊列不是空的。Scrapy同時使用CORE系統

當我檢查覈使用,我發現是出2個核心,一個是100%,其他大多是空閒的。

這時候我才知道上邊那個扭曲庫,scrapy是構建是單線程的,這就是爲什麼它的唯一使用單核心。

有任何解決方法說服scrapy使用所有的核心是什麼?

回答

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頁,您可以添加一個startend參數檢索器類,並完成類似下面

process.crawl(YourSpider, start=0, end=50) 
process.crawl(YourSpider, start=51, end=100) 

注意,這兩個爬蟲都會有自己的設置,因此,如果您有16個請求爲您的蜘蛛設置,那麼兩者結合將有效地有32個。

在大多數情況下,抓取少於CPU和更多關於網絡訪問,實際上是非阻塞的情況下扭曲,所以我不確定這會給你一個非常大的優勢,反對在單個蜘蛛中設置CONCURRENT_REQUEST32

PS:考慮閱讀本頁面以瞭解更多https://doc.scrapy.org/en/latest/topics/practices.html#running-multiple-spiders-in-the-same-process

0

另一種選擇是使用Scrapyd運行你的蜘蛛,它可以讓你同時運行多個進程。看到documentationmax_procmax_proc_per_cpu選項。如果你不想以編程方式解決你的問題,這可能是要走的路。