Jaki jest najszybszy sposób na HTTP GET w Pythonie?

Jaki jest najszybszy sposób na HTTP GET w Pythonie, jeśli Wiem, że zawartość będzie ciągiem znaków? Poszukuję docs ' a szybkiego jednośladu typu:

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

Ale wszystko, co mogę znaleźć za pomocą Google to httplib i urllib - i nie jestem w stanie znaleźć skrótu w tych bibliotekach.

Czy standardowy Python 2.5 mA skrót w jakiejś formie jak wyżej, czy powinienem napisać funkcję url_get?

  1. wolałbym nie przechwytywać wyjścia z wget lub curl.
Author: nbro, 2009-03-14

10 answers

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

Dokumentacja dla urllib.Prośba iprzeczytaj .

Jak to?
 678
Author: Nick Presta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-27 22:14:11

Możesz użyć biblioteki o nazwie requests .

import requests
r = requests.get("http://example.com/foo/bar")
To dość proste. Wtedy możesz zrobić tak:
>>> print(r.status_code)
>>> print(r.headers)
>>> print(r.content)
 308
Author: Martin Thoma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-10 12:01:48

Jeśli chcesz, aby rozwiązanie z httplib2 było oneliner rozważ utworzenie anonimowego obiektu Http

import httplib2
resp, content = httplib2.Http().request("http://example.com/foo/bar")
 28
Author: to-chomik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-14 13:34:37

Spójrz na httplib2 , który - obok wielu bardzo przydatnych funkcji - zapewnia dokładnie to, czego chcesz.

import httplib2

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

Gdzie zawartość byłaby ciałem odpowiedzi (jako ciąg znaków), a resp zawierałoby nagłówki statusu i odpowiedzi.

Nie jest dołączany do standardowej instalacji Pythona (ale wymaga tylko standardowego Pythona), ale zdecydowanie warto to sprawdzić.

 17
Author: hennr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-29 10:12:06

Rozwiązanie dla wget jest naprawdę przydatne, jednak okazało się, że nie drukuje postępu w całym procesie pobierania. Jest to idealne rozwiązanie, jeśli dodasz jedną linię po instrukcji print w 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
Author: Xuan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-05 01:21:33

Oto skrypt wget w Pythonie:

# 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
Author: theller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-14 16:47:32

Excellent solutions Xuan, Theller.

Do pracy z Pythonem 3 Wprowadź następujące zmiany

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

Również adres URL, który wprowadzasz powinien być poprzedzony "http://", w przeciwnym razie zwraca nieznany błąd typu url.

 3
Author: Akshar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-24 14:18:05

Bez dalszych niezbędnych importów To rozwiązanie działa (dla mnie) - również z 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()

Często mam trudności z pobraniem zawartości, gdy nie określam "User-Agent"w informacji nagłówka. Następnie zwykle żądania są anulowane za pomocą czegoś w rodzaju: urllib2.HTTPError: HTTP Error 403: Forbidden lub urllib.error.HTTPError: HTTP Error 403: Forbidden.

 3
Author: michael_s,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-01 15:11:48

Jeśli pracujesz konkretnie z interfejsami API HTTP, istnieją również wygodniejsze opcje, takie jak Nap .

Na przykład, oto jak uzyskać GIST z Github od 1 maja 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())

Więcej przykładów: https://github.com/kimmobrunfeldt/nap#examples

 2
Author: Kimmo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-22 17:15:49

Jak również wysyłać nagłówki

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
Author: Ciro Santilli 新疆改造中心 六四事件 法轮功,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-16 06:22:04