2010-03-05 19 views
71

好的,我需要使用Python下載一些網頁,並對我的選項進行了快速調查。哪個在Python中最好:urllib2,PycURL還是機械化?

包括在Python:

urllib - 在我看來,我應該使用的urllib2。 urllib沒有cookie支持,僅支持HTTP/FTP /本地文件(不支持SSL)

urllib2 - 完整的HTTP/FTP客戶端,支持cookies等)

全功能:

mechanize - 可以使用/保存火狐/ IE的cookies,需要像跟隨第二環節,積極維護(0.2.5於2011年3月發佈)的行動

PycURL - 支持curl所做的一切(FTP,FTPS,HTTP,HTTPS,GOPHER,TELNET,DICT,FILE和L DAP),壞消息是:沒有更新自2008年9月9日(7.19.0)

新的可能性:

urllib3 - 支持連接重新使用/池和文件發佈

已過時(亦稱使用的urllib/urllib2的替代):

httplib - HTTP/HTTPS(不使用FTP)

httplib2 - HTTP/HTTPS(不使用FTP)

令我驚訝的是,urllib的/ urllib2的第一件事/ PycURL /機械化都是相當成熟的解決方案,運行良好。機械化和PycURL附帶許多Linux發行版(例如Fedora 13)和BSD,所以安裝通常不是問題(所以這很好)。

urllib2看起來不錯,但我想知道爲什麼PycURL和機械化兩者似乎非常受歡迎,有沒有我缺少的東西(即如果我使用urllib2我會在某個角落畫一個角落?)。我真的很喜歡這些東西的利弊反饋,所以我可以爲自己做出最好的選擇。

編輯:在urllib2的

+3

「最好」是什麼意思?最好的是什麼?最快的?最大?最好使用Cookie?你需要做什麼? – 2010-03-05 11:03:40

+1

httplib不是「已棄用」。它是urllib2構建於其上的較低級別的模塊。你可以直接使用它,但通過urllib2 – 2010-03-05 16:48:11

+1

更容易。 urllib3是httplib之上的一個圖層。此外,httplib2不被棄用 - 實際上它比urllib2更新,並修復了連接重用問題(與urllib3相同)。 – Yang 2011-04-21 01:03:49

回答

34
  • urllib2對動詞的支持補充說明在每個Python發現安裝無處不在,所以是對其開始了良好的基礎。
  • PycURL對於已經習慣使用libcurl的人很有用,它暴露了更多低級別的HTTP細節,並且可以獲得應用於libcurl的任何修復或改進。
  • mechanize用於持久驅動連接,非常像瀏覽器。

這不是一個比另一個更好的問題,這是一個選擇適當的工具工作的問題。

+0

我在我的python應用程序中實現了httplib2。 httplib2是否支持NTLM ?. 如果不是我必須爲NTLM身份驗證做什麼? 注意:我發現httplib2不支持NTLM。 – TinTin 2011-01-25 06:03:12

+2

@Ayyappan urllib3通過contrib子模塊支持NTLM:[urllib3/contrib/ntlmpool.py](http://code.google.com/p/urllib3/source/browse/urllib3/contrib/ntlmpool.py?spec = svn308cfcafd2c78e4158397c0d29de667f3f387335&r = 308cfcafd2c78e4158397c0d29de667f3f387335) – shazow 2011-07-27 01:38:11

44

我認爲這個演講(在pycon 2009上)有你要找的答案(Asheesh Laroia在這件事上有很多經驗)。他指出,從大部分的上市

的好的和壞的從PYCON 2009年時間表:

你找到你自己面臨着 有你需要的數據的網站 提取? 你的生活會更簡單,如果 你可以編程輸入數據 到Web應用程序,甚至那些 調整抵制機器人的交互?

我們將討論web 的基礎知識,然後深入探討 不同方法的細節,以及 它們是最適用的。

你會離開 用時應用 不同的工具有所瞭解,並瞭解如何在 「重錘」的屏幕抓取 ,我在爲 電子前沿基金會的一個項目回升。

參加者應該帶一臺筆記本電腦,如果 可能,嘗試我們 討論和任意記筆記的例子。

更新: Asheesh Laroia已經更新了他的演講的PYCON 2010

  • PyCon 2010: Scrape the Web: Strategies for programming websites that don't expected it

    * My motto: "The website is the API." 
    * Choosing a parser: BeautifulSoup, lxml, HTMLParse, and html5lib. 
    * Extracting information, even in the face of bad HTML: Regular expressions, BeautifulSoup, SAX, and XPath. 
    * Automatic template reverse-engineering tools. 
    * Submitting to forms. 
    * Playing with XML-RPC 
    * DO NOT BECOME AN EVIL COMMENT SPAMMER. 
    * Countermeasures, and circumventing them: 
         o IP address limits 
         o Hidden form fields 
         o User-agent detection 
         o JavaScript 
         o CAPTCHAs 
    * Plenty of full source code to working examples: 
         o Submitting to forms for text-to-speech. 
         o Downloading music from web stores. 
         o Automating Firefox with Selenium RC to navigate a pure-JavaScript service. 
    * Q&A; and workshopping 
    * Use your power for good, not evil. 
    

更新2:

精彩信息被困在網頁和HTML表格後面。在本教程中,>您將學習如何解析這些頁面以及何時應用高級技術,以便更快,更穩定地進行抓取。我們將介紹Twisted,gevent和其他人的並行下載;分析SSL背後的網站;用Selenium駕駛JavaScript-y網站;和>避開常見的防刮技術。

+3

我希望我也可以接受這個答案。很棒的介紹! – bigredbob 2010-03-05 21:08:48

+0

總結談話建議的兩三句話對於那些沒有時間傾聽的人來說會很棒。 :-) – 2010-10-27 01:05:27

