关于python:urllib、urllib2和requests模块之间有什么区别?

What are the differences between the urllib, urllib2, and requests module?

在python中,urlliburllib2requests模块之间有什么区别?为什么有三个?他们似乎也在做同样的事…


我知道已经说过了,但是我强烈推荐requests python包:http://docs.python-requests.org/en/latest/index.html

如果您使用的语言不是python,那么您可能会认为urlib和urlib2很容易使用,代码不多,而且功能很强,这就是我以前的想法。但是请求包是如此的有用和短,以至于每个人都应该使用它。

首先,它支持完全RESTfulAPI,并且非常简单:

1
2
3
4
5
6
7
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是否永远不需要再次编码参数,它只需要一个字典作为参数,这样做很好。

1
2
userdata = {"firstname":"John","lastname":"Doe","password":"jdoe123"}
resp = requests.post('http://www.mywebsite.com/user', data=userdata)

另外,它甚至还有内置的JSON解码器(同样,我知道json.loads()编写起来并不多,但这确实很方便):

1
resp.json()

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

1
resp.text

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

  • 国际域名和网址
  • 保持活动连接池
  • 具有cookie持久性的会话
  • 浏览器样式的SSL验证
  • 基本/摘要式身份验证
  • 优雅的钥匙/价值饼干
  • 自动减压
  • Unicode响应正文
  • 多部分文件上载
  • 连接超时
  • NETRC支持
  • 列表项
  • Python2.6-3.4
  • 线程安全。


urllib2提供了一些额外的功能,即urlopen()函数可以允许您指定头(通常您在过去必须使用httplib,这要详细得多)。更重要的是,urllib2提供了Request类,允许使用更具声明性的方法来执行请求:

1
2
3
4
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()只在urlib中,而不是urlib2中。

在URLLIB2中还有实现更高级的URL支持的处理程序。简短的回答是,除非您使用的是旧代码,否则您可能希望使用urllib2中的url opener,但对于某些实用程序函数,您仍然需要导入到urllib中。

奖金答案使用Google应用引擎,你可以使用httplib、urllib或urlib2中的任何一个,但它们都只是Google的URL获取API的包装器。也就是说,您仍然受到相同的限制,如端口、协议和允许的响应长度。不过,您可以像检索HTTP URL那样使用库的核心。


urllib和Python模块,做urllib2是两个相关但不同的URL请求的东西functionalities提供。

1)urllib2 CAN accept a请求对象到一个URL请求头字段设置,urllib接受只有一个URL。

2)《urllib提供urlencode方法是使用GET查询字符串的一代,urllib2没有搜索功能。这是一个原因为什么urllib随着urllib2是经常使用的。

请求,请求的是一个简单,易于使用的HTTP库写的Python。

1)encodes Python参数自动请求这样的人你只是简单的参数为不同的护照,urllib案例中,你需要使用方法(一)urllib.encode编码参数在传递他们。

2)自动响应信息的decoded为Unicode。

3)请求,所以安切洛蒂远更多的方便您的错误处理。如果认证失败,将引发一urllib2 urllib2.urlerror,而请求会返回一个正常的响应对象的预期。所有你必须看看请求是成功的response.ok布尔

例如https://dancallahan.info参考Python请求/杂志/ /


urlib2.urlopen接受请求类或URL的实例,而urlib.urlopen只接受URL。

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


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

1
2
>>> urllib.urlencode({'abc':'d f', 'def': '-!2'})
'abc=d+f&def=-%212'


一个相当大的区别是移植python2到python3。python3不存在urlib2,其方法移植到urlib。因此,你使用的量很大,希望将来迁移到python3,考虑使用urllib。但是,2to3工具将自动为您完成大部分工作。


只是添加到现有的答案,我不提任何请求那湖不是一个土生土长的Python库。如果你是一个好的添加依赖关系,然后请求是精细。然而,如果你试图避免添加依赖关系,urllib母语是Python库,已经提供给你。


to get the content of a网址:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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和requestdependencies回答因为他们urlopen()函数功能:返回类型和不同requests.get()

  • a http.client.HTTPResponsepython2 urllib.request.urlopen()归来
  • python3 urllib.urlopen(url)返回instance
  • a requests.models.Response请求request.get(url)归来

您通常应该使用URLLIB2,因为这有时通过接受请求对象使事情变得更简单,而且还会引发协议错误的URLException。不过,使用谷歌应用引擎,你也不能使用。您必须使用Google在其沙盒python环境中提供的URL获取API。


A我找到失踪的关键点在上面的答案是urllib返回对象的类型而requests归来。

由于这个read()方法,可以用一个requestsurllib但不。

附注:requests已经有这么多丰富的方法,它不需要一个AS read();>