Создание парсера штрафов за нарушение правил дорожного движения с помощью Python
Чтобы увидеть этот пост в лучшем формате, отметьте мой блог.
Мотивация
На днях я вспомнил, что во время моего визита в Мехико в июне 17-го (для моего участия в первом выпуске PythonDay Мексика), а мой друг принимал меня в своем доме во время моего пребывания там. Дело в том, что во время моего пребывания мы обсуждали создание чего-то, что могло бы быть полезным, поэтому мы решили собрать веб-сайт, на котором владельцы автомобилей из Мехико могли бы проверить свои штрафы за нарушение правил дорожного движения.
Как вы могли заметить, если вы открыли сайт, он содержит ввод для записи номера автомобиля, из которого вы можете искать трафик, прикрепленный к этому номеру (если он есть).
Мой друг сказал мне, что только небольшая группа жителей Мехико знала об этом сайте, поэтому было бы полезно создать что-то, в чем они могли бы найти эту информацию более простым способом.
После этого я такой: «Чувак, сегодня я провел семинар о том, как создать TwitterBot за 30 минут для PythonDay, что, если мы создадим TwitterBot, который вводит табличку на сайт, а затем автоматически извлекает информацию из нее?». Он сказал да. С этим мы построили МультиБот TwitterBot, который раньше читал автомобильный номер и собирал штрафы за нарушение правил дорожного движения.
Мы начинали с этого проекта как с частного проекта, но на днях меня пригласил Отдел права, политики и управления моего университета, чтобы выступить с техническим докладом о том, как автоматизация может быть полезна для будущих рабочих мест не только для людей, работающих в технологической отрасли, но также для политиков и юристов. Когда я вспомнил об этом, я подумал, что это будет хороший пример, поэтому я хотел улучшить его основу и закончил этим примером сценария, которым теперь я хочу поделиться с вами.
Эксперимент
Я объясню весь код, чтобы вы понимали, что происходит на каждом этапе пути. Для начала я импортирую Селен и питон симпатичный принтер данных:
1 from selenium import webdriver
2 from pprint import pprint
Selenium позволит нам автоматизировать управление веб-браузером, поэтому идея будет заключаться в том, чтобы использовать его для автоматического открытия веб-сайта, ввода номера автомобиля и после загрузки штрафов за нарушение правил дорожного движения извлекать и анализировать их для pprint
выход.
После этого я создал функцию для запуска браузера и считывания информации с автомобильного номера. Если verbose
установлен на True
функция распечатает детали каждого штрафа за нарушение правил дорожного движения:
5
6 def launch_browser(placa, verbose=False):
7
8 browser = webdriver.Chrome()
9
10
11 url = ''
12 browser.get(url)
13
14
15 multas = busca_placa_df(browser, placa, verbose)
16
17
18 browser.quit()
19 return multas
Внутри функции я установил URL-адрес для очистки, затем я вызвал функцию с именем busca_placa_df
(что значит search_plate_df, дф означает Федеральный округ на испанском языке), а затем я закрыл и вышел из открытого браузера для этого поиска.
Затем я создал основную функцию, которая вводит данные, а затем очищает штрафы за нарушение правил дорожного движения:
22
23 def busca_placa_df(browser, placa, verbose=False):
24
25 browser.find_element_by_id('plate').clear()
26 browser.find_element_by_id('plate').send_keys(placa)
27
28
29 browser.find_element_by_xpath('//*[@id="request"]/div[2]/div/a').click()
30
31
32 resultado = browser.find_element_by_id("secciones")
33 if resultado.text == "INFRACCIONES":
34 resultado = "¡No tienes adeudos!"
35 else:
36 resultado = resultado.text
37
38
39 if verbose:
40 infractions = browser.find_elements_by_id("tablaDatos")
41 if len(infractions):
42 for index, infraction in enumerate(infractions):
43 raw_data = infraction.text.split('\n')
44 folio, fecha = raw_data[1].split(' ')[0:2]
45 situation = ' '.join(raw_data[1].split(' ')[2:])
46 motive = ' '.join(raw_data[2].split(' ')[1:])
47 items = raw_data[3] + ' , '
48 its = [item.split(' ')[-1] for item in items.split(', ')]
49 art, fac, par, inc = its[:4]
50 sanc = raw_data[4]
51
52 data_dict = {
53 'Folio': folio,
54 'Fecha de Infracción': fecha,
55 'Situación': situation,
56 'Motivo': motive,
57 'Fundamento': {
58 'Artículo': art,
59 'Facción': fac,
60 'Párrafo': par,
61 'Inciso': inc,
62 },
63 'Sanción': sanc
64 }
65 print("Infracción {}:".format(index + 1))
66 pprint(data_dict)
67 print()
68
69 return resultado
Как видите, в строках 24-26
Я очищаю данные в поле ввода с помощью id=plate
из источника HTML, затем ввожу номер автомобиля, который я хочу найти, и после этого я ищу кнопку по ее XPath и нажимаю на нее (строки 28-29
).
Теперь я хочу узнать результаты поиска, для этого я ищу элемент с id=secciones
в HTML ответа (строки 31-32
) и сначала проверьте, есть ли у него какие-либо долги, посмотрев, является ли полученный текст только "INFRACCIONES"
если это так, я вернул сообщение о том, что у t нет долгов (строки 33-34
). В другом случае в строках 35-36
Сохраняю результат с содержащимся в нем текстом (в котором указывается количество штрафов ГИБДД для таблички).
Если verbose
флаг включен, то парсер будет получать всю информацию о каждом штрафе ПДД (строки 38-40
). Для этого он будет искать элемент с id=tablaDatos
в HTML, который содержит всю информацию о каждом штрафе за нарушение правил дорожного движения, и если он не пуст (строка 41
) он будет повторяться для каждого штрафа за нарушение правил дорожного движения, а затем извлекать всю информацию о них (строки 42-50
). Теперь я создаю словарь с ответом, чтобы обслуживать его красиво, используя pprint
(строки 52-67
) и вернуть результат (строка 69
).
Чтобы протестировать скрипт, я только что вызвал функцию launch_browser
номером демо-автомобиля (на котором по совпадению 2 штрафа ГИБДД) и распечатайте результаты (строки 72-74
):
72 if __name__ == '__main__':
73 multas = launch_browser('MKJ3940', True)
74 print(multas)
Если вы запустите это в скрипте, вы получите вывод, подобный этому (обратите внимание, что он печатает 2 штрафа за нарушение правил дорожного движения, о которых я упоминал 😝):
Вывод
В начале то, что мы думали, будет проектом просто для развлечения, чтобы поработать вместе той ночью. –как мини-хакатон– оказался полезным проектом, который мог быть полезен для жителей Мехико.
Как вы видели, в Python есть инструменты, которые помогают автоматизировать некоторые вещи очень крутыми способами. Я имею в виду, что если вы запустите сценарий в том виде, в котором он предоставлен, вы должны увидеть окно браузера, которое откроется автоматически, затем текст будет написан отдельно в поле ввода, а результаты будут показаны сами по себе. Разве это не здорово?
Пожалуйста, дайте мне знать, что вы строите с помощью Selenium и Python в комментариях! 💻🐍🤙🏼