Что такое заголовки HTTP-запросов и как их использовать при парсинге
HTTP-заголовки позволяют серверу и клиенту передавать дополнительную информацию через HTTP-ответ или запрос. Если вы используете веб-скрейпинг для сбора данных для вашего бизнеса, вы можете оптимизировать HTTP-заголовки, чтобы снизить вероятность того, что ваш API будет забанен целевым сервером. Вы также можете использовать их для ускорения.
Что такое HTTP-заголовки?
HTTP-заголовок — это часть протокола передачи гипертекста (HTTP). Цель заголовка — передача дополнительных данных между клиентами и сервером через заголовок ответа и запроса. Заголовок HTTP состоит из имени без учета регистра, за которым следует двоеточие, и его значения, например content-length: 20166 и access-control-allow-credentials: true.

Просмотреть заголовки HTTP в Internet Explorer можно следующим образом:

  1. Запустите встроенные инструменты разработчика IE, нажав F12.
  2. Откройте инструмент «Сеть» с помощью Ctrl + 4.
  3. Вручную запустите сбор данных с помощью F5.
  4. Кликните двойной щелчок на имени каждого объекта для просмотра HTTP-заголовков.
Типы HTTP-заголовков
Заголовки могут быть сгруппированы несколькими способами. Прежде всего, их можно сгруппировать в соответствии с их контекстом:

  • Заголовок ответа HTTP: Эти заголовки содержат дополнительные данные о полученном клиентом запросе, например, сервер, предоставивший его, или его местоположение.
  • Заголовок запроса HTTP: Заголовки HTTP-запросов отправляются клиентом, машиной, делающей запрос, в HTTP-транзакции. Эти заголовки (например, http_accept) передают много информации об источнике запроса, включая тип и версию используемого приложения или браузера. Именно с этим типом заголовков вы должны быть наиболее хорошо знакомы, чтобы улучшить свои начинания в области парсинга.
  • Заголовок сущности HTTP: Заголовки сущностей содержат данные о теле ресурса — длину содержимого и тип Multipurpose Internet Mail Extensions (MIME).
  • Общий заголовок HTTP: Эти заголовки применяются к ответам и запросам. Однако они не относятся к содержимому.
Можно также классифицировать назначение заголовков в зависимости от того, как их обрабатывают прокси-серверы:

  • TE: Этот заголовок запроса показывает кодировки передачи, которые готов принять агент пользователя.
  • Keep-Alive: HTTP-заголовок Keep-Alive поддерживает соединение между сервером и клиентом, сокращая время, необходимое для обслуживания файлов.
  • Connection: HTTP-заголовок Connection контролирует, остается ли сетевое соединение открытым после завершения текущей транзакции. Если передано значение keep-alive, соединение не будет закрыто. В результате заголовок позволяет выполнять последующие запросы к тому же серверу. Connection помогает получать и отправлять несколько HTTP-ответов и запросов, используя одно TCP-соединение.
  • Proxy-Authenticate: Этот заголовок ответа позволяет прокси-серверу передавать запрос дальше, осуществляя аутентификацию.
  • Proxy-Authorization: Этот заголовок содержит учетные данные для аутентификации агента пользователя на прокси-сервере.
  • Trailer (трейлер): Этот заголовок позволяет отправителю включать дополнительные поля в конец сообщений, разбитых на части. Отправители могут использовать Trailer для предоставления потенциально динамически генерируемых метаданных, если это необходимо, например, для предоставления информации о контексте данных в запросе.
  • Upgrade: Этот заголовок может использоваться только для обновления предварительно установленного соединения сервера и клиента на другой протокол. Например, клиент может обновить соединение с HTTP или HTTPS до WebSocket.
Наконец, вы можете разделить заголовки в зависимости от специфики некэширующих и кэширующих прокси-серверов:

  1. Hop-by-hop заголовки: Эти заголовки предназначены только для одного соединения на уровне передачи. Они потребляются и обрабатываются прокси, который в данный момент обрабатывает запрос, поэтому они не пересылаются прокси и не сохраняются в кэше.
  2. Конечные заголовки: Эти заголовки передаются только конечному получателю ответа или запроса, которым является сервер для запроса и клиент для ответа. Кэш должен хранить эти заголовки, а промежуточные прокси должны передавать их без изменений.

