750 Stimmen

Was ist der schnellste Weg zu HTTP GET in Python?

Was ist der schnellste Weg zu HTTP GET in Python, wenn ich weiß, dass der Inhalt eine Zeichenfolge sein wird? Ich suche in der Dokumentation nach einem schnellen Einzeiler wie:

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

Aber alles, was ich mit Google finden kann, sind httplib y urllib - und ich kann in diesen Bibliotheken keine Abkürzung finden.

Hat Standard-Python 2.5 eine Abkürzung in irgendeiner Form wie oben, oder sollte ich eine Funktion schreiben url_get ?

  1. Ich würde es vorziehen, nicht die Ausgaben für die wget o curl .

16voto

Katrych Taras Punkte 91

In Python können wir aus HTTP-Antworten wie aus Dateien lesen. Hier ist ein Beispiel für das Lesen von JSON aus einer API.

import json
from urllib.request import urlopen

with urlopen(url) as f:
    resp = json.load(f)

return resp['some_key']

9voto

michael_s Punkte 2405

Ohne weitere notwendige Importe funktioniert diese Lösung (bei mir) - auch mit 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()

Ich habe oft Schwierigkeiten, den Inhalt zu erfassen, wenn in den Header-Informationen kein "User-Agent" angegeben ist. Dann werden die Anfragen in der Regel mit etwas wie abgebrochen: urllib2.HTTPError: HTTP Error 403: Forbidden o urllib.error.HTTPError: HTTP Error 403: Forbidden .

7voto

Wie man auch Kopfzeilen sendet

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)

6voto

Xuan Punkte 4898

Thellers Lösung für wget ist wirklich nützlich, aber ich habe festgestellt, dass sie den Fortschritt während des Herunterladens nicht ausgibt. Es ist perfekt, wenn Sie eine Zeile nach der print-Anweisung in reporthook hinzufügen.

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

5voto

theller Punkte 2661

Hier ist ein wget-Skript in 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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X