CoderCastrov logo
CoderCastrov
Python

Как эффективно выполнять парсинг данных?

Как эффективно выполнять парсинг данных?
просмотров
3 мин чтение
#Python

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

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

Понимание цикла запроса-ответа

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

То, что вы видите как клиент в браузере, является просто набором данных, разобранных и отформатированных в красивом и представляемом виде благодаря HTML, CSS и JavaScript. Ключевой момент здесь - это фраза: "просто набор данных", что означает, что мы, возможно, сможем выполнить парсинг этой информации.

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

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

Не недооценивайте разницу. Парсинг элементов HTML обычно очень медленный!

Серверная часть: Парсинг HTML элементов

Скрипт отправляет запрос на сервер. Сервер отвечает HTML файлом. Затем скрипт находит местоположение информации и извлекает ее.

Преимущества:

  • Легко реализовать
  • Простой в использовании

Недостатки:

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

Инструменты:

Клиентская часть: Парсинг полученных данных

Скрипт отправляет запрос на сервер. Сервер отвечает данными, обычно JSON или XML. Затем скрипт извлекает полезную информацию или сохраняет полученные данные напрямую.

Обычно люди смотрят на вкладку "Сеть" в инструментах разработчика (Firefox), чтобы изучить трафик. Для более подробного анализа можно использовать Mitmproxy.

Преимущества:

  • Быстрый для парсинга большого количества веб-страниц
  • Надежный. Обычно конечные точки запросов не меняются.
  • Быстрая разработка. Меньше кода для написания.

Недостатки:

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

Инструменты:

Особые хитрости: Парсинг приложений

Это особая хитрость, которую я использовал для парсинга веб-страниц, которые рендерятся на стороне сервера. Но это работает только в том случае, если компания предоставляет приложение для Android (не пробовал на приложении для IOS).

Шаги выглядят так:

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

Centaline Web (server side render)

Но они предоставили приложение для Android. После использования вышеуказанных шагов я смог найти данные, которые запрашиваются (POST) с помощью

https://hkapi.centanet.com/api/FindProperty/MapV2.json?postType=s&order=desc&page=1&pageSize=20&pixelHeight=2220&pixelWidth=1080&points[0].lat=22.705635288642362&points[0].lng=113.85844465345144&points[1].lat=22.705635288642362&points[1].lng=114.38281349837781&points[2].lat=21.993328259196705&points[2].lng=114.38281349837781&points[3].lat=21.993328259196705&points[3].lng=113.85844465345144&sort=score&zoom=9.745128631591797&platform=android

Заключение

Я не могу вдаваться в подробности каждого шага. Статья уже достаточно длинная. Главное сообщение здесь заключается в том, чтобы по возможности не использовать элементы HTML. Всегда ищите клиентскую рендер-службу. Это значительно повысит эффективность парсинга.

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