Список заголовков HTTP-запросов
Поля заголовков HTTP — это списки строк, получаемых и отправляемых сервером и клиентом при каждом запросе и ответе HTTP. Обычно они невидимы для конечных пользователей, их регистрируют или обрабатывают только клиентские и серверные приложения. Ниже представлено несколько примеров распространенных заголовков HTTP.

Поля Accept указывают, какой тип ответа принимает сервер. Общий синтаксис следующий:
Accept: <MIME_type>/<MIME_subtype) ;q=value


Они включают:
  • Accept: Это поле сообщает серверу, какие данные могут быть возвращены.
  • Accept-Charset: Вы можете использовать это поле в заголовках HTTP, чтобы указать, какие наборы символов клиент принимает для ответа. Если существует несколько наборов символов, вы можете ввести их через запятую.
  • Accept-Encoding: Это поле заголовка ограничивает допустимые алгоритмы кодирования для ответа.
  • Accept-Language: Это поле информирует сервер о том, на каком человекочитаемом языке сервер, вероятно, вернет ответ.

Авторизация
Это поле верифицирует агент пользователя с сервером. Синтаксис следующий:
Authorization: <тип> <учетные данные>

Host
В поле Host указывается номер порта и интернет-хост для запрашиваемого ресурса. Синтаксис следующий:
Host: host:port
Если номер порта отсутствует, поле будет использовать порт по умолчанию 80.

Referer
Это поле позволяет клиенту указать URL ресурса, с которого был запрошен URL. Синтаксис следующий:
Referer: URL

User-Agent
Поле User-Agent отправляет данные клиента на сервер. Синтаксис следующий:
User-Agent: <продукт>/<версия продукта> <коммент>.


Как установить HTTP-заголовки
Вы можете установить HTTP-заголовки, открыв свою интегрированную среду разработки (IDE), импортировать и использовать нужные вам HTTP-заголовки.


Например, предположим, вы хотите установить несколько User-Agents, чтобы обойти антискрейпинговые инструменты и показать им, якобы у вас несколько скрейперов. Вы можете скопировать нужные вам User-Agents из этого списка и добавить их к вашему скрейперу в вашей IDE.
Как HTTP-заголовки могут способствовать парсингу?
Вы можете использовать HTTP-заголовки для ускорения и упрощения процесса веб-скрейпинга — сбора данных из интернета. Если вы используете API через готовый скрейпер, как, например, Scraping Robot, вам понадобятся заголовки запроса, подобные вышеупомянутым. Они предоставляют больше информации серверу, обрабатывающему ваш запрос, и могут помочь вам быстрее собрать данные.
Минимизация рисков быть забаненным целевыми серверами
Большинство современных веб-администраторов знают, что их данные, скорее всего, будут парситься конкурентами, которые хотят понять, как работает их бизнес. Поэтому они используют инструменты для автоматического бана подозрительных запросов пользователей, например, нескольких запросов, поступающих с одного IP-адреса. Некоторые веб-серверы могут даже показывать неверную информацию при обнаружении подозрительных пользовательских агентов.


К счастью, вы можете использовать HTTP-заголовки для минимизации шансов быть забаненным. Например, вы можете манипулировать и создавать различные строки заголовков User-Agent, чтобы создать впечатление, что вы являетесь несколькими органическими пользователями, а не веб-скрейпером. В частности, вы можете назначить каждому «пользователю» разные браузеры, чтобы создать впечатление, что запросы поступают из разных браузеров на разных компьютерах. Пример: один пользователь использует Mozilla Firefox на macOS Catalina 10.15.4, а другой — Chrome на Microsoft Windows 10.


Аналогичным образом можно использовать заголовок запроса Referer — который показывает, на каком сайте находился пользователь до перехода на целевой сайт — для минимизации шансов быть заблокированным. Веб-сайты часто блокируют пользователей, которые напрямую переходят на их сайт, поскольку они, скорее всего, являются ботами. Соответственно, вы можете сделать процесс веб-скрейпинга более «человечным», направив заголовок Referer на случайный сайт, например, https://www.google.com