如果我知道内容将是一个字符串,在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进行换壳的输出。
当前回答
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中,我们可以像从文件一样读取HTTP响应,这里有一个从API读取JSON的例子。
import json
from urllib.request import urlopen
with urlopen(url) as f:
resp = json.load(f)
return resp['some_key']
没有进一步的必要导入,这个解决方案工作(对我来说)-也与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的代码取消请求。HTTP错误403:禁止或urllib.error.HTTPError: HTTP错误403:禁止。
如果您专门使用HTTP api,还有更方便的选择,如Nap。
例如,以下是如何从2014年5月1日起从Github获得gist:
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())
更多例子:https://github.com/kimmobrunfeldt/nap#examples
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的文档。请求并阅读。
如果你想解决方案与httplib2是联机考虑实例化匿名Http对象
import httplib2
resp, content = httplib2.Http().request("http://example.com/foo/bar")