我注意到有几种方法可以启动用于网络抓取的 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 示例中,您正在重用连接,而在 requests 示例中,您没有重用连接。您可以通过以下方式判断:

>>> 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/

10-11 04:35