Мое первое знакомство с парсингом веб-сайтов произошло во время выполнения итогового проекта по дисциплине "Языки программирования Java". Для этого проекта мне потребовалось написать шаблон магазина, а затем заполнить базу данных реальными карточками товаров. Вместо того чтобы вручную вводить огромное количество данных, я решил использовать парсинг для автоматизации этого процесса.

1. Парсинг или скрапинг?

Часто эти термины используются как синонимы, но существует различие между ними.
Парсинг — это процесс синтаксического анализа текста с целью извлечения определенной информации.
Скрапинг — это процесс загрузки веб-страницы и попытка извлечения информации из неё, обычно в обход API, ограничений и правил пользования сайтом.
В российском комьюнити понятие скрапинга часто заменяется на термин парсинг. По содержанию статья больше относится к скрапингу.

2. Законность и этика парсинга

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

Статьи с Хабра, такие как Про законность парсинга в РФ и Примеры судебных разбирательств, могут помочь разобраться в этом вопросе.

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

Также стоит учитывать файл robots.txt, который содержит инструкции для поисковых систем, таких как Google и Яндекс. Если владелец сайта установил ограничения на сканирование определенных страниц, игнорирование этих инструкций может быть неправомерным и некорректным.

3. Парсинг с помощью requests и BeautifulSoup

Один из самых простых и распространенных способов парсинга HTML-страниц - использование библиотек Python: requests для выполнения HTTP-запросов и BeautifulSoup для анализа HTML-кода.

  • Отправляется GET запрос на указанный URL;

  • Получение HTML-кода страницы;

  • Использует объект BeautifulSoup для поиска и извлечения нужных данных из HTML-кода.

Этот пример демонстрирует базовый подход к парсингу веб-страниц с использованием библиотек Python requests и BeautifulSoup. Однако парсинг может быть более сложным в случае страниц с динамическим контентом или вложенной структурой. В таких случаях может потребоваться дополнительная обработка данных для извлечения необходимой информации.

4. Статические страницы

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

Статические веб-страницы могут быть легко спарсены с использованием инструментов для отправки HTTP-запросов (например, библиотека requests в Python) и парсинга HTML (например, BeautifulSoup). Это позволяет извлекать данные с веб-страниц для дальнейшего анализа или использования.

5. Динамические страницы

Динамические веб-страницы представляют собой веб-страницы, которые могут изменять свое содержимое без перезагрузки всей страницы. Это достигается за счет использования технологий, таких как JavaScript и AJAX (асинхронный JavaScript и XML), которые позволяют странице взаимодействовать с сервером и обновлять содержимое "на лету".

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

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

6. Работа с API

Если парсинг статических страниц достаточно прост, то с динамическими поможет работа через API.

  • Открытые API предоставляют доступ к данным и функциям сайта для использования другими программами или приложениями. Они могут быть платными или иметь некоторые ограничения на количество запросов или доступные функции. Примером открытого API может быть API биржи, которое предоставляет информацию о ценах акций и других финансовых данных;

  • Скрытые API не предназначены для общего публичного использования, но их можно обнаружить и использовать через анализ сетевого трафика. Это может быть более сложным и технически требовательным процессом, но в определенных случаях это может быть единственным способом получения необходимых данных.

7. Защита от парсеров

Взгляните на комментарий:
"Мы не собираемся ни с кем судиться за кусок текста, просто максимально усложним работу подобным сервисам и программам по скачиванию сайтов. Эти сервисы будут получать 404 практически на все страницы. Все что мы захотим отдать во вне, мы отдадим через api."

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

  • User-Agent фильтрация. Веб-серверы могут проверять User-Agent в HTTP-запросах и блокировать запросы от известных ботов и скриптов. Поэтому важно использовать подходящий User-Agent в запросах, чтобы обойти эту защиту;

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

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

  • Применение защиты CloudFlare. Сервисы защиты вроде CloudFlare могут предоставлять дополнительную защиту от парсеров, включая CAPTCHA, блокировку IP-адресов с аномальным поведением и другие методы защиты.

8. Способы обхода защиты при парсинге веб-сайтов

  • Замена User-Agent и другие заголовки. Изменение User-Agent и других заголовков запроса позволяет скрыть идентификацию парсера и эмулировать запросы, как если бы они отправлялись обычным браузером. Библиотеки, такие как fake-useragent, предоставляют возможность генерации случайных User-Agent для каждого запроса, что делает обнаружение парсера сложнее;

  • Selenium. Selenium - это инструмент для автоматизации веб-браузера, который может использоваться для эмуляции пользовательского взаимодействия с веб-страницами. Он может быть эффективным для обхода защиты, так как позволяет выполнить JavaScript и имитировать действия пользователя, такие как заполнение форм и клики по ссылкам. Однако Selenium требует значительных ресурсов и может быть медленным в сравнении с другими методами парсинга;

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

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

Комментарии (8)


  1. Redduck119
    29.03.2024 11:11
    +2

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


    1. turlych Автор
      29.03.2024 11:11

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


  1. lanseg
    29.03.2024 11:11

    Для многих сайтов проще запустить какой-нибудь headless firefox и загружать сайты через webdriver/marionette


  1. datelpiro
    29.03.2024 11:11

    В свое время писали автоматизированный парсер. Локально работал, а на сервере не стал


    1. turlych Автор
      29.03.2024 11:11

      Вероятно, проблема в использовании IP-адреса, который принадлежит датацентру. Такие адреса известны облачным службам типа Cloudflare.
      Мы использовали прокси-сервер, проблем не было


  1. Sceptik
    29.03.2024 11:11

    Если кто-то что-то выложил в сеть, то спарсить/соскрапить это лишь вопрос желания; «клаудфларе» школьникам только геморрой создаст. Честно говоря, не понимаю бизнесменов. Ну, дашь ты данные в открытый доступ - ну, чего ты паришься, что кто-то их соберет?

    А селениум да, херабора бля тестеровщиков, очень медленная штука, если на то пошло то лучше уж плайврайт)


    1. turlych Автор
      29.03.2024 11:11

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

      Про Playwright спасибо, опробуем как будет время)


  1. Enphliette
    29.03.2024 11:11

    Спасибо нашим региональным архивам на системе АИС ЭЛАР: штука настолько медленная, что вдохновляет людей, далёких от веб разработки, разбираться, как достать оттуда данные.