Работа с HTTP в Python, модуль Requests
09.03.2018
Теги: HTTP • Python • Web-разработка • Модуль
Модуль Requests не поставляется вместе с Python, поэтому сперва установим его, выполнив команду pip install requests
. Теперь попробуем получить веб-страницу. Как обычно, импортируем модуль и вызываем метод requests.get()
:
>>> import requests >>> res = requests.get('https://www.python.org') >>> type(res) <class 'requests.models.Response'> >>> res.status_code 200 >>> res.status_code == requests.codes.ok True >>> res.encoding 'utf-8' >>> len(res.text) 48844 >>> print(res.text) <!doctype html> <!--[if lt IE 7]> <html class="no-js ie6 lt-ie7 lt-ie8 lt-ie9"> ...
Метод requests.get()
возвращает объект Response
. Проверить успешность запроса можно с помощью свойства status_code
или вызвать метод raise_for_status()
для объекта Response
:
>>> res = requests.get('https://www.python.org/bla-bla-bla') >>> res.raise_for_status() Traceback (most recent call last): File "<pyshell#12>", line 1, in <module> res.raise_for_status() File "C:\python\lib\site-packages\requests\models.py", line 935, in raise_for_status raise HTTPError(http_error_msg, response=self) requests.exceptions.HTTPError: 404 Client Error: OK for url: https://www.python.org/bla-bla-bla
Если ошибка при загрузке страницы не является критичной для дальнейшей работы, можно обработать исключение:
res = requests.get('https://www.some-host.ru/bla-bla-bla') try: res.raise_for_status() except Exception as e: print('Ошибка при загрузке страницы: ' + str(e))
Ошибка при загрузке страницы: 404 Client Error: Not Found for url: http://www.some-host.ru/bla-bla-bla
При выполнении запроса, модуль requests
устанавливает кодировку на основании заголовков HTTP. Эта кодировка используется при обращении к res.text
. Если кодировка была определена неправильно, ее можно изменить:
res.encoding = 'ISO-8859-1'
Теперь посмотрим, как получить бинарные данные, например, изображение:
res = requests.get('http://www.some-host.ru/files/slider/4.jpg') imgFile = open('C:\\example\\slider.jpg', 'wb') imgFile.write(res.content) imgFile.close()
При потоковой загрузке (методу requests.get()
надо передать именованный аргумент stream=True
) рекомендуется использовать метод iter_content(size)
, который возвращает порции данных размером size
на каждой итерации:
with open(filename, 'wb') as f: for chunk in res.iter_content(100000): f.write(chunk)
Для передачи параметров в запросе, надо использовать параметр params
метода requests.get()
:
params = {'first': 'первый', 'second': 'второй'} res = requests.get('http://httpbin.org/get', params = params) print(res.url)
http://httpbin.org/get?first=%D0%BF%D0%B5%D1%80%D0%B2%D1%8B%D0%B9&second=%D0%B2%D1%82%D0%BE%D1%80%D0%BE%D0%B9
Любой ключ словаря, значение которого None
, не будет добавлен к строке запроса URL.
Дополнительно
Поиск: HTTP • Python • Web-разработка • Модуль