requests how example python http networking

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 ?

  1. Preferiría no capturar la salida del bombardeo a wget o curl .

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)