2017-04-24 173 views
2

我一直在使用Scrapy抓取電子商務網站,抓取速度爲50〜60頁/分鐘。 我使用的8核心林德服務器與24 GB RAM,所以我不認爲網絡或服務器可能是原因。Scrapy抓取速度慢

我知道的事實,一些網站給下載等待時間,如果我們過於頻繁抓取的,但是這是一個大的網站,我使用proxymesh代理也一樣,所以這也不可能是可能的原因。

我覺得我缺少在settings.py文件的東西 -

BOT_NAME = 'scraper' 

SPIDER_MODULES = ['com.crawler.scraper.spiders'] 
NEWSPIDER_MODULE = 'com.crawler.scraper.spiders' 

ITEM_PIPELINES = { 
    'com.crawler.scraper.pipelines.generic_pipeline.Pipeline': 300 
} 
RANDOMIZE_DOWNLOAD_DELAY = False 
COOKIES_ENABLED = False 
CONCURRENT_ITEMS = 200 
CONCURRENT_REQUESTS=50 
DOWNLOAD_DELAY= 0 
CONCURRENT_REQUESTS_PER_DOMAIN=50 
LOG_LEVEL = 'ERROR' 
RETRY_TIMES = 2 
CONNECTION_TIMEOUT = 30 
USER_AGENT_LIST = 'user_agents.txt' 

DOWNLOADER_MIDDLEWARES = { 
    'random_useragent.RandomUserAgentMiddleware': 400, 
    'com.crawler.scraper.middlewares.proxy_middleware.ProxyMiddleware': 410, 
    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None, 
} 

我從DOWNLOAD_DELAY開始5,現在連我都保留了它爲0,但我仍然沒有看到任何顯著變化每分鐘的請求數。

所以,我的問題是 - >

1)我應該怎麼做才能提高到至少200請求/分鐘的速度? 2)什麼應該是CONCURRENT_ITEMS的理想值?

+0

單頁面的平均響應時間是多少? 50-60rpm對於單個客戶來說已經是重要的負載。 – jordanm

+0

但是,如果我使用的是動態代理,網站無法識別請求來自同一個客戶端,並且網站是亞馬遜,而且我看到其他人以更高的速度爬行,@jordanm – sagar

+0

[AutoThrottle擴展](https://docs.scrapy.org/en/latest/topics/autothrottle.html)開啓還是關閉?你可以禁用它並檢查它是否有任何區別。 –

回答

1

CONCURRENT_ITEMS絕對不是解決方案,因爲此設置僅影響服務器上使用的處理時間,並且您的服務器規格根本不應有所作爲。

除了您的設置看起來不錯,您的刮板應該儘可能快地響應。 (即使將DOWNLOAD_DELAY增加到1,刮板將有可能每分鐘執行50×60 = 3000個請求)

哦和RANDOMIZE_DOWNLOAD_DELAY也應該設置爲True,這是可以肯定的。

根據您使用的代理數量,目標站點很可能會限制您的刮板。

以目前的速度,如果使用ProxyMesh的最小20 IP計劃,您將每隔20秒從同一IP點擊該網站。如果使用他們的100 IP計劃,您仍然會每隔100-120秒發送一次來自每個IP的請求。

長時間這樣做很快就會讓您的ProxyMesh IP受到限制。此外,我會推測你的刮刀開始時速度更快,然後因此而受到抑制。

方法來檢查我的理論:要麼增加更多的IP地址,速度應該相應增加,要麼等待24小時,直到ProxyMesh爲您分配新的IP,然後再次運行scraper,並觀察它是否啓動速度更快然後受到抑制。

+0

只是爲了闡明更多的東西,我使用的是proxymesh世界代理,它提供了非常大量的IP(不確定的數字)。 – sagar

+0

據我瞭解proxymesh的價格結構,他們每天限制您的IP數量,並在24小時後將其旋轉出去。因此,proxymesh世界代理的全部15k IP中只有一小部分將在一天內提供給您(除非您已註冊一些非官方計劃,但他們未在其網站上列出) – rrschmidt