Автор оригинала: Rodolfo Ferro.
Чтобы увидеть этот пост в лучшем формате, проверьте мой блог .
Мотивация
На днях я вспоминал, что во время моего визита в Мехико в июне 17-го (для моего участия в первом выпуске PythonDay México ) мой друг принимал меня в своем доме во время моего пребывания там. Дело в том, что во время моего пребывания мы говорили о создании чего-то, что могло бы быть полезным, поэтому мы решили создать веб-сайт, на котором владельцы автомобилей из Мехико могли бы проверить свои штрафы за нарушение правил дорожного движения.
Веб-сайт выглядит следующим образом: http://www.multasdetransito.com.mx/infracciones/df-distrito-federal
Как вы, возможно, заметили, если вы открыли сайт, он содержит входные данные для записи номера автомобиля, с которого вы можете искать трафик, прикрепленный к этой табличке (если таковой имеется).
Мой друг сказал мне, что только небольшая группа жителей Мехико знала об этом сайте, поэтому было бы полезно создать что-то, в чем они могли бы легче ознакомиться с этой информацией.
После этого я сказал: “Чувак, сегодня я провел семинар о том, как создать твиттербота за 30 минут для дня PythonDay, что, если мы создадим твиттербота, который вводит табличку на сайт, а затем автоматически удаляет с нее информацию?” . Он сказал “да”. С помощью этого мы создали Multibot Твиттер-бота, который читал номера автомобилей и соскребал штрафы за нарушение правил дорожного движения.
Мы начали с этого проекта как частного проекта, но на днях я был приглашен Отделом права, политики и правительства моего университета, чтобы рассказать о том, как автоматизация может быть полезна для будущих рабочих мест не только для людей в технологической отрасли, но и для политиков и юристов. Когда я вспомнил об этом, я подумал, что это будет хороший пример, поэтому я хотел улучшить его основу и закончил этим примером сценария, которым теперь я хочу поделиться с вами.
Экспериментирование
Я объясню весь код, чтобы вы поняли, что происходит на каждом шагу. Для начала я импортирую Selenium и Python data pretty printer :
1 from selenium import webdriver 2 from pprint import pprint
Selenium позволит нам автоматизировать управление веб-браузером, поэтому идея будет заключаться в том, чтобы использовать его для автоматического открытия веб-сайта, ввода номера автомобиля и после загрузки штрафов ГИБДД, извлечения и анализа их для вывода pprint
.
После этого я создал функцию для запуска браузера и соскабливания информации с номерного знака автомобиля. Если verbose
имеет значение True
, функция выведет подробную информацию о каждом штрафе за трафик:
5 # Browser opener function: 6 def launch_browser(placa, verbose=False): 7 # Browser launch with chromedriver: 8 browser = webdriver.Chrome() 9 10 # Set url and open it on Chrome: 11 url = 'http://www.multasdetransito.com.mx/infracciones/df-distrito-federal' 12 browser.get(url) 13 14 # Search plate: 15 multas = busca_placa_df(browser, placa, verbose) 16 17 # Close browser: 18 browser.quit() 19 return multas
Внутри функции я установил URL-адрес для очистки, затем вызвал функцию с именем busca_placa_df
(что означает search_plate_df , df означает Федеральный округ на испанском языке), а затем закрыл и вышел из открытого браузера для этого поиска.
Затем я построил основную функцию, которая вводит данные, а затем очищает штрафы за нарушение правил дорожного движения:
22 # Plate finder function: 23 def busca_placa_df(browser, placa, verbose=False): 24 # Find ID and input test data: 25 browser.find_element_by_id('plate').clear() 26 browser.find_element_by_id('plate').send_keys(placa) 27 28 # Look for button and click it: 29 browser.find_element_by_xpath('//*[@id="request"]/div[2]/div/a').click() 30 31 # Search result and return it: 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 # Search infraction tables: 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 в комментариях! 💻 🐍 🤙🏼