Question Quel est le moyen le plus rapide de HTTP GET en Python?


Quel est le moyen le plus rapide pour obtenir HTTP GET en Python si je sais que le contenu sera une chaîne? Je recherche les docs pour un one-liner rapide comme:

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

Mais tout ce que je peux trouver en utilisant Google sont httplib et urllib - et je suis incapable de trouver un raccourci dans ces bibliothèques.

Est-ce que Python 2.5 standard a un raccourci sous une forme comme ci-dessus, ou devrais-je écrire une fonction url_get?

  1. Je préférerais ne pas capturer le résultat de bombarder à wget ou curl.

440
2018-03-14 03:44


origine


Réponses:


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()

Documentation pour urllib.request et lis.

Comment c'est?


656
2018-03-14 03:48



Vous pouvez utiliser une bibliothèque appelée demande.

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

C'est assez facile. Ensuite, vous pouvez faire comme ceci:

>>> print r.status_code
>>> print r.headers
>>> print r.content

304
2018-04-08 01:30



Si vous voulez que la solution avec httplib2 soit intégrée, envisagez d’installer un objet HTTP anonyme

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

28
2018-03-14 16:40



Jettes un coup d'oeil à httplib2, qui - à côté de beaucoup de fonctionnalités très utiles - fournit exactement ce que vous voulez.

import httplib2

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

Où le contenu serait le corps de la réponse (en tant que chaîne), et resp contiendrait les en-têtes d'état et de réponse.

Il n'est pas inclus avec une installation python standard (mais il ne nécessite que python standard), mais cela vaut vraiment la peine de le vérifier.


18
2018-03-14 16:13



La solution de theller pour wget est vraiment utile, cependant, j'ai constaté qu'elle n'imprime pas la progression tout au long du processus de téléchargement. C'est parfait si vous ajoutez une ligne après l'instruction print dans 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

6
2018-01-05 01:21



Voici 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

5
2018-03-14 16:47



Excellentes solutions Xuan, Theller.

Pour qu'il fonctionne avec python 3, apportez les modifications suivantes

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

De plus, l'URL que vous entrez doit être précédée d'un "http: //", sinon une erreur de type url inconnue est renvoyée.


3
2018-06-24 14:18



Si vous travaillez avec des API HTTP spécifiquement, il existe également des choix plus pratiques tels que Sieste.

Par exemple, voici comment obtenir des gists de Github depuis 1er mai 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())

Plus d'exemples: https://github.com/kimmobrunfeldt/nap#examples


2
2018-05-22 17:08



Sans d'autres importations nécessaires, cette solution fonctionne (pour moi) - également avec 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()

J'ai souvent du mal à saisir le contenu lorsque je ne spécifie pas un "User-Agent" dans les informations d'en-tête. Ensuite, les demandes sont généralement annulées avec quelque chose comme: urllib2.HTTPError: HTTP Error 403: Forbidden ou urllib.error.HTTPError: HTTP Error 403: Forbidden.


2
2018-01-01 15:11