2014-04-27 102 views
1

我正在使用scrapy抓取超過400萬個產品的產品網站。然而,在搜索大約5萬個產品後,它開始拋出500個HTTP錯誤。我已將Auto throttling設置爲false,因爲它啓用非常慢並需要大約20-25天才能完成抓取。我認爲服務器會在某段時間後暫時阻止抓取工具。任何解決方案可以做什麼? 我正在使用站點地圖爬行器 - 如果服務器沒有響應,我想從網址本身提取一些信息,並繼續下一個網址,而不是完成抓取和關閉蜘蛛,因爲我正在查看請求中的errback參數。不過,由於我使用的是站點地圖爬行器,所以我沒有明確地創建一個請求對象。是否有任何默認的errback函數可以覆蓋或我可以在哪裏定義它?做500內部服務器錯誤scrapy

另一種方式是這裏 - Scrapy:In a request fails (eg 404,500), how to ask for another alternative request?

+2

如果服務器阻止了您的搜尋器,那麼您應該尊重它。 – Mark

+0

好吧,我知道了,但你能告訴我在哪裏以及如何定義errback函數,這樣我就可以處理這個錯誤,並且我的蜘蛛沒有完成 – Parag

回答

4

HTTP 500 typically indicates an internal server error定義。當被阻止時,你很可能會看到403或404(或者302重定向到「你被阻止」的頁面)。你可能正在訪問導致某些東西破壞服務器端的鏈接。您應該存儲哪個請求導致錯誤,並嘗試自己訪問它。可能是這個網站被打破了。

Ok..i得到它,但你可以告訴在哪裏以及如何定義errback可函數,這樣我可以處理這個錯誤,我的蜘蛛不完成

I took a look at SitemapSpider不幸的是,它不允許你要指定一個errback函數,所以你將不得不自己添加對它的支持。我基於這個the source for SitemapSpider

首先,你會希望更改sitemap_rules作品通過添加一個函數來處理錯誤:

sitemap_rules = [ 
    ('/product/', 'parse_product'), 
    ('/category/', 'parse_category'), 
] 

將變爲:

sitemap_rules = [ 
    ('/product/', 'parse_product', 'error_handler'), 
    ('/category/', 'parse_category', 'error_handler'), 
] 

接下來,在init,要將新的回調存儲在_cbs中。

for r, c in self.sitemap_rules: 
    if isinstance(c, basestring): 
     c = getattr(self, c) 
    self._cbs.append((regex(r), c)) 

將變爲:

for r, c, e in self.sitemap_rules: 
    if isinstance(c, basestring): 
     c = getattr(self, c) 
    if isinstance(e, basestring): 
     e = getattr(self, e) 
    self._cbs.append((regex(r), c, e)) 

最後,在_parse_sitemap結束時,你可以指定你的新errback可功能

elif s.type == 'urlset': 
    for loc in iterloc(s): 
     for r, c in self._cbs: 
      if r.search(loc): 
       yield Request(loc, callback=c) 
       break 

將變爲:

elif s.type == 'urlset': 
    for loc in iterloc(s): 
     for r, c, e in self._cbs: 
      if r.search(loc): 
       yield Request(loc, callback=c, errback=e) 
       break 

從那裏,sim一定要實現你的errback功能(記住,它需要一個扭曲的失敗作爲參數),你應該很好去。

+0

謝謝你詳細的回答...在我共享的鏈接中提到的方法問題是現在工作...我會盡力實施你的方法,但它會很棘手,因爲我沒有使用sitemap_rules – Parag