Заголовки запроса
Метаданные в формате «ключ-значение», отправляемые с каждым HTTP-запросом и описывающие клиента, принимаемый контент и контекст запроса.
Заголовки запроса - это метаданные, которые клиент отправляет с каждым HTTP-запросом в виде пар «ключ-значение» перед телом. Они сообщают серверу о клиенте и запросе: User-Agent (браузер), Accept и Accept-Language (какой контент и язык нужны), Referer (предыдущая страница), Cookie (состояние сессии) и многое другое. Сервер использует их, чтобы решить, как ответить.
Для скрапинга заголовки - крупная поверхность обнаружения. Реальные браузеры отправляют конкретный, согласованный набор заголовков в определённом порядке. HTTP-библиотеки по умолчанию отправляют скудный, необычный набор - часто лишь ботовый user-agent и почти ничего больше. Антибот-системы сравнивают ваши заголовки с тем, что отправил бы реальный браузер, и помечают несоответствия.
Сделать заголовки правильными - это больше, чем выставить браузерный User-Agent. Полный набор должен быть согласованным: Accept, Accept-Language, Accept-Encoding и Sec-* заголовки должны совпадать с браузером, за который вы себя выдаёте, в том порядке, в котором этот браузер их отправляет. Chrome-заголовок user-agent с заголовками, которые Chrome никогда бы не отправил, - очевидная примета.
Анонимность тоже живёт в заголовках. Прозрачный прокси добавляет X-Forwarded-For, раскрывающий ваш реальный IP; elite-прокси не отправляет ни одного из них. Когда вы проверяете анонимность прокси, чекер инспектирует ровно те заголовки, которые прокси передаёт цели - разница между elite и transparent записана в заголовках запроса.
Метаданные, которые приходят с каждым запросом
Заголовки сопровождают каждый HTTP-запрос и описывают клиента и то, чего он хочет: какие типы содержимого он принимает, какие языки, какие кодировки, продолжает ли он сессию, откуда пришёл.
Настоящие браузеры отправляют определённый набор в определённом порядке, и этот порядок удивительно устойчив для каждого браузера и версии. HTTP-библиотеки отправляют меньше заголовков и в другом порядке, а это дешёвый и надёжный признак для всех, кто смотрит.
Заголовки тоже обязаны согласовываться со всем остальным. Немецкий адрес выхода, отправляющий Accept-Language: ru-RU, при том что рукопожатие TLS говорит «Python», это не посетитель из Германии, причём ни один из признаков по отдельности неверным быть не обязан.
Как привести заголовки в порядок вместе с адресом
Прокси выбирает, где вы предположительно находитесь. Заголовки должны рассказывать ту же историю:
Согласованный набор
Accept-Language: en-US,en;q=0.9 matches login_c_US
Accept-Encoding: gzip saves money on metered products
User-Agent: generated by the browser, not typed by hand
Referer: present when a person would have arrived from somewhere- Отправляйте Accept-Encoding: gzip на резидентке. Сжатие это самая крупная разовая экономия на тарифицируемом продукте.
- Приводите Accept-Language в соответствие со страной прокси. Сайты опираются на него не меньше, чем на адрес, решая, что вам отдать.
- Не собирайте браузерные заголовки вручную. Берите настоящий браузер или библиотеку имперсонации, которая ещё и порядок соблюдает.
- Проверяйте, что доходит на самом деле: дёрните через прокси сервис-эхо заголовков и прочитайте результат.
Заблуждения о заголовках
Правка заголовков не маскирует библиотеку
Порядок и отпечаток TLS её всё равно опознают, и теперь они противоречат вашим заголовкам.
Больше заголовков не значит человечнее
Настоящие браузеры отправляют определённый набор. Лишние бросаются в глаза.
Прокси здесь ничего не добавляет и не убирает
Наши не добавляют ничего. Доходит то, что отправил ваш клиент.
Referer не всегда безобиден
Отправить тот, которого не могло существовать, это такое же противоречие, как любое другое.
Связанные термины
Смотри на практике
Готов использовать заголовки запроса?
SotaProxy даёт доступ к ротирующим резидентским, мобильным, дата-центр и ISP прокси. Без минимальных платежей.
Начать