2010-01-11 24 views
2

我正在寫一個需要load_url函數執行對我下面的蜘蛛:有沒有比urlgrabber更好的庫來獲取Python中的遠程URL?

  1. 重試該URL,如果有錯誤是暫時性的,沒有泄漏例外。
  2. 不會泄露內存或文件句柄
  3. 使用HTTP-保持活動的速度(可選)

URLGrabber表面上看起來不錯,但它有麻煩。第一個問題是打開了太多的文件,但是我可以通過關閉keep-alive來解決此問題。然後,該功能開始提出socket.error: [Errno 104] Connection reset by peer。該錯誤應該被捕獲,並且可能會引發URLGrabberError。

我正在運行python 2.6.4。

有誰知道用URLGrabber修復這些問題的方法,或者知道另一種方法來完成我需要的不同庫嗎?

+0

BeautifulSoup ftw? – Kimvais 2010-01-11 08:32:00

+0

BeautifulSoup非常棒,但它用於解析HTML。我需要有關HTTP傳輸功能的幫助。類似於'urllib2.urlopen',但具有所描述的功能。 – Gattster 2010-01-11 08:33:55

回答

4

如果您正在編寫網絡爬蟲/屏幕刮板,您可能有興趣查看專用框架,如scrapy

你可以用很少的代碼編寫真正相當複雜的網絡爬蟲:它負責調度請求的所有血淋淋的細節,並以結果回覆你,以你需要的任何方式處理(它基於扭曲但它很好地隱藏了所有的實現細節)。

+0

scrapy玩django不錯嗎?我需要把所有東西都放到django/mysql數據庫中。 – Gattster 2010-01-11 08:44:14

+0

我假設你想在你的django後端基於你的刮臉excersise的結果創建記錄?如果是這樣,那麼你所需要做的就是將抓取器返回的結果轉換爲django模型記錄(我很久沒有使用過django,但iirc使用SQLAlchemy)並調用相關方法將這些記錄保存到數據庫中:基於scrapy的代碼與任何其他python代碼沒有什麼不同(IE,如果你可以使用普通的Python腳本獲取數據,你可以使用基於Scrapy的刮板來實現)) – jkp 2010-01-11 08:49:24

+0

不,它不使用SQLAlchemy。儘管如此,將記錄放入數據庫並不會太難。您必須將'DJANGO_SETTINGS_MODULE'環境變量設置爲帶有DB連接的設置文件的導入路徑,然後像在Django視圖中一樣創建和保存模型。 – LeafStorm 2010-01-11 11:34:21

0

此外,在Python中的屏幕抓取有Scrapy,雖然我不知道這是否會滿足您的要求。

0

Scrapy聽起來不錯,我會考慮在未來使用它。然而,對於這個項目,我真的正在尋找一個簡單的功能,如上所述。我創造了一個似乎正在完成這項工作的項目。

import urllib2 

class HttpLoadError(RuntimeError): 
    pass 

class Http404(HttpLoadError): 
    pass 

class HttpFailedRepeatedly(HttpLoadError): 
    pass 

def safeurlopen(url): 
    import time 
    i = 0 
    while True: 
     i += 1 
     try: 
      return urllib2.urlopen(url) 
     except (urllib2.HTTPError, socket.error), e: 
      if getattr(e, 'code', '') == 404: 
       raise Http404 
      if i >= 10: 
       raise HttpFailedRepeatedly(e) 
      time.sleep(30) 

def safeurlopenandread(url): 
    rh = safeurlopen(url) 
    res = rh.read() 
    rh.close() 
    return res 
相關問題