networking параллельные запросы - Каков самый быстрый способ HTTP GET в Python?





5 Answers

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

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

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

>>> print(r.status_code)
>>> print(r.headers)
>>> print(r.content)
асинхронные многопроцессорность многопоточность

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

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

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

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

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



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

import httplib2

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

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

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




Вот сценарий 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



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

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




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

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)



Related