Каков самый быстрый способ HTTP GET в Python?
Какой самый быстрый способ получить HTTP GET в Python, если я знаю, что содержимое будет строкой? Я ищу документацию для быстрого однострочного:
contents = url.get("http://example.com/foo/bar")
Но все, что я могу найти с помощью Google, это httplib
и urllib
- и я не могу найти ярлык в этих библиотеках.
Есть ли в стандартном Python 2.5 ярлык в некоторой форме, как указано выше, или мне следует написать функцию url_get
?
- Я бы предпочел не фиксировать результат обстрела как
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.