CoderCastrov logo
CoderCastrov
Парсер

Парсинг веб-сайта Лок Сабха для получения данных о посещаемости депутатов, с использованием Python и Selenium (Часть 1)

Парсинг веб-сайта Лок Сабха для получения данных о посещаемости депутатов, с использованием Python и Selenium (Часть 1)
просмотров
5 мин чтение
#Парсер

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

К счастью, правительство Индии публикует данные о посещаемости парламентских сессий онлайн по ссылке http://164.100.47.194/Loksabha/Members/MemberAttendance.aspx. Однако получение данных в форме CSV требует использования именно того, чего я избегал, а именно парсинга веб-сайтов. Парсинг эффективен, так как у нас нет доступа к API.

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

Я начал искать инструменты для парсинга веб-сайтов, и Python - мой предпочтительный язык для всех скриптовых и веб-связанных задач. Я начал читать о парсинге веб-сайтов и о том, как это можно сделать. Одно, что мне сразу стало очевидным, это то, что для эффективного выполнения задач парсинга веб-сайтов требуются основы веб-разработки. (Не беспокойтесь, если у вас их нет, я практически в той же ситуации. У меня нет опыта разработки фронт-энда (даже базового HTML и CSS)).

Я узнал о разнице между парсингом статических и динамических веб-страниц. Пожалуйста, обратитесь к: https://www.geeksforgeeks.org/difference-between-static-and-dynamic-web-pages/. Парсинг динамических веб-страниц намного сложнее, чем парсинг статических веб-страниц. В статических веб-страницах вся информация, которая может быть нам важна, уже доступна в HTML, тогда как в динамических веб-страницах взаимодействие пользователя с веб-страницей вызывает загрузку дополнительной информации с помощью JavaScript.

Если вы абсолютный новичок в парсинге веб-сайтов (как я был), вам следует сначала попробовать свои силы в парсинге статических веб-страниц. Простой поиск в Google привел меня к статье https://realpython.com/beautiful-soup-web-scraper-python/, посвященной парсингу с использованием библиотеки Beautiful Soup для Python. Это замечательный ресурс, который даст вам представление о том, как все работает.

К сожалению, парсинг не так прост, когда вы пытаетесь парсить динамические веб-страницы, которые содержат элементы, такие как выпадающие меню, флажки и т.д., потому что взаимодействие с этими элементами изменяет данные соответствующим образом. Я использовал эту ссылку: https://www.pluralsight.com/guides/guide-scraping-dynamic-web-pages-python-selenium, чтобы получить базовое представление о Selenium. После этого это было просто прыжок в глубокий конец бассейна, где вашим главным помощником являются Stack Overflow и документация.

В любом случае! Достаточно введения, давайте приступим к программированию.

Детали системы:1) Ubuntu 18.04 Distro2) Python 3.73) Selenium==3.141.04) Pandas==0.24.2

Мы будем использовать Pandas DataFrames для сохранения полученных данных, а затем преобразуем эти данные в файлы CSV.

# Установите chromium-chromedriver, чтобы помочь Selenium запускать веб-сайты
$  sudo apt-get install chromium-chromedriver
# Установите Selenium
$ pip install selenium==3.141.0
# Установите Pandas
$ pip install pandas== 0.24.2
Установка

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

Инспектор элементов

Инспектор элементов - ваш друг, поиграйтесь с HTML и найдите соответствующие теги/информацию, которую вы хотите извлечь. Также поиграйтесь с веб-сайтом, чтобы полностью понять, что нужно сделать, чтобы получить все данные, которые нам нужны. На веб-сайте, который мы хотим спарсить, есть три выпадающих меню. 1) Лок Сабха: это выбранный Лок Сабха (в настоящее время это 17-й выбранный Лок Сабха). 2) Сессия: сессия парламента, которую мы хотим просмотреть. 3) Дата: дата заседания сессии.

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

Страницы

Это нужно учесть, поэтому, чтобы спарсить, скажем, текущую (17-ю) сессию Лок Сабха, нам нужно перебрать все возможные сессии и каждую дату в сессии, чтобы получить таблицу, затем нам нужно посетить каждую отдельную страницу, чтобы собрать данные о людях. Это дает нам ясность о задаче, которую нужно выполнить. Давайте напишем некоторый код.

Импорт:

Теперь основная философия парсинга заключается в следующем:1) определение интересующего элемента2) поиск соответствующего HTML-тега/ID в HTML3) понимание структуры объекта и извлечение информации

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

В процессе создания этого скрипта я узнал много разных вещей, одна из которых заключается в том, что абсолютно важно дождаться загрузки элементов на пользовательском интерфейсе. В противном случае Selenium выдаст исключение (динамические веб-сайты содержат код JavaScript, который рендерится веб-браузером, поэтому бывают моменты, когда мы пытаемся получить доступ к элементу, который еще не был отрисован и недоступен. Это приводит к ошибкам). Настоящий код был написан после множества попыток, тестирования и некоторой помощи от наших друзей на Stack Overflow.

Примечание: Вам может показаться, что я сразу перешел от объяснения всего к использованию XPath для навигации по различным элементам объекта Selenium Web. Вот хороший ресурс, чтобы узнать больше о XPath https://www.edureka.co/blog/xpath-in-selenium/. (Еще раз подчеркиваю, пожалуйста, поиграйтесь с инструментом "Инспектор элементов" браузера на веб-сайте, который вы хотите спарсить, чем больше вы будете играть, тем лучше).

Я постарался задокументировать и добавить все необходимые комментарии в код. Мы выбираем соответствующие элементы, получаем количество объектов, перебираем их и получаем нужную информацию. Обратите внимание, что тестируйте свой код перед запуском его для такого уровня итерации (для полного веб-сайта). Например, во время тестирования я понял, что иногда, когда я заканчиваю парсить 16 страниц (список депутатов), и я меняю дату, состояние страницы остается на странице номер 16. Поэтому мы должны вручную изменить номер страницы на 1 и начать парсить снова. Также была учтена структура файлов для сохранения файлов CSV. В конечном итоге мы получим все файлы CSV для каждого срока и каждой сессии. Мы сохраняем информацию в Pandas dataframes.

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