Создание парсера штрафов за нарушение правил дорожного движения с помощью 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 в комментариях! 💻🐍🤙🏼

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *