2013-04-16 33 views
4

這是少了一個「我該如何使用這些?還有更多的「何時/爲什麼我會使用這些?」類型問題。Scrapy:CrawlSpider規則process_links vs process_request vs下載中間件

編輯:這個問題是一個近似重複的this question,這表明使用下載中間件來過濾這樣的請求。更新了我的問題以反映這一點。

Scrapy CrawlSpider documentation中,規則接受兩個可調用對象process_linksprocess_request(以下引用的文檔以便於參考)。

默認情況下,Scrapy正在過濾重複的URL,但我希望對請求進行額外的過濾,因爲我得到的複製頁面有多個不同的鏈接到它們的URL。之類的東西,

URL1 = "http://example.com/somePage.php?id=XYZ&otherParam=fluffyKittens" 
URL2 = "http://example.com/somePage.php?id=XYZ&otherParam=scruffyPuppies" 

然而,這些網址會在查詢字符串類似的元素 - 上面顯示這是id

我在想,使用我的蜘蛛的process_links可調用過濾出重複的請求是有意義的。

問題:

  1. 是有一些原因process_request會更好套件,這個任務?
  2. 如果不是,您能提供一個process_request更適用的例子嗎?
  3. 下載中間件是否比process_linksprocess_request更合適?如果是這樣,你可以提供一個例子,當process_linksprocess_request將是一個更好的解決方案?

文檔引用:

process_links是一個可調用的,或一個字符串(在這種情況下,將用於從 的方法具有該名稱的蜘蛛對象),將針對每個被稱爲 使用 指定的link_extractor從每個響應中提取的鏈接列表。這主要用於過濾目的。

process_request是一個可調用的,或一個字符串(在這種情況下,從具有該名稱的蜘蛛對象的方法 將被使用),其將被稱爲與這個規則提取的每個請求 ,並且必須返回一個 請求或無(用於過濾請求)。

回答

9
  1. 沒有,process_links是您更好的選擇,這裏是因爲你只是過濾URL,將節省不必創建Requestprocess_request只是丟棄它的開銷。

  2. process_request如果你想按摩Request一點在發送前關閉,說,如果你想添加一個meta參數或者是添加或刪除標題是有用的。

  3. 您不需要任何中間件,因爲您需要的功能是直接構建到Rule中的。如果process_links未構建到規則中,那麼您需要創建自己的中間件。

+0

謝謝你的描述性答案,非常感謝! – CatShoes