CoderCastrov logo
CoderCastrov
Научный анализ данных

Как избежать парсинга веб-страниц?

Как избежать парсинга веб-страниц?
просмотров
3 мин чтение
#Научный анализ данных

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

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


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

Ниже приведены две архитектуры, с помощью которых обычно создается веб-сайт:

1 — Legacy Monolithic

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

2 — Modern microservice style

Стиль микросервисов: В этом стиле пользователь запрашивает веб-страницу, на что сервер отвечает только HTML и JS, который указывает браузеру делать дополнительные вызовы по разным URL-адресам для получения данных, которые позже можно вмешать с HTML. Мы собираемся использовать это разделение между HTML и данными в своих интересах.

Если вы не заметили, нам нужны только данные, а не вызов HTML. Поэтому нам просто нужно сделать вызов API, чтобы получить данные в формате JSON.

Позвольте мне объяснить это на примере.

Рассмотрим эту веб-страницу https://playhearthstone.com/en-us/cards?set=standard. Мы должны спарсить имена всех персонажей на каждой из карт.

Snapshot of the cards from which we want to scrap the names

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

Но вот где начинается веселье. Прежде чем писать весь скрипт для парсинга, подождите и потерпите, и посмотрите, насколько простыми могли бы быть вещи.

После загрузки страницы откройте инструменты разработчика и выберите вкладку "Network". С открытой вкладкой просто перезагрузите страницу, и вы начнете видеть сетевые вызовы, которые выполняются с веб-сайта. Если вы просмотрите эти вызовы, вы сможете найти золотое яйцо - сетевой вызов, ответом на который является JSON со всеми именами карт, которые отображаются в пользовательском интерфейсе.

Snapshot showing how to find the required call which has data

Теперь дело осталось за малым - сделать только этот вызов, получить JSON и извлечь из него имя. Чтобы узнать, какие аргументы запроса, просто щелкните на вкладке "Header" выше, которая показывает следующие детали.

Snapshot showing the details of the request

Мы можем извлечь три информации из этой вкладки: 1. URL запроса2. Метод запроса3. Авторизация, которую нужно добавить в заголовок запроса

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

import requests
url = "https://api.blizzard.com/hearthstone/cards?class=all&order=asc&pageSize=200&set=standard&sort=manaCost&locale=en_US"
auth_code = "KR0TZFpUeCM5q4QdrFqKfgdRUk5Wgayl4M"
headers = { "Authorization":  "Bearer "+auth_code}
res = requests.get(url=url, headers=headers)
names_list = [card['name'] for card in  res.json()['cards']]
print(names_list)

Да, это настолько просто!!

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

643477bbfd

Если этот пост был полезен, пожалуйста, нажмите несколько раз на кнопку 👏, чтобы показать свою поддержку автору! ⬇

Переведи введенный markdown код с английского на русский. Сохрани оригинальную разметку markdown и тэги на своих местах. Вместо слов скрэпинг/скрапинг/скрапер/скрэпер используй парсинг/парсер/парсить. Возвращай только markdown код, без дополнительного текста