python-3.x - 这两种在 Python 中建立网络连接的方式之间的实际区别是什么?

标签 python-3.x http beautifulsoup python-requests urllib3

我注意到有几种方法可以启动 http 连接以进行网络抓取。我不确定是否有一些是更新的和最新的编码方式,或者它们是否只是具有不同优点和缺点的不同模块。更具体地说,我试图了解以下两种方法之间的区别,您会推荐什么?

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")

除了需要导入不同模块这一简单事实之外,还有什么让这两个选项与众不同?

最佳答案

在底层,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

>>> 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")

关于python-3.x - 这两种在 Python 中建立网络连接的方式之间的实际区别是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36937110/

相关文章:

python - 将 lxml 输出传递给 BeautifulSoup

python - 检查两个文件指针是否指向 Python 中的同一个文件

python - Python 中 __future__ 和 swagger_client 的问题

html - HTML 中的原始打印 HTTP_REFERER 是否可用于 XSS?

java - 将 HTTP Get 请求解析为组成字段

python - 如何使用 BeautifulSoup (Python) 排除元素

python - 使用 Wikipedia 上的 BeautifulSoup 进行网页抓取

python - Python3 上的 Twistd 可执行文件

python-3.x - 修改全局变量的NameError

.net - 如何强制 WebRequest 在 POST 期间发送授权 header