2016-04-29 42 views
2

我已經注意到有幾種方法可以通過http連接進行網絡報廢。我不確定是否有一些是最新和最新的編碼方式,或者它們只是具有不同優點和缺點的不同模塊。更具體地說,我想了解以下兩種方法之間的區別,你會推薦什麼?這兩種在Python中建立網絡連接的方式有什麼實際區別?

1)使用urllib3:

http = PoolManager() 
r = http.urlopen('GET', url, preload_content=False) 
soup = BeautifulSoup(r, "html.parser") 

2)使用請求

html = requests.get(url).content 
soup = BeautifulSoup(html, "html5lib") 

的與衆不同之處這兩個選項,除了簡單的事實,他們需要引進不同的模塊?

+0

的'requests'模塊使用(和[捆綁銷售'urllib3'](https://github.com/kennethreitz/requests/tree/master/requests/packages))在引擎蓋下 - 但它提供了一個更高層次和更簡單的API。 –

+0

拋開一個事實,即請求提供了更高級別的API,可能只需少一點代碼,是否有可能會選擇其中一種?或者,通常是完全用於「請求」的更好選擇? –

+0

我的建議是總是使用'requests'。它只是讓HTTP非常愉快地處理,如果有一些你不能用'urllib3'完成的'requests',我還沒有遇到過。但這只是[我的意見](http://stackoverflow.com/help/dont-ask)。 –

回答

4

在引擎蓋下,requests使用urllib3來做大部分http重負。正確使用時,應該大體相同,除非您需要更高級的配置。

除,你的具體的例子他們相同:而在請求例如你不重新使用連接

在urllib3例子,你重複使用的連接。這裏是你如何能說:

>>> import requests 
>>> requests.packages.urllib3.add_stderr_logger() 
2016-04-29 11:43:42,086 DEBUG Added a stderr logging handler to logger: requests.packages.urllib3 
>>> requests.get('https://www.google.com/') 
2016-04-29 11:45:59,043 INFO Starting new HTTPS connection (1): www.google.com 
2016-04-29 11:45:59,158 DEBUG "GET/HTTP/1.1" 200 None 
>>> requests.get('https://www.google.com/') 
2016-04-29 11:45:59,815 INFO Starting new HTTPS connection (1): www.google.com 
2016-04-29 11:45:59,925 DEBUG "GET/HTTP/1.1" 200 None 

要開始像一個urllib3 PoolManager重新使用的連接,你需要做一個請求會話

>>> session = requests.session() 
>>> session.get('https://www.google.com/') 
2016-04-29 11:46:49,649 INFO Starting new HTTPS connection (1): www.google.com 
2016-04-29 11:46:49,771 DEBUG "GET/HTTP/1.1" 200 None 
>>> session.get('https://www.google.com/') 
2016-04-29 11:46:50,548 DEBUG "GET/HTTP/1.1" 200 None 

現在這相當於你用http = PoolManager()在做什麼。還有一點需要注意:urllib3是一個更底層的更明確的庫,所以你明確地創建了一個池,例如你明確需要指定your SSL certificate location。這是一條額外的線或兩個更多的工作,但如果這就是你要找的東西,那也是一個更好的控制。

所有說,做,比較變爲:

1)使用urllib3:

import urllib3, certifi 
http = urllib3.PoolManager(ca_certs=certifi.where()) 
html = http.request('GET', url).read() 
soup = BeautifulSoup(html, "html5lib") 

2)使用請求

import requests 
session = requests.session() 
html = session.get(url).content 
soup = BeautifulSoup(html, "html5lib") 
相關問題