Pau*_*gar 690 python urllib urllib2 python-2.x python-requests
在Python,有什么之间的差异urllib,urllib2以及urllib3模块?为什么有三个?他们似乎做同样的事情......
Hut*_*tch 657
我知道它已经说过,但我强烈推荐Requests python包:http: //docs.python-requests.org/en/latest/index.html
如果您使用的语言不是python,那么您可能认为urllib和urllib2易于使用,代码不多,而且功能强大,这就是我以前的想法.但Requests包令人难以置信的有用和简短,每个人都应该使用它.
首先,它支持完全宁静的API,并且非常简单:
import requests
resp = requests.get('http://www.mywebsite.com/user')
resp = requests.post('http://www.mywebsite.com/user')
resp = requests.put('http://www.mywebsite.com/user/put')
resp = requests.delete('http://www.mywebsite.com/user/delete')
Run Code Online (Sandbox Code Playgroud)
无论GET/POST是否你再也不必编码参数,它只需要一个字典作为参数,并且很好.
userdata = {"firstname": "John", "lastname": "Doe", "password": "jdoe123"}
resp = requests.post('http://www.mywebsite.com/user', data=userdata)
Run Code Online (Sandbox Code Playgroud)
此外,它甚至还有一个内置的json解码器(再次,我知道json.loads()写的不多,但这肯定很方便):
resp.json()
Run Code Online (Sandbox Code Playgroud)
或者,如果您的响应数据只是文本,请使用:
resp.text
Run Code Online (Sandbox Code Playgroud)
这只是冰山一角.这是请求站点的功能列表:
Cra*_*ast 195
urllib2提供了一些额外的功能,即urlopen()函数可以允许你指定标题(通常你以前必须使用httplib,这更加冗长.)更重要的是,urllib2提供了Request类,它允许更多执行请求的声明方法:
r = Request(url='http://www.mysite.com')
r.add_header('User-Agent', 'awesome fetcher')
r.add_data(urllib.urlencode({'foo': 'bar'})
response = urlopen(r)
Run Code Online (Sandbox Code Playgroud)
请注意,urlencode()仅在urllib中,而不是urllib2.
还有一些处理程序用于在urllib2中实现更高级的URL支持.简短的回答是,除非您使用遗留代码,否则您可能希望使用urllib2中的URL开启工具,但您仍需要导入urllib以获取某些实用程序功能.
奖励回答 使用Google App Engine,您可以使用httplib,urllib或urllib2中的任何一个,但所有这些只是Google的URL Fetch API的包装.也就是说,您仍然受到相同的限制,例如端口,协议和允许的响应长度.但是,您可以像检索HTTP URL一样使用库的核心.
pdw*_*pdw 103
这是我对各种“urllibs”之间关系的理解:
在 Python 2 标准库中,并排存在两个 HTTP 库。尽管名称相似,但它们并不相关:它们具有不同的设计和不同的实现。
urllib是最初的 Python HTTP 客户端,添加到Python 1.2的标准库中。早期的文档urllib可以在Python 1.4 中找到。
urllib2是一个功能更强大的 HTTP 客户端,在 Python 1.6 中添加,旨在替代urllib:
urllib2 - 新的和改进但不兼容的 urllib 版本(仍处于试验阶段)。
早期的文档urllib2可以在Python 2.1 中找到。
Python 3 标准库有一个新的 urllib,它是旧模块的合并/重构/重写版本。
urllib3是第三方包(即不在 CPython 的标准库中)。尽管有这个名字,但它与标准库包无关,将来也无意将其包含在标准库中。
最后,requests内部使用urllib3,但它旨在提供更易于使用的 API。
Siy*_*lav 40
urllib和urllib2都是Python模块,它们执行URL请求相关的东西,但提供不同的功能.
1)urllib2可以接受Request对象来设置URL请求的头,urllib只接受一个URL.
2)urllib提供了用于生成GET查询字符串的urlencode方法,urllib2没有这样的功能.这是urllib经常与urllib2一起使用的原因之一.
Requests - Requests'是一个用Python编写的简单易用的HTTP库.
1)Python请求自动对参数进行编码,因此您只需将它们作为简单参数传递,与urllib的情况不同,在urllib中,您需要使用方法urllib.encode()在传递参数之前对其进行编码.
2)它自动将响应解码为Unicode.
3)请求也有更方便的错误处理.如果您的身份验证失败,urllib2将引发urllib2.URLError,而Requests将返回正常的响应对象,如预期的那样.所有你必须通过boolean response.ok查看请求是否成功
例如参考 - https://dancallahan.info/journal/python-requests/
Gat*_*ter 11
我喜欢这个urllib.urlencode功能,它似乎不存在urllib2.
>>> urllib.urlencode({'abc':'d f', 'def': '-!2'})
'abc=d+f&def=-%212'
Run Code Online (Sandbox Code Playgroud)
Ara*_*ash 11
一个相当大的区别是将Python2移植到Python3.对于python3,urllib2不存在,并且其方法移植到urllib.因此,您正在大量使用它并希望将来迁移到Python3,请考虑使用urllib.但是2to3工具会自动为您完成大部分工作.
只是为了添加现有答案,我没有看到有人提到python请求不是本机库.如果您可以添加依赖项,那么请求就可以了.但是,如果您尝试避免添加依赖项,则urllib是一个已经可用的本机python库.
我认为所有的答案都很好。但是关于 urllib3 的细节较少。urllib3 是一个非常强大的 Python 的 HTTP 客户端。要安装以下两个命令都可以使用,
urllib3使用点子,
pip install urllib3
Run Code Online (Sandbox Code Playgroud)
或者您可以从 Github 获取最新代码并使用以下方法安装它们,
$ git clone git://github.com/urllib3/urllib3.git
$ cd urllib3
$ python setup.py install
Run Code Online (Sandbox Code Playgroud)
然后你就可以出发了
只需使用导入 urllib3,
import urllib3
Run Code Online (Sandbox Code Playgroud)
在这里,您不需要直接创建连接,而是需要一个 PoolManager 实例来发出请求。这为您处理连接池和线程安全。还有一个 ProxyManager 对象,用于通过 HTTP/HTTPS 代理路由请求,这里可以参考文档。示例用法:
>>> from urllib3 import PoolManager
>>> manager = PoolManager(10)
>>> r = manager.request('GET', 'http://google.com/')
>>> r.headers['server']
'gws'
>>> r = manager.request('GET', 'http://yahoo.com/')
>>> r.headers['server']
'YTS/1.20.0'
>>> r = manager.request('POST', 'http://google.com/mail')
>>> r = manager.request('HEAD', 'http://google.com/calendar')
>>> len(manager.pools)
2
>>> conn = manager.connection_from_host('google.com')
>>> conn.num_requests
3
Run Code Online (Sandbox Code Playgroud)
如urrlib3文档中所述,urllib3带来了 Python 标准库中缺少的许多关键功能。
请按照用户指南了解更多详细信息。
requestsrequestsurllib3在幕后使用,使制作requests和检索数据变得更加简单。一方面,保持活动是 100% 自动的,与urllib3它不是的情况相比。它还具有事件钩子,当事件被触发时调用回调函数,比如接收响应 In requests,每个请求类型都有自己的函数。因此,您无需创建连接或池,而是直接获取 URL。
requests使用 pip安装只需运行
pip install requests
或者你可以直接从源代码安装,
$ git clone git://github.com/psf/requests.git
$ cd requests
$ python setup.py install
Run Code Online (Sandbox Code Playgroud)
然后, import requests
这里可以参考官方文档,一些高级用法如会话对象、SSL 验证和事件钩子请参考这个url。
您通常应该使用urllib2,因为这有时会通过接受Request对象使事情变得更容易,并且还会引发协议错误的URLException.但是,使用Google App Engine,您也无法使用它们.您必须使用Google在其沙盒Python环境中提供的URL Fetch API.
要获取网址的内容:
try: # Try importing requests first.
import requests
except ImportError:
try: # Try importing Python3 urllib
import urllib.request
except AttributeError: # Now importing Python2 urllib
import urllib
def get_content(url):
try: # Using requests.
return requests.get(url).content # Returns requests.models.Response.
except NameError:
try: # Using Python3 urllib.
with urllib.request.urlopen(index_url) as response:
return response.read() # Returns http.client.HTTPResponse.
except AttributeError: # Using Python3 urllib.
return urllib.urlopen(url).read() # Returns an instance.
Run Code Online (Sandbox Code Playgroud)
request为响应编写Python2和Python3以及依赖项代码很困难,因为它们的urlopen()函数和requests.get()函数返回不同的类型:
urllib.request.urlopen()返回一个http.client.HTTPResponseurllib.urlopen(url)返回一个instancerequest.get(url)返回arequests.models.Response我发现上述答案中缺少的一个关键点是 urllib 返回类型的对象,<class http.client.HTTPResponse>而requestsreturns <class 'requests.models.Response'>.
因此,read() 方法可以与 一起使用,urllib但不能与 一起使用requests。
PS:requests已经有很多方法了,几乎不需要再有一个read();>
| 归档时间: |
|
| 查看次数: |
291794 次 |
| 最近记录: |