CoderCastrov logo
CoderCastrov
Питон

Овладение парсингом веб-страниц: Неизвестные техники, которые вам не расскажут!

Овладение парсингом веб-страниц: Неизвестные техники, которые вам не расскажут!
просмотров
4 мин чтение
#Питон

Преодоление преград аутентификации и упрощение извлечения данных - новый подход к парсингу веб-страниц.

Мы все были там

Столкнулись с преградами аутентификации или просматривали огромные HTML-файлы в поисках нужных данных, чтобы в конечном итоге получить запутанную программу, заполненную бессмысленными атрибутами 'div'? Не ищите дальше;

Откройте для себя идеальное решение: В этом кейс-стади мы рассмотрим парсинг веб-страниц с Zillow (сайт недвижимости), продемонстрировав другой подход, основанный на использовании JSON-ответов вместо HTML.

Три темы, о которых вы узнаете к концу этого руководства:


HTML out — JSON in!

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

Запрашивая эти JSON, вы открываете ворота в мир преимуществ:

Давайте приступим — найдем правильный запрос

  • Щелкните правой кнопкой мыши, затем выберите "Инспектировать".
  • Перейдите на вкладку "Сеть".
  • Найдите уникальную деталь из элемента, например, адрес. - Например, я использовал уникальный адрес "Oak".- Другой вариант - это уникальный номер, например, номер телефона.
  • Проверьте, есть ли вкладка "Ответ" JSON, который содержит эту уникальную деталь.
Ищем адрес «Oak»

Бинго! Мы нашли наш JSON!

  • В найденном запросе перейдите на вкладку "Заголовки".
  • Скопируйте URL и заголовки запроса.- _Обратите внимание, что вы не копируете заголовки ответа.

Позже вы узнаете, как автоматически генерировать эти заголовки!

Теперь отправьте этот точный запрос в своем коде. Вы должны получить код ответа 200 (без проблем).

Как видите, это ответ в формате JSON, а не HTML! Удивительно!

Примечание - Это не всегда возможно на каждом сайте и зависит от того, как он построен.

Понимание параметров

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

Но вот хорошая новость: сайты, подобные этому, помогут вам с легкостью расшифровать такие URL.

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

Создание ваших ключей — трудная часть

Существует несколько способов раскрыть эту тайну, вот основные методы:

  • Отслеживание куки: Найти запрос, который инициирует использование куки, а затем найти запрос, который возвращает эти куки во вкладке ответов или заголовках.
  • Очевидный адрес: Найти конкретный URL-адрес одного из запросов, содержащий важный термин, например "GenerateTokens" или "GetCookies".
  • Парсинг JavaScript: Исследовать HTML-ответы, чтобы найти JavaScript-функцию, которая содержит ключ к генерации желанных куки.
  • Прямой запрос: Использовать простой запрос к доменному имени сайта и наблюдать появление ценных куки.
  • Любой другой способ, который вы можете найти, будьте креативны!

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

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

И теперь мы можем использовать их:

Примечание: В приведенном примере кода мы используем requests.Session для обработки куки. При работе с кодом явно объявляйте сеанс, так как куки связаны с ним. Избегайте использования requests.get напрямую, так как это может привести к тому, что сайт не распознает вас, и куки станут бесполезными.

Полный код:

Ниже представлен частичный JSON дома, содержащий цену, количество спален и ванных комнат, площадь, координаты и другую полезную информацию:

{
  'price': '$2,499,000',
  'beds': 5,
  'baths': 4.0,
  'area': 3802,
  'latLong': {'latitude': 34.14067, 'longitude': -118.55614},
  'isFavorite': False,
  'isUserClaimingOwner': False,
  'isUserConfirmedClaim': False,
  'hdpData': {
    'homeInfo': {
      'zpid': 19949129,
      'streetAddress': '3914 Braewood Ct',
      'zipcode': '91356',
      'city': 'Tarzana',
      'state': 'CA',
      'latitude': 34.14067,
      'longitude': -118.55614,
      'price': 2499000.0,
      'daysOnZillow': -1,
      'rentZestimate': 14829,
      'priceChange': -50000,
      'taxAssessedValue': 778036.0,
      'lotAreaValue': 1.0261,
      ...
    }
  },
  'detailUrl': '/homedetails/3914-Braewood-Ct-Tarzana-CA-91356/19949129_zpid/',
  'address': '3914 Braewood Ct, Tarzana, CA 91356',
  'hasAdditionalAttributions': False,
  'isFeaturedListing': False,
  ...
}

Этот JSON содержит множество данных для изучения ваших потребностей в парсинге и анализе.


Другие советы

Pandas

Списки похожих json-объектов легко преобразуются в pandas.DataFrame:

Параллелизм

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

from concurrent.futures import ThreadPoolExecutor

with ThreadPoolExecutor(max_workers=32) as exe:
    result = list(exe.map(func_that_get_the_json, list_of_urls))

Если вам понравилась эта статья, подпишитесь, чтобы оставаться в курсе новых публикаций! 😁Вы можете найти меня:


Простыми словами

Спасибо, что вы являетесь частью нашего сообщества! Перед тем, как вы уйдете: