python - how - requests django
¿Cuál es la forma más rápida de HTTP GET en Python? (10)
Aquí hay un script wget en Python:
# 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
¿Cuál es la forma más rápida de HTTP GET en Python si sé que el contenido será una cadena? Estoy buscando en la documentación una línea rápida como:
contents = url.get("http://example.com/foo/bar")
Pero todo lo que puedo encontrar usando Google son httplib
y urllib
, y no puedo encontrar un acceso directo en esas bibliotecas.
¿Python 2.5 estándar tiene un método abreviado de alguna forma como arriba, o debo escribir una función url_get
?
- Preferiría no capturar la salida del bombardeo a
wget
ocurl
.
Eche un vistazo a httplib2 , que, junto a una gran cantidad de funciones muy útiles, proporciona exactamente lo que desea.
import httplib2
resp, content = httplib2.Http().request("http://example.com/foo/bar")
Donde contenido sería el cuerpo de la respuesta (como una cadena), y resp contendría los encabezados de estado y respuesta.
Sin embargo, no viene incluido con una instalación estándar de python (pero solo requiere python estándar), pero definitivamente vale la pena echarle un vistazo.
Excelentes soluciones Xuan, Theller.
Para que funcione con python 3 realice los siguientes cambios.
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
Además, la URL que ingrese debe ir precedida por un "http: //", de lo contrario, devuelve un error de tipo de URL desconocido.
La solución de theller para wget es realmente útil, sin embargo, descubrí que no imprime el progreso durante el proceso de descarga. Es perfecto si agrega una línea después de la declaración impresa en reporthook.
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
Podrías usar una biblioteca llamada requests .
import requests
r = requests.get("http://example.com/foo/bar")
Esto es bastante fácil. Entonces puedes hacer esto:
>>> print(r.status_code)
>>> print(r.headers)
>>> print(r.content)
Python 2.x:
import urllib2
contents = urllib2.urlopen("http://example.com/foo/bar").read()
Python 3.x:
import urllib.request
contents = urllib.request.urlopen("http://example.com/foo/bar").read()
Documentación para urllib.request y read .
¿Como es eso?
Si desea que la solución con httplib2 sea oneliner, considere crear una instancia de un objeto Http anónimo
import httplib2
resp, content = httplib2.Http().request("http://example.com/foo/bar")
Si está trabajando con API HTTP específicamente, también hay opciones más convenientes, como Nap .
Por ejemplo, aquí le explicamos cómo obtener ideas de Github desde el 1 de mayo de 2014 :
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())
Más ejemplos: https://github.com/kimmobrunfeldt/nap#examples
Sin más importaciones necesarias, esta solución funciona (para mí), también con 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()
A menudo tengo dificultades para captar el contenido cuando no especifico un "User-Agent" en la información del encabezado. Entonces, por lo general, las solicitudes se cancelan con algo como: urllib2.HTTPError: HTTP Error 403: Forbidden
o urllib.error.HTTPError: HTTP Error 403: Forbidden
.
Cómo enviar también encabezados.
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)