在Python中使用HTTP GET的最快方法是什么?

时间:2009-03-14 03:44:22

标签: python http networking

如果我知道内容将是一个字符串,那么在Python中使用HTTP GET的最快方法是什么?我正在搜索文档中的快速单行,如:

contents = url.get("http://example.com/foo/bar")

但我使用Google找到的只有httpliburllib - 我无法在这些库中找到快捷方式。

标准Python 2.5是否有如上所述的某种形式的快捷方式,还是应该编写函数url_get

  1. 我不希望将炮击的输出捕获到wgetcurl

14 个答案:

答案 0 :(得分:776)

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.requestread的文档。

答案 1 :(得分:365)

您可以使用名为requests的库。

import requests
r = requests.get("http://example.com/foo/bar")

这很容易。然后你可以这样做:

>>> print(r.status_code)
>>> print(r.headers)
>>> print(r.content)

答案 2 :(得分:29)

如果你想让httplib2的解决方案成为oneliner考虑实例化匿名Http对象

import httplib2
resp, content = httplib2.Http().request("http://example.com/foo/bar")

答案 3 :(得分:19)

查看httplib2,其中包含许多非常有用的功能,可以提供您想要的内容。

import httplib2

resp, content = httplib2.Http().request("http://example.com/foo/bar")

如果内容是响应主体(作为字符串),则resp将包含状态和响应标头。

它不包含在标准的python安装中(但它只需要标准的python),但它绝对值得一试。

答案 4 :(得分:5)

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

答案 5 :(得分:4)

这是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

答案 6 :(得分:4)

如果没有进一步必要的导入,这个解决方案(对我而言)也适用 - 也可以使用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: Forbiddenurllib.error.HTTPError: HTTP Error 403: Forbidden

答案 7 :(得分:3)

如何发送标头

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)

答案 8 :(得分:3)

使用events.js:183 throw er; // Unhandled 'error' event ^ Error: listen EADDRINUSE :::5000 at Object._errnoException (util.js:1022:11) at _exceptionWithHostPort (util.js:1044:20) at Server.setupListenHandle [as _listen2] (net.js:1367:14) at listenInCluster (net.js:1408:12) at Server.listen (net.js:1492:7) at Function.listen (/Users/user/Documents/_Work/cd/MERN/vs-mern-list/node_modules/express/lib/application.js:618:24) at Object.<anonymous> (/Users/user/Documents/_Work/cd/MERN/vs-mern-list/server.js:18:5) at Module._compile (module.js:652:30) at Object.Module._extensions..js (module.js:663:10) at Module.load (module.js:565:32) at tryModuleLoad (module.js:505:12) at Function.Module._load (module.js:497:3) at Function.Module.runMain (module.js:693:10) at startup (bootstrap_node.js:188:16) at bootstrap_node.js:609:3 [nodemon] app crashed - waiting for file changes before starting... 很简单。

这样导入:

urllib3

并发出这样的请求:

import urllib3

pool_manager = urllib3.PoolManager()

您也可以添加标题:

example_request = pool_manager.request("GET", "https://example.com")

print(example_request.data.decode("utf-8")) # Response text.
print(example_request.status) # Status code.
print(example_request.headers["Content-Type"]) # Content type.

答案 9 :(得分:2)

如果您专门使用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())

更多示例:https://github.com/kimmobrunfeldt/nap#examples

答案 10 :(得分:2)

优秀的解决方案Xuan,Theller。

为了使用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

此外,您输入的网址前面应有&#34; http://&#34;否则会返回未知的网址类型错误。

答案 11 :(得分:1)

对于python >= 3.6,您可以使用dload

import dload
t = dload.text(url)

对于json

j = dload.json(url)

安装:
pip install dload

答案 12 :(得分:1)

如果您需要较低级别的API:

import http.client

conn = http.client.HTTPSConnection('example.com')
conn.request('GET', '/')

resp = conn.getresponse()
content = resp.read()

conn.close()

text = content.decode('utf-8')

print(text)

答案 13 :(得分:0)

实际上,在python中,我们可以从文件中读取url,这是从API读取json的示例。

import json

from urllib.request import urlopen

with urlopen(url) as f:

resp = json.load(f)

return resp['some_key']