Quel est le moyen le plus rapide pour obtenir HTTP en Python?

Quel est le moyen le plus rapide pour obtenir HTTP en Python Si je sais que le contenu sera une chaîne de caractères? Je cherche dans le docs une doublure 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 ne suis pas en mesure de trouver un raccourci dans ces bibliothèques.

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

  1. Je préfère ne pas capturer la sortie de bombardements wget ou curl .
459
demandé sur nbro 2009-03-14 06:44:22
la source

10 ответов

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.demande et lire .

comment ça?

678
répondu Nick Presta 2018-02-28 01:14:11
la source

, Vous pouvez utiliser une bibliothèque appelée demandes .

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

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

>>> print(r.status_code)
>>> print(r.headers)
>>> print(r.content)
308
répondu Martin Thoma 2018-10-10 15:01:48
la source

si vous voulez que la solution avec httplib2 soit oneliner, considérez instantiating anonymous Http object

import httplib2
resp, content = httplib2.Http().request("http://example.com/foo/bar")
28
répondu to-chomik 2018-08-14 16:34:37
la source

regardez httplib2 , qui - à côté de nombreuses 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 réponse (sous forme de chaîne), et resp contiendrait les en-têtes de statut et de réponse.

il n'est pas fourni avec une installation standard de python (mais il ne nécessite que le python standard), mais il est certainement intéressant de vérifier.

17
répondu hennr 2017-09-29 13:12:06
la source

theller une solution de wget est vraiment utile, cependant, j'ai trouvé qu'il n'imprime pas le progrès tout au long du processus de téléchargement. Il est parfait si vous ajoutez une ligne après la déclaration d'impression 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
répondu Xuan 2010-01-05 04:21:33
la source

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
répondu theller 2009-03-14 19:47:32
la source

excellentes solutions Xuan, Theller.

pour qu'il fonctionne avec python 3 Faire les changements suivants""

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

en outre, L'URL que vous entrez doit être précédée d'un" http://", sinon il renvoie une erreur de type url inconnue.

3
répondu Akshar 2015-06-24 17:18:05
la source

sans autres importations nécessaires Cette solution fonctionne (pour moi) - aussi 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 de la difficulté à saisir le contenu lorsque je ne spécifie pas un" User-Agent " dans les informations d'en-tête. Ensuite, les requêtes sont généralement annulées avec quelque chose comme: urllib2.HTTPError: HTTP Error 403: Forbidden ou urllib.error.HTTPError: HTTP Error 403: Forbidden .

3
répondu michael_s 2018-01-01 18:11:48
la source

si vous travaillez avec les API HTTP spécifiquement, il existe aussi des choix plus commodes tels que Nap .

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

autres exemples: https://github.com/kimmobrunfeldt/nap#examples

2
répondu Kimmo 2014-05-22 21:15:49
la source

Comment envoyer aussi des en-têtes

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)
0
la source

Autres questions sur python networking http