2016-04-29 40 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") 
相关问题