it-swarm.com.de

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 ein String ist? 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 und urllib - und ich kann in diesen Bibliotheken keine Verknüpfung finden.

Hat Standard Python 2.5 eine Verknüpfung in der oben genannten Form oder sollte ich eine Funktion url_get schreiben?

  1. Ich würde es vorziehen, die Ausgabe des Beschusses nicht als wget oder curl zu erfassen.
566
Frank Krueger

Python 3:

_import urllib.request
contents = urllib.request.urlopen("http://example.com/foo/bar").read()
_

Python 2:

_import urllib2
contents = urllib2.urlopen("http://example.com/foo/bar").read()
_

Dokumentation für urllib.request und read .

814
Nick Presta

Sie könnten eine Bibliothek mit dem Namen Anfragen verwenden.

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

Das ist ganz einfach. Dann können Sie das machen:

>>> print(r.status_code)
>>> print(r.headers)
>>> print(r.content)
383
user1001237

Wenn Sie möchten, dass die Lösung mit httplib2 online ist, sollten Sie ein anonymes HTTP-Objekt instanziieren

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

Schauen Sie sich httplib2 an, das - neben vielen sehr nützlichen Funktionen - genau das bietet, was Sie wollen.

import httplib2

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

Wobei der Inhalt der Antworttext (als Zeichenfolge) ist und resp. Die Status- und Antwortheader enthält.

Es ist zwar nicht im Lieferumfang einer Standard-python -Installation enthalten (erfordert jedoch nur Standard-Python), aber es lohnt sich auf jeden Fall, es auszuprobieren.

19
Steven

die Lösung von Theller für Wget ist wirklich nützlich, ich fand jedoch, dass sie den Fortschritt während des gesamten Herunterladevorgangs nicht druckt. Es ist perfekt, wenn Sie eine Zeile nach der print-Anweisung in reporthook einfü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
5
Xuan

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 normalerweise mit etwas wie: urllib2.HTTPError: HTTP Error 403: Forbidden oder urllib.error.HTTPError: HTTP Error 403: Forbidden abgebrochen.

4
michael_s

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
4
theller

Mit urllib3 ist das ganz einfach.

Importiere es so:

import urllib3

pool_manager = urllib3.PoolManager()

Und machen Sie eine Anfrage wie folgt:

example_request = pool_manager.request("GET", "https://example.com")

print(example_request.data.decode("utf-8")) # Response text.
print(example_request.status) # Status code.
print(example_request.headers["Content-Type"]) # Content type.

Sie können auch Überschriften hinzufügen:

example_request = pool_manager.request("GET", "https://example.com", headers = {
    "Header1": "value1",
    "Header2": "value2"
})
4
Juniorized

So senden Sie auch Header

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)

Wenn Sie speziell mit HTTP-APIs arbeiten, gibt es auch bequemere Optionen wie Nap .

So erhalten Sie beispielsweise Informationen von Github seit dem 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

2
Kimmo

Ausgezeichnete Lösungen Xuan, Theller.

Damit es mit python 3 funktioniert, nehmen Sie die folgenden Änderungen vor

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

Darüber hinaus sollte der von Ihnen eingegebenen URL ein "http: //" vorangestellt werden, andernfalls wird ein unbekannter URL-Fehler zurückgegeben.

2
Akshar