在Python中使用这两种方式建立Web连接的实际区别是什么?

Vic*_*gos 3 http urllib3 python-3.x python-requests bs4

我注意到有几种方法可以为Web报废提供http连接.我不确定某些是更近期和最新的编码方式,还是它们只是具有不同优点和缺点的不同模块.更具体地说,我试图了解以下两种方法之间的区别,你会推荐什么?

1)使用urllib3:

http = PoolManager()
r = http.urlopen('GET', url, preload_content=False)
soup = BeautifulSoup(r, "html.parser")
Run Code Online (Sandbox Code Playgroud)

2)使用请求

html = requests.get(url).content
soup = BeautifulSoup(html, "html5lib")
Run Code Online (Sandbox Code Playgroud)

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

sha*_*zow 6

引擎盖下,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
Run Code Online (Sandbox Code Playgroud)

要开始重新使用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
Run Code Online (Sandbox Code Playgroud)

现在它等同于你正在做的事情http = PoolManager().还有一点需要注意:urllib3是一个更低级别更明确的库,因此您显式创建了一个池,并且您明确需要指定您的SSL证书位置.这是额外的一两行或更多的工作,但如果你正在寻找的话,也会有更多的控制权.

所有的说和做,比较变成:

1)使用urllib3:

import urllib3, certifi
http = urllib3.PoolManager(ca_certs=certifi.where())
html = http.request('GET', url).read()
soup = BeautifulSoup(html, "html5lib")
Run Code Online (Sandbox Code Playgroud)

2)使用请求:

import requests
session = requests.session()
html = session.get(url).content
soup = BeautifulSoup(html, "html5lib")
Run Code Online (Sandbox Code Playgroud)