Python 3.x 这两种在Python中建立web连接的方法之间的实际区别是什么?

Python 3.x 这两种在Python中建立web连接的方法之间的实际区别是什么?,python-3.x,http,beautifulsoup,python-requests,urllib3,Python 3.x,Http,Beautifulsoup,Python Requests,Urllib3,我注意到有几种方法可以将http连接链接到web抓取。我不确定是否有一些是最新的编码方式,或者它们只是不同的模块,有不同的优缺点。更具体地说,我试图了解以下两种方法之间的区别,以及您的建议是什么 1)使用urllib3: http = PoolManager() r = http.urlopen('GET', url, preload_content=False) soup = BeautifulSoup(r, "html.parser") import urllib3,

我注意到有几种方法可以将http连接链接到web抓取。我不确定是否有一些是最新的编码方式,或者它们只是不同的模块,有不同的优缺点。更具体地说,我试图了解以下两种方法之间的区别,以及您的建议是什么

1)使用urllib3:

http = PoolManager()
r = http.urlopen('GET', url, preload_content=False)
soup = BeautifulSoup(r, "html.parser")
import urllib3, certifi
http = urllib3.PoolManager(ca_certs=certifi.where())
html = http.request('GET', url).read()
soup = BeautifulSoup(html, "html5lib")
2)使用请求

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

除了需要导入不同的模块这一简单事实之外,是什么将这两个选项区分开来的?

在引擎盖下,
请求使用
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池管理器中一样重新使用连接,需要进行请求会话

现在,它相当于您使用http=PoolManager()
所做的操作。还有一点需要注意:urllib3是一个较低级别的更显式的库,因此您需要显式地创建一个池,例如,您需要显式地指定。这是一个额外的线或两个更多的工作,但也有一个公平多一点的控制,如果这是你正在寻找的

不管怎么说,对比变成:

1)使用urllib3:

http = PoolManager()
r = http.urlopen('GET', url, preload_content=False)
soup = BeautifulSoup(r, "html.parser")
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
模块在引擎盖下使用(和),但它提供了更高级别和更简单的API。抛开requests提供更高级别的API(可能代码更少)这一事实不谈,是否存在更倾向于选择其中一个的情况?或者完全针对
请求
通常是更好的选择?我的建议是始终使用
请求
。它只是让HTTP处理起来非常愉快,如果有一些东西你不能处理
请求
,而你可以使用普通的
urllib3
,我还没有遇到过它。但那只是。请求供应商提供一组库(包括urllib3、certifi等),并为您预先配置它们。如果您需要较低级别的访问,或者需要控制正在发生的事情,那么可以直接使用urllib3。