在引擎盖下,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)。 –