CoderCastrov logo
CoderCastrov
Заголовки

Заголовки и куки для парсинга веб-страниц

Заголовки и куки для парсинга веб-страниц
просмотров
6 мин чтение
#Заголовки

Статья о Заголовках и куки для парсинга веб-страниц была изначально опубликована на Scraper API.

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

Хотя существует множество методов, которые мы можем использовать для обхода многих мер безопасности, есть один, о котором не говорится достаточно: пользовательские заголовки HTTP.

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

Что такое HTTP-заголовки?

Согласно MDN, "HTTP-заголовок - это поле HTTP-запроса или ответа, которое передает дополнительный контекст и метаданные о запросе или ответе" и состоит из регистрозависимого имени (например, age, cache-control, Date, cookie и т. д.), за которым следует двоеточие (:) и затем его значение.

Проще говоря, пользователь/клиент отправляет запрос, содержащий заголовки запроса, предоставляющие серверу дополнительные сведения. Затем сервер отвечает данными, запрошенными в структуре, соответствующей спецификациям, содержащимся в заголовке запроса.

Для ясности, вот заголовок запроса, который наш браузер отправляет Prerender на момент написания этой статьи:

1 authority: **in**.hotjar.com

2 :method: POST

3 :path: **/**api**/**v2**/**client**/**sites**/**2829708**/**visit**-**data?sv**=**7

4 :scheme: https

5 accept: ***/***

6 accept**-**encoding: gzip, deflate, br

7 accept**-**language: en**-**US,en;q**=**0.9,it;q**=**0.8,es;q**=**0.7

8 content**-**length: 112

9 content**-**type: text**/**plain; charset**=**UTF**-**8

