Каков самый быстрый способ HTTP GET в Python?

Какой самый быстрый способ получить HTTP GET в Python, если я знаю, что содержимое будет строкой? Я ищу документацию для быстрого однострочного:

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

Но все, что я могу найти с помощью Google, это httplib и urllib - и я не могу найти ярлык в этих библиотеках.

Есть ли в стандартном Python 2.5 ярлык в некоторой форме, как указано выше, или мне следует написать функцию url_get?

  1. Я бы предпочел не фиксировать результат обстрела как wget или curl.

Ответ 1

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

Документацию для urllib.request и read.

Ответ 2

Вы можете использовать библиотеку под названием запросы.

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

Это довольно просто. Тогда вы можете сделать так:

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

Ответ 3

Если вы хотите, чтобы решение с httplib2 было oneliner, рассмотрите возможность создания анонимного объекта Http

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

Ответ 4

Посмотрите httplib2, который - рядом с множеством очень полезных функций - обеспечивает именно то, что вы хотите.

import httplib2

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

Где будет тело ответа (как строка), а resp будет содержать заголовки состояния и ответа.

Он не входит в стандартную установку python (но для этого требуется только стандартный python), но это определенно стоит проверить.

Ответ 5

theller решение для wget действительно полезно, однако я обнаружил, что он не распечатывает прогресс в процессе загрузки. Это идеально, если вы добавите одну строку после оператора печати в отчете.

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

Здесь находится wget script в 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

Ответ 7

Без дальнейшего необходимого импорта это решение работает (для меня) - также с 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()

У меня часто возникают трудности с захватом контента, если в информации заголовка не указан "Агент пользователя". Затем обычно запросы отменяются с помощью чего-то вроде: urllib2.HTTPError: HTTP Error 403: Forbidden или urllib.error.HTTPError: HTTP Error 403: Forbidden.

Ответ 8

Как также отправлять заголовки

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)

Ответ 9

Это достаточно просто с urllib3.

Импортируйте это так:

import urllib3

pool_manager = urllib3.PoolManager()

И сделайте запрос вот так:

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.

Вы также можете добавить заголовки:

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

Ответ 10

Если вы работаете с API HTTP специально, есть также более удобный выбор, например Nap.

Например, здесь, как получить gists от Github с 1 мая 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())

Другие примеры: https://github.com/kimmobrunfeldt/nap#examples

Ответ 11

Отличные решения Xuan, Theller.

Для работы с python 3 выполните следующие изменения

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

Кроме того, URL, который вы вводите, должен предшествовать "http://", иначе он возвращает неизвестную ошибку типа URL.