python的requests模块功能_python - urllib,urllib2和requests模块之间有什么区别?

python - urllib,urllib2和requests模块之间有什么区别?

在Python中,requests,urllib2和requests模块之间有什么区别? 为什么有三个? 他们似乎做同样的事情......

9个解决方案

568 votes

我知道它已经说过,但我强烈推荐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')

无论GET / POST是否你再也不必编码参数,它只需要一个字典作为参数,并且很好。

userdata = {"firstname": "John", "lastname": "Doe", "password": "jdoe123"}

resp = requests.post('http://www.mywebsite.com/user', data=userdata)

此外,它甚至还有一个内置的json解码器(再次,我知道json.loads()写的不多,但这肯定很方便):

resp.json()

或者,如果您的响应数据只是文本,请使用:

resp.text

这只是冰山一角。 这是请求站点的功能列表:

国际域名和URL

Keep-Alive& 连接池

Cookie持久性的会话

浏览器式SSL验证

基本/摘要式身份验证

优雅的钥匙/价值饼干

自动减压

Unicode响应机构

多部分文件上传

连质超时

.netrc支持

项目清单

Python 2.6-3.4

线程安全的。

Hutch answered 2019-01-19T09:04:55Z

185 votes

urllib2提供了一些额外的功能,即urlencode()函数可以允许你指定标题(通常你不得不在过去使用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)

请注意,urlencode()仅在urllib中,而不是urllib2。

还有一些处理程序用于在urllib2中实现更高级的URL支持。 简短的回答是,除非您使用遗留代码,否则您可能希望使用urllib2中的URL开启工具,但您仍需要导入urllib以获取某些实用程序功能。

奖金回答使用Google App Engine,您可以使用httplib,urllib或urllib2中的任何一个,但所有这些只是Google的URL Fetch API的包装器。 也就是说,您仍然受到相同的限制,例如端口,协议和允许的响应长度。 但是,您可以像检索HTTP URL一样使用库的核心。

Crast answered 2019-01-19T09:05:45Z

31 votes

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

SrmHitter9062 answered 2019-01-19T09:07:01Z

12 votes

urllib2.urlopen接受Request类或url的实例,而urllib.urlopen只接受url。

这里也进行了类似的讨论:[http://www.velocityreviews.com/forums/t326690-urllib-urllib2-what-is-the-difference.html]

Danny Roberts answered 2019-01-19T09:07:33Z

10 votes

我喜欢urllib.urlencode功能,它似乎不存在于urllib2中。

>>> urllib.urlencode({'abc':'d f', 'def': '-!2'})

'abc=d+f&def=-%212'

Gattster answered 2019-01-19T09:07:57Z

8 votes

一个相当大的区别是将Python2移植到Python3。 对于python3,urllib2不存在,并且其方法移植到urllib。因此,您正在大量使用它并希望将来迁移到Python3,请考虑使用urllib。但是2to3工具会自动为您完成大部分工作。

Arash answered 2019-01-19T09:08:20Z

6 votes

要获取网址的内容:

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.

很难为响应编写Python2和Python3以及request依赖项代码,因为它们urlopen()函数和request.get(url)函数返回不同的类型:

Python2 request.get(url)返回requests.models.Response

Python3 request.get(url)返回requests.models.Response

请求request.get(url)返回requests.models.Response

alvas answered 2019-01-19T09:09:11Z

5 votes

您通常应该使用urllib2,因为这有时会通过接受Request对象使事情变得更容易,并且还会引发协议错误的URLException。 但是,使用Google App Engine,您也无法使用它们。 您必须使用Google在其沙盒Python环境中提供的URL Fetch API。

Chinmay Kanchi answered 2019-01-19T09:09:34Z

5 votes

只是为了添加现有答案,我没有看到有人提到python请求不是本机库。 如果您可以添加依赖项,那么请求就可以了。 但是,如果您尝试避免添加依赖项,则urllib是一个已经可用的本机python库。

Zeitgeist answered 2019-01-19T09:09:57Z

你可能感兴趣的:(python的requests模块功能_python - urllib,urllib2和requests模块之间有什么区别?)