10 origin: [https:**//**prerender.io](https://prerender.io)

11 referer: [https:**//**prerender.io**/**](https://prerender.io/)

12 sec**-**ch**-**ua: " Not A;Brand";v**=**"99", "Chromium";v**=**"101", "Microsoft Edge";v**=**"101"

13 sec**-**ch**-**ua**-**mobile: ?0

14 sec**-**ch**-**ua**-**platform: "macOS"

15 sec**-**fetch**-**dest: empty

16 sec**-**fetch**-**mode: cors

17 sec**-**fetch**-**site: cross**-**site

18 user**-**agent: Mozilla**/**5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit**/**537.36 (KHTML, like Gecko) Chrome**/**101.0.4951.64 Safari**/**537.36 Edg**/**101.0.1210.47

Что такое веб-куки?

Веб-куки, также известные как HTTP-куки или куки браузера, представляют собой данные, отправляемые сервером (в заголовке HTTP-ответа) в браузер пользователя для последующей идентификации. В последующем запросе (в заголовке HTTP-запроса) браузер отправит куки обратно на сервер, что позволит серверу распознать браузер.

Веб-сайты и веб-приложения используют куки для управления сеансом (например, чтобы оставаться в системе), персонализации (для сохранения настроек и предпочтений), отслеживания и в некоторых случаях безопасности.

Давайте посмотрим, как выглядела бы куки в заголовке запроса LinkedIn:

Зачем заголовки важны для парсинга веб-страниц?

Многие владельцы веб-сайтов знают, что их данные будут парситься одним способом или другим, поэтому они используют различные инструменты и стратегии для идентификации ботов и блокировки их на своих сайтах. И у них есть много веских причин для этого, так как плохо оптимизированные боты могут замедлить или даже сломать веб-сайты.

Примечание: Вы можете избежать перегрузки веб-серверов и уменьшить вероятность блокировки, следуя этим лучшим практикам парсинга веб-страниц.

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

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

Самые распространенные заголовки HTTP для парсинга веб-страниц

Существует большой список заголовков HTTP, которые мы можем изучить и использовать в наших запросах, но в большинстве случаев нам действительно важны только несколько из них для парсинга веб-страниц:

1. User-Agent

Это, вероятно, самый важный заголовок, так как он идентифицирует "тип приложения, операционную систему, поставщика программного обеспечения или версию программного обеспечения, запрашивающего агента пользователя", что делает его первой проверкой, которую выполняют большинство серверов.

Например, при отправке запроса с использованием библиотеки Requests для Python, поле user-agent будет содержать следующую информацию - в зависимости от версии Python:

1 user**-**agent: python**-**requests**/**2.22.0

Что легко обнаружить и заблокировать сервером.

Вместо этого мы хотим, чтобы наш заголовок user-agent выглядел больше как показанный в нашем первом примере:

1 user**-**agent: Mozilla**/**5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit**/**537.36 (KHTML, like Gecko) Chrome**/**101.0.4951.64 Safari**/**537.36 Edg**/**101.0.1210.47

2. Accept-Language

Хотя это не всегда необходимо, это сообщает серверу, на каком языковом варианте данных предоставить. Когда есть большое расхождение между каждым запросом с языковой точки зрения, это может указывать серверу на наличие бота.

Однако, технически говоря, "сервер всегда должен обращать внимание на то, чтобы не переопределять явный выбор пользователя", поэтому, если URL-адреса, которые вы парсите, уже имеют конкретные языки, это все равно может восприниматься как органический пользователь.

Вот как это выглядит в нашем примере запроса:

1 accept**-**language: en**-**US,en;q**=**0.9,it;q**=**0.8,es;q**=**0.7

3. Accept-Encoding

Как следует из названия, это сообщает серверу, какой алгоритм сжатия "может использоваться для отправляемого ресурса", экономя до 70% пропускной способности, необходимой для определенных документов, тем самым уменьшая нагрузку на серверы от наших скриптов.

1 accept**-**encoding: gzip, deflate, br

4. Referer

Заголовок HTTP Referer сообщает серверу страницу, с которой пользователь пришел. Хотя он используется в основном для отслеживания, он также может помочь нам имитировать поведение органического пользователя, например, сообщая серверу, что мы пришли с поисковика, такого как Google.

1 referer: [https:**//**prerender.io**/**](https://prerender.io/)

5. Cookie

Мы уже обсудили, что такое cookie, однако, мы, возможно, неясно указали, почему cookie важны для парсинга веба.

Cookie позволяют серверам обмениваться небольшими данными, но что происходит, когда сервер отправляет cookie, а затем браузер не сохраняет и не отправляет его обратно в следующем запросе? Cookie также могут использоваться для определения, идет ли запрос от реального пользователя или бота.

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

Как просмотреть HTTP-заголовки? [Включая куки]

Прежде чем мы сможем использовать заголовки в нашем коде, нам нужно сначала получить их откуда-то. Для этого давайте воспользуемся нашим собственным браузером и перейдем на целевой веб-сайт. В качестве примера давайте перейдем на google.com, щелкнем правой кнопкой мыши и выберем "Инспектировать", чтобы открыть инструменты разработчика.

Инструменты разработчика

Затем мы перейдем на вкладку "Сеть" и, находясь на странице Google, выполним поиск запроса "парсинг заголовков".

Поиск запроса

При загрузке страницы мы увидим, как заполняется вкладка "Сеть". Мы ближе рассмотрим вкладку "Fetch/XHR", где мы сможем найти документы, которые загружаются браузером, и, конечно же, HTTP-заголовки, используемые в запросе.

Хотя у файла, который мы ищем, может не быть одного стандартного имени, обычно это связанное с тем, что мы пытаемся сделать на странице, или это файл, который предоставляет данные, которые отображаются.

Нажав на файл, мы откроем вкладку "Заголовки" по умолчанию, и прокрутив вниз, увидим раздел "Заголовки запроса".

Заголовки запроса

Теперь мы можем скопировать и вставить поля заголовков и их значения в наш код.

Как использовать пользовательские заголовки для парсинга веб-страниц

Способ использования пользовательских заголовков будет зависеть от языка программирования, который вы используете, однако мы постараемся привести как можно больше примеров.

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

Во всех наших примерах мы будем отправлять наш запрос на https://httpbin.org/headers, который является веб-сайтом, предназначенным для отображения ответов и запросов с точки зрения сервера.

Вот что появляется, если мы откроем ссылку выше в нашем браузере:

Веб-сайт отвечает заголовками, которые наш браузер отправляет, и теперь мы можем использовать те же заголовки при отправке нашего запроса через код.