Как избежать парсинга веб-страниц?
Вы когда-нибудь оказывались в ситуации, когда вы пытаетесь написать скрипт для парсинга веб-страницы, чтобы получить некоторые данные, но сталкиваетесь с проблемами, потому что HTML-код веб-сайта не структурирован или веб-сайты написаны с использованием фреймворков JS, таких как React JS или Angular JS, что делает код HTML действительно сложным для понимания.
У меня есть хитрость, которая может помочь вам выйти из этой ситуации почти всегда, и лучшая часть в том, что нам не нужно использовать парсинг. Фактически, лучше всего сначала попробовать и реализовать эту хитрость, прежде чем пробовать парсинг веб-страниц.
Прежде чем начать с хитрости, нам нужно иметь базовое понимание того, как может быть реализовано веб-приложение/веб-сайт.
Ниже приведены две архитектуры, с помощью которых обычно создается веб-сайт:
Монолитный стиль: В этом стиле пользователь запрашивает веб-страницу, на что сервер отвечает всей веб-страницей. Это включает в себя HTML и вмешательство данных. В любом случае, это старый стиль реализации, и мы не будем сосредотачиваться на этом стиле в этом блоге.
Стиль микросервисов: В этом стиле пользователь запрашивает веб-страницу, на что сервер отвечает только HTML и JS, который указывает браузеру делать дополнительные вызовы по разным URL-адресам для получения данных, которые позже можно вмешать с HTML. Мы собираемся использовать это разделение между HTML и данными в своих интересах.
Если вы не заметили, нам нужны только данные, а не вызов HTML. Поэтому нам просто нужно сделать вызов API, чтобы получить данные в формате JSON.
Позвольте мне объяснить это на примере.
Рассмотрим эту веб-страницу https://playhearthstone.com/en-us/cards?set=standard. Мы должны спарсить имена всех персонажей на каждой из карт.
Я предлагаю вам сначала попробовать свою первоначальную интуицию для решения этой проблемы. Вы, вероятно, извлечете какой-то инструмент/программу для парсинга веб-страницы и начнете читать HTML веб-страницы, чтобы извлечь все эти имена.
Но вот где начинается веселье. Прежде чем писать весь скрипт для парсинга, подождите и потерпите, и посмотрите, насколько простыми могли бы быть вещи.
После загрузки страницы откройте инструменты разработчика и выберите вкладку "Network". С открытой вкладкой просто перезагрузите страницу, и вы начнете видеть сетевые вызовы, которые выполняются с веб-сайта. Если вы просмотрите эти вызовы, вы сможете найти золотое яйцо - сетевой вызов, ответом на который является JSON со всеми именами карт, которые отображаются в пользовательском интерфейсе.
Теперь дело осталось за малым - сделать только этот вызов, получить JSON и извлечь из него имя. Чтобы узнать, какие аргументы запроса, просто щелкните на вкладке "Header" выше, которая показывает следующие детали.
Мы можем извлечь три информации из этой вкладки: 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-код.
Если этот пост был полезен, пожалуйста, нажмите несколько раз на кнопку 👏, чтобы показать свою поддержку автору! ⬇
Переведи введенный markdown код с английского на русский. Сохрани оригинальную разметку markdown и тэги на своих местах. Вместо слов скрэпинг/скрапинг/скрапер/скрэпер используй парсинг/парсер/парсить. Возвращай только markdown код, без дополнительного текста