如果我知道内容将是字符串,那么用Python进行HTTP GET的最快方法是什么?我正在搜索文档,以查找像以下这样的快速单行代码:
contents = url.get("http://example.com/foo/bar")
但是,所有我能找到使用谷歌是httplib
和urllib
-我无法找到这些库中的快捷方式。
标准Python 2.5是否具有上述某种形式的快捷方式,还是应该编写一个函数url_get
?
- 我宁愿不捕获对
wget
或的炮击输出curl
。
如果我知道内容将是字符串,那么用Python进行HTTP GET的最快方法是什么?我正在搜索文档,以查找像以下这样的快速单行代码:
contents = url.get("http://example.com/foo/bar")
但是,所有我能找到使用谷歌是httplib
和urllib
-我无法找到这些库中的快捷方式。
标准Python 2.5是否具有上述某种形式的快捷方式,还是应该编写一个函数url_get
?
wget
或的炮击输出curl
。Answers:
Python 3:
import urllib.request
contents = urllib.request.urlopen("http://example.com/foo/bar").read()
Python 2:
import urllib2
contents = urllib2.urlopen("http://example.com/foo/bar").read()
urllib.request
和的文档read
。
close
你read
。那有必要吗?
read
。但是,一个with
块将是Jython中,等更清晰,更安全
requests
效果很好
r = urllib2.urlopen("http://blah.com/blah")
然后text = r.read()
。它是同步的,它只等待“文本”中的结果。
您可以使用一个称为request的库。
import requests
r = requests.get("http://example.com/foo/bar")
这很容易。然后您可以这样做:
>>> print(r.status_code)
>>> print(r.headers)
>>> print(r.content)
pip install
)。对于非纯库,还有一个额外的步骤-您需要pip install
将lib库保存到一个AWS Linux实例(运行相同的OS变体lambda)上,然后复制这些文件,以便与AWS Linux具有二进制兼容性。您不能始终在Lambda中使用的唯一库只有二进制分发库,这是非常罕见的。
pip install requests
。
from botocore.vendored import requests
用法 response = requests.get('...')
强大的urllib3
库就足够简单了。
像这样导入它:
import urllib3
http = urllib3.PoolManager()
并发出这样的请求:
response = http.request('GET', 'https://example.com')
print(response.data) # Raw data.
print(response.data.decode('utf-8')) # Text.
print(response.status) # Status code.
print(response.headers['Content-Type']) # Content type.
您也可以添加标题:
response = http.request('GET', 'https://example.com', headers={
'key1': 'value1',
'key2': 'value2'
})
可以在urllib3文档中找到更多信息。
urllib3
比内置模块urllib.request
或http
模块更安全,更易于使用,并且稳定。
theller的wget解决方案确实很有用,但是,我发现它无法在整个下载过程中打印出进度。如果在reporthook中的print语句后添加一行,那是完美的。
import sys, urllib
def reporthook(a, b, c):
print "% 3.1f%% of %d bytes\r" % (min(100, float(a * b) / c * 100), c),
sys.stdout.flush()
for url in sys.argv[1:]:
i = url.rfind("/")
file = url[i+1:]
print url, "->", file
urllib.urlretrieve(url, file, reporthook)
print
这是Python中的wget脚本:
# From python cookbook, 2nd edition, page 487
import sys, urllib
def reporthook(a, b, c):
print "% 3.1f%% of %d bytes\r" % (min(100, float(a * b) / c * 100), c),
for url in sys.argv[1:]:
i = url.rfind("/")
file = url[i+1:]
print url, "->", file
urllib.urlretrieve(url, file, reporthook)
print
无需其他必要的导入,此解决方案(对我而言)有效-也适用于https:
try:
import urllib2 as urlreq # Python 2.x
except:
import urllib.request as urlreq # Python 3.x
req = urlreq.Request("http://example.com/foo/bar")
req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36')
urlreq.urlopen(req).read()
在标头信息中未指定“ User-Agent”时,通常很难抓住内容。然后通常会使用类似的取消请求:urllib2.HTTPError: HTTP Error 403: Forbidden
或urllib.error.HTTPError: HTTP Error 403: Forbidden
。
如何发送标头
Python 3:
import urllib.request
contents = urllib.request.urlopen(urllib.request.Request(
"https://api.github.com/repos/cirosantilli/linux-kernel-module-cheat/releases/latest",
headers={"Accept" : 'application/vnd.github.full+json"text/html'}
)).read()
print(contents)
Python 2:
import urllib2
contents = urllib2.urlopen(urllib2.Request(
"https://api.github.com",
headers={"Accept" : 'application/vnd.github.full+json"text/html'}
)).read()
print(contents)
如果您专门使用HTTP API,那么还有更方便的选择,例如Nap。
例如,以下是自2014年5月1日起从Github获取要点的方法:
from nap.url import Url
api = Url('https://api.github.com')
gists = api.join('gists')
response = gists.get(params={'since': '2014-05-01T00:00:00Z'})
print(response.json())
出色的解决方案轩,塞勒。
为了使其与python 3配合使用,请进行以下更改
import sys, urllib.request
def reporthook(a, b, c):
print ("% 3.1f%% of %d bytes\r" % (min(100, float(a * b) / c * 100), c))
sys.stdout.flush()
for url in sys.argv[1:]:
i = url.rfind("/")
file = url[i+1:]
print (url, "->", file)
urllib.request.urlretrieve(url, file, reporthook)
print
另外,您输入的URL之前应带有“ http://”,否则将返回未知的URL类型错误。
实际上,在python中,我们可以从文件中读取url,这是从API读取json的示例。
import json
from urllib.request import urlopen
with urlopen(url) as f:
resp = json.load(f)
return resp['some_key']