Fra*_*ger 589 python networking http
如果我知道内容将是一个字符串,那么在Python中使用HTTP GET的最快方法是什么?我正在搜索文档中的快速单行,如:
contents = url.get("http://example.com/foo/bar")
Run Code Online (Sandbox Code Playgroud)
但是,所有我能找到使用谷歌是httplib和urllib-我无法找到这些库中的快捷方式.
标准Python 2.5是否具有上述某种形式的快捷方式,还是应该编写函数url_get?
wget或curl.Nic*_*sta 847
Python 2.x:
import urllib.request
contents = urllib.request.urlopen("http://example.com/foo/bar").read()
Run Code Online (Sandbox Code Playgroud)
Python 3.x:
import urllib2
contents = urllib2.urlopen("http://example.com/foo/bar").read()
Run Code Online (Sandbox Code Playgroud)
那个怎么样?
小智 394
您可以使用名为requests的库.
import requests
r = requests.get("http://example.com/foo/bar")
Run Code Online (Sandbox Code Playgroud)
这很容易.然后你可以这样做:
>>> print(r.status_code)
>>> print(r.headers)
>>> print(r.content)
Run Code Online (Sandbox Code Playgroud)
小智 29
如果你想让httplib2的解决方案成为oneliner考虑实例化匿名Http对象
import httplib2
resp, content = httplib2.Http().request("http://example.com/foo/bar")
Run Code Online (Sandbox Code Playgroud)
小智 19
看看httplib2,它旁边有许多非常有用的功能 - 提供你想要的.
import httplib2
resp, content = httplib2.Http().request("http://example.com/foo/bar")
Run Code Online (Sandbox Code Playgroud)
其中content将是响应主体(作为字符串),resp将包含状态和响应标头.
它不包含在标准的python安装中(但它只需要标准的python),但它绝对值得一试.
小智 15
实际上,在 Python 中,我们可以像从文件中一样从 HTTP 响应中读取数据,下面是从 API 读取 JSON 的示例。
import json
from urllib.request import urlopen
with urlopen(url) as f:
resp = json.load(f)
return resp['some_key']
Run Code Online (Sandbox Code Playgroud)
如何同时发送标头
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)
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
无需进一步必要的导入,此解决方案(对我而言)有效 - 也适用于 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()
Run Code Online (Sandbox Code Playgroud)
在标题信息中未指定“用户代理”时,我经常难以抓取内容。然后通常请求会被取消,例如:urllib2.HTTPError: HTTP Error 403: Forbidden或urllib.error.HTTPError: HTTP Error 403: Forbidden。
这是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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
足够简单了urllib3。
像这样导入它:
import urllib3
pool_manager = urllib3.PoolManager()
Run Code Online (Sandbox Code Playgroud)
并发出这样的请求:
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.
Run Code Online (Sandbox Code Playgroud)
您也可以添加标题:
example_request = pool_manager.request("GET", "https://example.com", headers = {
"Header1": "value1",
"Header2": "value2"
})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
718523 次 |
| 最近记录: |