2015-06-22 152 views
1

我正在使用scrapy從網站下載一些文章以及文章中的圖像。Scrapy - 針對不同域的不同download_delay

有關場景的一些信息:

  • 文章來自主域(jandan.net)的文章中
  • 圖片來自其他網站的鏈接。 (例如tankr.net)
  • 主域具有訪問頻率的限制,所以我必須設置download_delay避免< 403>誤差由scrapy.contrib.pipeline.images.ImagesPipeline
  • 下載好像圖像下載也由download_delay設置限制
  • 圖像

如何加速圖像下載,同時我必須限制從主域的下載速度?

+0

據我所知,沒有開箱即用的功能;也許是一些自定義的中間件? – tegancp

回答

4

沒有公共接口,它(所以我的回答可以成爲未來Scrapy版本無效),但你可以檢查執行情況的內置AutoThrottle擴展。

這是一個有點複雜,但Scrapy 1.0的想法是這樣的:有下載它處理所有的下載。決定並行發送多少個請求以及使用Downloader的延遲使用「插槽」。通過更改插槽屬性(delay,concurrency),您可以更改下載程序的行爲。默認情況下,每個域有一個插槽(或者如果設置了CONCURRENT_REQUESTS_PER_IP選項,則爲每個IP地址)。您還可以通過設置自定義request.meta['download_slot']將請求路由到任何其他插槽。對延遲和併發用於所有時隙

缺省值是使用scrapy設置或蜘蛛屬性等download_delay設置。但是您可以在運行時使用Scrapy擴展來調整它們 - 這就是AutoThrottle正在做的事情。要爲不同的請求使用不同的下載延遲,您需要在適當的插槽中更改delay屬性。

當你的請求被髮送到任務簡化不同的領域 - 的插槽已經不同,你需要找到它們並改變delay值。如果您想爲單個網站的不同部分使用不同的延遲時間,則必須使用request.meta['download_slot']來設置自定義廣告位。

對不起,我不會提供一個現成的應用實例,但希望這有助於。如果不清楚該從哪裏走,可以隨時提出更多問題。

此外,它可能只是使油門延伸的情況是所有你需要的東西,而且也沒有必要寫一個自定義擴展 - 第一次嘗試。

另外,簡單的選擇是創建2個蜘蛛,爲他們設定不同的下載延遲:第一下載頁面,並提取/存儲的圖片鏈接,第二下載圖像。

+2

謝謝!您的答案非常全面和清晰,我通過定製AuthoTrottle解決了我的計劃。這裏是我的代碼:[github](https://github.com/gavinhub/Jandan.EPUB/blob/master/PaJandan/extensions/throttle.py) –