2015-08-13 112 views
0

我查詢了CrawlSpiderScrapy - 更改規則蜘蛛開始爬

我明白了鏈接提取rules是一個靜態變量之後,

我可以改變rules在運行時說,像

@classmethod 
def set_rules(cls,rules): 
cls.rules = rules 

通過

self.set_rules(rules) 

這是CrawlSpider的可接受的做法嗎?如果沒有,請建議適當的方法

我的使用情況下,

我使用scrapy抓取某些類別的特定網站的A,B,C ....ž。每個類別有1000個鏈接分佈在10個頁面上

當scrapy在某個類別中「太舊」時觸及鏈接。我希望抓取工具僅針對該類別停止跟蹤/抓取剩餘的10個頁面,因此我需要動態改變規則。

請指出我在正確的方向。

謝謝!

回答

1

我建議你寫你自己的自定義下載中間件。這些將允許您過濾掉那些您不再想要的請求。

約Scrapy的架構概述更多細節可以找到這裏:http://doc.scrapy.org/en/master/topics/architecture.html

而關於下載的中間件以及如何編寫自定義一個:http://doc.scrapy.org/en/master/topics/downloader-middleware.html

+0

這有幫助,謝謝:)雖然我仍然想知道.. scrapy允許在抓取過程中添加新規則嗎?像上面的方法? – wolfgang

1

在蜘蛛的規則並不意味着是動態更改。它們是在CrawlSpider實例化時編譯的。您可以隨時更改您的spider.rules並重新運行spider._compile_rules(),但我建議不要這樣做。

這些規則爲Crawler創建了一組指令,用於排隊爬取(即隊列爲Requests)。這些請求在派發之前不會重新評估和重新評估,因爲規則並非「設計」可以改變。所以,即使你動態改變了規則,你仍然可能會做出一堆你不打算的請求,並且仍然抓取你不想要的一堆內容。例如,如果您的目標頁面設置爲「Category A」的頁面包含指向「Category A」的頁面1至10的鏈接,那麼Scrapy將排隊請求所有這10個頁面。如果頁面2中的條目「太舊」,則更改規則將不會執行任何操作,因爲對3-10頁的請求已排入

正如@ imx51所說,編寫Downloader Middleware會好得多。這些應用程序可以刪除每個不再需要的請求,因爲它們在下載之前會觸發每個請求。