2014-11-14 78 views
1

我正在編寫web spider來使用python中的scrapy框架來廢棄一些產品。 我想知道什麼是計算書面蜘蛛的覆蓋率和丟失項目的最佳實踐。計算scrapy webspider的覆蓋範圍

我現在正在使用的是記錄無法解析或引發異常的情況。作爲一個例子:當我期望一個產品的價格或地點的特定格式,我發現我寫的正則表達式不匹配報廢的字符串。或者當我的xpath特定數據選擇器沒有任何返回。

有時候,當產品列在一頁或多頁時,我使用curlgrep粗略計算產品數量。但我想知道是否有更好的做法來處理這個問題。

回答

1

通常的做法是,使用logging記錄錯誤並退出回調,不返回任何內容。

實例(需要產品的價格):

loader = ProductLoader(ProductItem(), response=response) 
loader.add_xpath('price', '//span[@class="price"]/text()') 
if not loader.get_output_value('price'): 
    log.msg("Error fetching product price", level=log.ERROR) 
    return 

您還可以使用signals來捕捉和記錄所有類型的例外發生在抓取,請參閱:

這基本上遵循Easier to ask for forgiveness than permission原則,當你讓蜘蛛失敗並捕捉和處理錯誤在一個特定的地方 - 一個信號處理程序。


其他的想法:

  • 你甚至可以將響應URL和錯誤回溯到了以下的評論數據庫 - 這仍然是「日誌」,但以結構化方式可以更方便以後通過
  • 一個好主意可能是創建自定義例外來表示不同的抓取錯誤,例如:MissingRequiredFieldError,InvalidFieldFormatError如果抓取的字段沒有通過驗證,則可以引發這個錯誤。
+0

我個人更喜歡EAFP風格,所以這個答案是一種解脫,但這是否意味着如果我從1個網頁中提取20個細節我的解析函數充滿了20個try和except子句? –

+0

@HadyElsahar nope,如果您有一個'spider_error'信號處理程序,則在處理程序中抓取時引發的所有異常都將「可用」。有自定義的異常提出應該緩解錯誤分析和處理.. – alecxe

+0

是的,但我更喜歡單獨處理try catch子句中的每個細節,以便蜘蛛完成抓取剩餘的細節,如果它沒有得到[可選項目]。 ,而且對於遺漏的情況下的專用日誌消息,哪些部分實際上失敗了(例如獲取價格文本或解析它) –