Работа с HTTP в Python, модуль Requests

09.03.2018

Теги: HTTPPythonWeb-разработкаМодуль

Модуль 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-разработка • Модуль

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.