在引擎蓋下,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")
的'requests'模塊使用(和[捆綁銷售'urllib3'](https://github.com/kennethreitz/requests/tree/master/requests/packages))在引擎蓋下 - 但它提供了一個更高層次和更簡單的API。 –
拋開一個事實,即請求提供了更高級別的API,可能只需少一點代碼,是否有可能會選擇其中一種?或者,通常是完全用於「請求」的更好選擇? –
我的建議是總是使用'requests'。它只是讓HTTP非常愉快地處理,如果有一些你不能用'urllib3'完成的'requests',我還沒有遇到過。但這只是[我的意見](http://stackoverflow.com/help/dont-ask)。 –