+0

斷開鏈接... – Sheena 2013-08-26 11:00:58

2

不要擔心「上次更新」。 HTTP在過去幾年並沒有太大變化;)

urllib2是最好的(因爲它是內置的),然後切換到機械化,如果你需要從Firefox的cookie。 mechanize可以用作urllib2的直接替代品 - 它們具有類似的方法等。使用Firefox cookies意味着您可以使用您的個人登錄憑據從網站(比如說StackOverflow)獲取內容。只是對你的請求數量負責(或者你會被阻止)。

PycURL適合需要libcurl中所有低級內容的人。我會先嚐試其他庫。

+1

請求在存儲Cookie時也很有用。用請求創建一個新的會話,然後調用sessionName.get()而不是requests.get()。 Cookies將被存儲在你的會話中。例如,一旦您使用會話登錄網站,您將可以使用會話以登錄用戶身份執行其他http請求。 – 2012-06-11 17:18:33

2

Urllib2僅支持HTTP GET和POST,可能會有解決方法,但如果您的應用程序依賴於其他HTTP動詞,您可能會更喜歡不同的模塊。

+2

不正確。參見[Python - 與urllib2的HEAD請求](http://stackoverflow.com/questions/4421170/) – 2011-04-29 19:06:49

+0

@Piotr Dobrogost。仍然非常真實。直到你可以使用'urllib2.urlopen'來生成一個'HEAD'請求,它不受支持。創建一個自定義的子類!='HEAD'支持。我可以創建一個生成「HTML」的「int」子類,但是說python「int」可以生成「HTML」是沒有意義的。 – mikerobi 2011-04-29 20:44:26

+0

*直到你可以使用urllib2.urlopen來產生一個HEAD請求,它不被支持。*什麼讓你這麼認爲? *創建一個自定義子類!= HEAD支持* * HEAD支持*的哪部分是urllib2缺失? – 2011-04-29 22:39:52

1

說到HTTP的每個python庫都有自己的優點。

使用具有特定任務所需的最少量功能的功能。

您的列表中缺少至少urllib3 - 一個很酷的第三方HTTP庫,它可以重用HTTP連接,從而大大加快了從同一站點檢索多個URL的過程。

+0

添加到列表中,謝謝! – bigredbob 2010-11-30 09:05:48

+0

請求在引擎蓋下使用urllib3。 – 2012-06-11 17:20:46

38

Python requests也是一個很好的候選HTTP的東西。它有一個更好的API恕我直言,從他們的offcial文檔的HTTP請求示例:

>>> r = requests.get('https://api.github.com', auth=('user', 'pass')) 
>>> r.status_code 
204 
>>> r.headers['content-type'] 
'application/json' 
>>> r.content 
... 
+0

請求在內部使用urlib3 – 2013-09-24 07:26:14

1

拿上搶的樣子(http://grablib.org)。這是一個網絡庫,其提供兩個主接口: 1)抓鬥,用於創建網絡請求和解析檢索到的數據 2)蜘蛛用於創建批量站點刮刀

引擎蓋下抓鬥使用pycurl和LXML但也可以使用其他網絡傳輸(例如請求庫)。請求運輸尚未經過充分測試。

3

要「獲取一些網頁」,請使用請求

從:

Python的標準的urllib2模塊提供大部分的HTTP的 能力,你需要的,但API是徹底打破。這是建立 在不同的時間 - 和一個不同的網絡。它需要大量的工作(甚至是方法重寫)來執行最簡單的 任務。

事情不應該這樣。不在Python中。

>>> r = requests.get('https://api.github.com/user', auth=('user', 'pass')) 
>>> r.status_code 
200 
>>> r.headers['content-type'] 
'application/json; charset=utf8' 
>>> r.encoding 
'utf-8' 
>>> r.text 
u'{"type":"User"...' 
>>> r.json() 
{u'private_gists': 419, u'total_private_repos': 77, ...}