2009-03-14 13 views
397

Was ist der schnellste Weg zu HTTP GET in Python, wenn ich weiß, der Inhalt wird eine Zeichenfolge sein? Ich suche die Dokumentation für einen schnellen Einzeiler wie:Was ist der schnellste Weg zu HTTP GET in Python?

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

Aber alles, was ich Google verwenden finden httplib und urllib - und ich bin nicht in der Lage eine Verknüpfung in diesen Bibliotheken zu finden.

Does Standard Python 2.5 eine Verknüpfung in irgendeiner Form hat wie oben, oder soll ich eine Funktion schreiben url_get?

  1. würde ich es vorziehen, nicht die Ausgabe von Beschuss aus zu wget oder curl zu erfassen.
+20

One-Liner sind nicht unbedingt schneller. Fetish Code golf nicht. Sie müssen Geschwindigkeit messen; keine Codezeilen. –

+69

ähm, nein, ich habe hier gegoogelt, weil ich einem Experiment, das ich schreibe, eine Zeile hinzufügen musste; nicht das fertige Produkt. CPU-Zeit ist viel, viel billiger als Programmierer Zeit! – Phlip

+0

Ich habe gefunden, was ich hier gebraucht habe: http://Stackoverflow.com/a/385411/1695680 – ThorSummoner

Antwort

594

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

Dokumentation für urllib.request und read.

Wie ist das?

+25

Wird alles sauber gemacht? Es sieht so aus, als ob ich 'close' nach deinem' read' nennen sollte. Ist das notwendig? –

+4

Es ist eine gute Übung, es zu schließen, aber wenn Sie nach einem schnellen Einzeiler suchen, können Sie es weglassen. :-) –

+0

Für das, was es wert ist, funktioniert dasselbe mit urllib anstelle von urllib2 (zumindest für die meisten URLs). –

17

Werfen Sie einen Blick auf httplib2, die - neben einer Menge von sehr nützlichen Funktionen - bietet genau das, was Sie wollen.

Wo Inhalt wäre der Antworttext (als String) und resp würde die Status und Antwortheader enthalten.

Es ist aber nicht kommt mit einem Standard-Python enthalten installieren (aber es erfordert nur Standard-Python), aber es ist auf jeden Fall einen Besuch wert.

27

Wenn Sie Lösung wollen mit httplib2 sein oneliner

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

Hier ist ein wget Skript in Python instatntinating anonymen Http Objekt zu betrachten:

# 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 
6

Theller Lösung für wget ist wirklich nützlich, aber, Ich habe festgestellt, dass der Fortschritt während des Herunterladens nicht gedruckt wird. 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 
267

Sie eine Bibliothek requests genannt nutzen könnten.

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

Dies ist ziemlich einfach. Dann können Sie wie folgt tun:

>>> print r.status_code 
>>> print r.headers 
>>> print r.content 
+2

Ich merke, dass dies nicht in Amazon Lambda verfügbar ist ... – Fattie

+0

@JoeBlow nicht vergessen, dass Sie die externen Bibliotheken importieren müssen, um sie zu verwenden – MikeVelazco

+0

Fast jede Python-Bibliothek kann in AWS Lambda verwendet werden. Für reines Python müssen Sie nur diese Bibliothek "verkaufen" (kopieren Sie in die Ordner Ihres Moduls, anstatt "pip install" zu verwenden). Für nicht-reine Bibliotheken gibt es einen zusätzlichen Schritt - Sie müssen die lib auf eine Instanz von AWS Linux "pip installieren" (die gleiche OS-Variante lambdas läuft darunter), dann kopieren Sie diese Dateien stattdessen, damit Sie binäre Kompatibilität mit AWS Linux. Die einzigen Bibliotheken, die Sie nicht immer in Lambda verwenden können, sind solche mit nur Binärdistributionen, die glücklicherweise ziemlich selten sind. –

2

Wenn Sie mit HTTP-APIs speziell arbeiten, gibt es auch bequemer Entscheidungen wie Nap.

Zum Beispiel ist hier, wie Logen von Github zu bekommen, da 1. 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()) 

Weitere Beispiele: https://github.com/kimmobrunfeldt/nap#examples

3

Ausgezeichnete Lösungen Xuan, Theller.

Denn es 3 mit Python arbeiten machen folgende

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 

Auch Änderungen, Sie die URL eingeben sollte von einem vorangestellt werden „http: //“, andernfalls gibt es einen unbekannten URL-Typen Fehler.

1

Ohne weitere notwendigen Import diese Lösung (für mich) arbeitet - 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 greifen, wenn sie nicht einen „User-Agenten“ in den Header-Informationen angeben. Dann werden normalerweise die Anfragen mit etwas wie: urllib2.HTTPError: HTTP Error 403: Forbidden oder urllib.error.HTTPError: HTTP Error 403: Forbidden abgebrochen.

Verwandte Themen