如果我知道内容将是一个字符串,那么在Python中使用HTTP GET的最快方法是什么?我正在搜索文档中的快速单行,如:
contents = url.get("http://example.com/foo/bar")
但我使用Google找到的只有httplib
和urllib
- 我无法在这些库中找到快捷方式。
标准Python 2.5是否有如上所述的某种形式的快捷方式,还是应该编写函数url_get
?
wget
或curl
。答案 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.request
和read
的文档。
答案 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: Forbidden
或urllib.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())
答案 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']