CoderCastrov logo
CoderCastrov
Python3

Парсинг Центральной избирательной комиссии с помощью Python

Парсинг Центральной избирательной комиссии с помощью Python
просмотров
4 мин чтение
#Python3

На этот раз я хочу поделиться с вами небольшим кодом на Python, с помощью которого мы можем получить базовые данные, которые являются общедоступными и доступны всем на официальном сайте Центральной избирательной комиссии Венесуэлы.

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

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

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

Ниже я прокомментирую код на Python, который позволит нам получить информацию с официального сайта ЦИК, используя техники парсинга.

busquedaCNE.py

Несмотря на то, что я считаю, что код достаточно документирован, давайте добавим немного больше деталей. В первую очередь мы импортируем библиотеки, которые позволят нам работать с HTML-контентом. Для этого в строке 3 мы импортируем requests, через эту библиотеку мы можем отправлять запросы на серверы, имитируя запросы, которые пользователь делает через веб-браузер. В строке 4 мы используем Beautifulsoup из bs4, обе они не поставляются по умолчанию с нашей установкой Python, поэтому перед использованием их необходимо установить с помощью pip install bs4 requests из терминала.

1. # требуется python3
2.
3. import requests
4. from bs4 import BeautifulSoup

Примечание: Я пронумеровал каждую строку только для ссылки на нее и для более ясного объяснения в этой документации, но они не имеют числового соответствия с фактическим исходным кодом.

url_semilla - это переменная, которая хранит базовый URL, еще без необходимых параметров для запроса.

# Целевой URL
url_semilla = "http://www.cne.gob.ve/web/registro_electoral/ce.php?"

Значения, как мы упоминали ранее, - это национальность, которая должна быть заглавной буквой V для венесуэльских граждан или E для иностранных граждан. И идентификационный номер, который является номером удостоверения личности. Пока я думаю, что они находятся в пределах порядка 30 миллионов, то есть идентификационный номер - это целое число с максимумом в восемь (8) цифр.

Параметры для включения в URL (Данные для примера)

nationality = 'V'
id_card = '14147068'

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

Зная URL-адрес-семя и данные для запроса, мы строим то, что я называю составным URL-адресом, который является URL-адресом-семенем, объединенным с необходимыми значениями для выполнения запроса.

# Конечный URL-адрес
composite_url = seed_url + 'nacionalidad=' + nationality + '&' + 'cedula=' + id_card

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

# Запрос
requests = requests.get(composite_url)

Затем мы берем ответ, который возвращает сервер, и разбираем его как HTML, чтобы присвоить его переменной soup, которая будет содержать всю HTML-структуру.

# Берем requests, разбираем его как HTML, чтобы получить тип данных soup
soup = BeautifulSoup(requests.content, "html.parser")

Каждый запрос, отправленный на сервер, возвращает код статуса, который является результатом этого запроса, например, код 404, который обозначает, что веб-страница не найдена, возможно, была перемещена на другой URL-адрес или просто удалена, и так далее. Но нас интересует только проверка того, что статус нашего запроса равен 200. Поскольку это означает, что наш запрос был успешно обработан, и в результате у нас будет содержимое, которое мы можем парсить с помощью нашего кода.

1. # status_code 200 означает ОК, в противном случае веб-сайт недоступен, и мы печатаем сообщение об ошибке и код ошибки
2. if requests.status_code == 200:
3.      contenList = []
4.
5.      for content in soup.find_all('td')[10:24]: # 10:24 - это <td>, которые нас интересуют
6.          data = content.text
7.          contenList.append(data.strip())
8.
9.      personData = '\nCedula:' + contenList[1] + '\n' + 'Имя и фамилия: ' + contenList[3]
10.
11.     centerData = '\nEsdato:' + contenList[5] + '\n' + 'Муниципалитет: ' + contenList[7]
12.
13.     print(personData + centerData)
14.
15. else:
16.     print("Ошибка соединения: Код ", requests.status_code)

Поэтому в строке 2 мы начинаем условную конструкцию if-else, которая позволяет нам принимать два варианта действий: один в случае, если код равен 200 (успешный запрос), и второй вариант действий, если код отличается от 200, в таком случае не удалось получить доступ к веб-сайту, и мы выводим сообщение об ошибке, за которым следует номер ошибки.

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

В строке 3 я объявляю пустой список, в который буду сохранять спарсенные данные.

В строке 5 я начинаю цикл for для обхода HTML-структуры. Используя функцию find_all, мы ищем все теги <td>, так как мы предварительно изучили веб-сайт и знаем, что данные, которые нас интересуют, находятся внутри этих тегов <td>.

Но оказывается, что в HTML есть несколько тегов <td> разных уровней, но те, которые нас интересуют, находятся между уровнем 10 и 24. Остальные уровни также содержат данные, но с большим количеством "мусора" или текста, который нас не интересует.

Обходя теги, которые находятся между уровнями 10 и 24, он берет содержимое этих тегов и сохраняет его в переменной content, затем в строке 6 мы извлекаем текст из переменной content и присваиваем его переменной data.

В строке 7 мы удаляем пробелы с помощью метода strip() и добавляем его в список, который будет хранить данные, которые нас интересуют.

Результаты этого примера:

Надеюсь, это будет полезно, весь код доступен ЗДЕСЬ, и любые ваши комментарии очень ценны для меня.