【问题标题】:What is the practical difference between these two ways of making web connections in Python?这两种在 Python 中建立 Web 连接的方式之间的实际区别是什么?
【发布时间】:2016-04-29 11:24:35
【问题描述】:

我注意到有几种方法可以启动 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 模块在底层使用(和bundles / vendorizes urllib3) - 但它提供了更高级别和更简单的 API。
  • 撇开 requests 提供更高级别的 API(可能代码更少)这一事实不谈,是否存在选择其中一个更可取的情况?还是完全选择requests 通常是更好的选择?
  • 我的建议是始终使用requests。它只是让 HTTP 处理起来非常愉快,如果有一些你不能用 requests 做的事情,你可以用普通的 urllib3 做,我还没有遇到过。但这只是my opinion
  • 向供应商请求一堆库(包括 urllib3、certifi 等)并为您预先配置它们。如果您需要较低级别的访问权限,或者只是想控制正在发生的事情,那么您可以直接使用 urllib3。

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


【解决方案1】:

在后台,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")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-17
    • 2023-03-08
    • 2021-06-12
    • 1970-01-01
    相关资源
    最近更新 更多