Какой самый быстрый способ получить HTTP GET в Python? - PullRequest
536 голосов
/ 14 марта 2009

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

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

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

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

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

Ответы [ 11 ]

783 голосов
/ 14 марта 2009

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.

370 голосов
/ 08 апреля 2013

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

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

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

>>> print(r.status_code)
>>> print(r.headers)
>>> print(r.content)
29 голосов
/ 14 марта 2009

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

import httplib2
resp, content = httplib2.Http().request("http://example.com/foo/bar")
19 голосов
/ 14 марта 2009

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

import httplib2

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

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

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

5 голосов
/ 05 января 2010

Решение Theler от Wget действительно полезно, однако я обнаружил, что оно не распечатывает процесс загрузки. Идеально, если вы добавите одну строку после оператора print в 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
4 голосов
/ 01 января 2018

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

4 голосов
/ 14 марта 2009

Вот скрипт wget на 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
3 голосов
/ 25 февраля 2019

Это достаточно просто с 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"
})
3 голосов

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

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)
2 голосов
/ 24 июня 2015

Отличные решения 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...