requests
大部分时间使用。有时urllib2
可以工作,但是需要更多代码,并且不够优雅。不要用urllib
。
urllib
Python 3中的另一个选择,已通过各种方式进行了清理。但值得庆幸的是,官方文档还指出“ 建议将请求包用于更高级别的HTTP客户端接口。 ”在21.6。urllib.request —用于打开URL的可扩展库— Python 3.6.3文档
requests
大部分时间使用。有时urllib2
可以工作,但是需要更多代码,并且不够优雅。不要用urllib
。
urllib
Python 3中的另一个选择,已通过各种方式进行了清理。但值得庆幸的是,官方文档还指出“ 建议将请求包用于更高级别的HTTP客户端接口。 ”在21.6。urllib.request —用于打开URL的可扩展库— Python 3.6.3文档
Answers:
我知道已经有人说过了,但我强烈建议您使用requests
Python软件包。
如果您使用的是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
这只是冰山一角。这是请求站点中的功能列表:
urllib
,并且其文档还正式指出“ 建议将Requests软件包用于更高级别的HTTP客户端接口。 ”在21.6。urllib.request —用于打开URL的可扩展库— Python 3.6.3文档,这urllib3
是requests
。
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)
请注意,urlencode()
仅在urllib中,而不在urllib2中。
还有一些处理程序,用于在urllib2中实现更高级的URL支持。简短的答案是,除非使用旧代码,否则可能要使用urllib2中的URL打开程序,但是对于某些实用程序功能,仍然需要导入urllib。
奖励答案 使用Google App Engine,您可以使用httplib,urllib或urllib2中的任何一个,但它们都只是Google URL Fetch API的包装。也就是说,您仍然受到端口,协议和允许的响应时间之类的相同限制。不过,您可以像期望的那样使用库的核心来获取HTTP URL。
urlopen()
和Request
从urllib2的,并使用urlencode()
从urllib的。只要确保使用正确的urlopen,使用这两个库都不会造成真正的危害。[urllib docs] [1]清楚地表明使用此方法是公认的用法。[1]:docs.python.org/library/urllib2.html#urllib2.urlopen
urllib2.urlopen
; 也包含其他变体。
requests
还允许自定义标头:docs.python-requests.org/en/master/user/quickstart / ...
urllib和urllib2都是Python模块,它们执行URL请求相关的内容,但提供不同的功能。
1)urllib2可以接受Request对象来设置URL请求的标头,而urllib仅接受URL。
2)urllib提供了urlencode方法,该方法用于生成GET查询字符串,而urllib2没有此功能。这是urllib与urllib2经常一起使用的原因之一。
Requests -Requests是一个使用Python编写的简单易用的HTTP库。
1)Python请求自动对参数进行编码,因此您只需将它们作为简单的参数传递,就与urllib不同,在urllib中,需要在传递参数之前使用urllib.encode()方法对参数进行编码。
2)它自动将响应解码为Unicode。
3)Requests还具有更方便的错误处理方式。如果您的身份验证失败,则urllib2将引发urllib2.URLError,而Requests将返回正常的响应对象。您需要通过boolean response.ok查看所有请求是否成功
我喜欢此urllib.urlencode
功能,并且似乎不存在urllib2
。
>>> urllib.urlencode({'abc':'d f', 'def': '-!2'})
'abc=d+f&def=-%212'
urllib
Python 3中的另一个选择是以各种方式进行清理。但值得庆幸的是,官方文档还指出“ 建议将请求包用于更高级别的HTTP客户端接口。 ”在21.6。urllib.request-用于打开URL的可扩展库
要获取网址的内容:
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.
很难request
为响应编写Python2和Python3以及依赖项代码,因为它们的urlopen()
功能和requests.get()
函数返回不同的类型:
urllib.request.urlopen()
返回一个http.client.HTTPResponse
urllib.urlopen(url)
返回一个instance
request.get(url)
返回一个requests.models.Response
通常应该使用urllib2,因为通过接受Request对象有时会使事情变得容易一些,并且还会在协议错误时引发URLException。但是,借助Google App Engine,您将无法使用任何一种。您必须使用Google在其沙盒Python环境中提供的URL Fetch API。