Кто стучится в дверь ко мне?

Заголовки запроса — это инструкции серверу. С их помощью клиент уточняет свои предпочтения. Для их настройки в библиотеке Requests используется параметр headers метода get.

По умолчанию библиотека генерирует набор универсальных заголовков:

>>> import requests
>>>
>>> r = requests.get('http://google.com')
>>> r.request.headers
>>> {'Connection': 'keep-alive', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', \
    'user-agent': 'python-requests/2.4.1 CPython/2.7.10 Darwin/14.5.0'}
ключ значение инструкция
Connection keep-alive используй одно TCP-соединение для отправки и получения серии HTTP-запросов и ответов
Accept‑Encoding gzip, deflate сжимай контент алгоритмами gzip или deflate
Accept */* готов принять контент любого типа
User‑Agent python‑requests/... я — программа, написанная на Питоне. Мой автор использует библиотеку Requests, но не удосужился прочесть документацию, иначе он заменил бы этот заголовок... Простите, уже ухожу.

Первое, что проверяет сервер, дабы определить, кто к нему пришел — это заголовок User-Agent. Независимо от того, является ли наш краулер "вежливым" или нет, заголовок стоит поменять.

>>> import requests
>>>
>>> r = requests.get('http://google.com', headers={'user-agent': 'My Bot/0.1'})
>>> r.request.headers['user-agent']
>>> 'My Bot/0.1'

Чтобы замаскироваться под живого пользователя, подставьте туда имя какого-нибудь браузера. Например:

>>> UA_NAME = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:28.0) Gecko/20100101 Firefox/28.0'
>>> r = requests.get('http://google.com', headers={'user-agent': UA_NAME})

Что будем заказывать?

Чаще всего краулер рассчитан на обработку контента только одного формата (например, HTML). Так что, стоит изменить параметр Accept:

requests.get(URL, headers={'accept': 'text/html'})
requests.get(URL, headers={'accept': 'text/*'})
requests.get(URL, headers={'accept': 'text/html,application/xhtml+xml,application/xml'})

Когда сайт выдает контент на разных языках, имеет смысл задать один или несколько предпочтительных:

requests.get(URL, headers={'accept-language': 'ru'})
requests.get(URL, headers={'accept-language': 'ru, en-gb;q=0.8, en;q=0.7'})

Параметр q во второй строке — quality value — представляет собой число в диапазоне от 0 до 1, по умолчанию: 1. Инструкция означает: я предпочитаю русский, но готов принять британский английский, на худой конец — любой другой вариант английского.

Инструкции из серии Accept носят рекомендательный характер, никто не гарантирует, что вместо запрошенного простого текста в ответ не начнет грузиться видео-ролик размером в гигабайт, а вместо кириллицы — арабская вязь.


  1. Обратите внимание: requests.headers ведет себя как словарь, но ключи могут быть заданы в любом регистре. В документации HTTP-протокола обычно используется смешанный регистр. 

social

Яндекс.Метрика