Рубрики
Без рубрики

Создание скребка для очистки трафика с помощью Python

Создание скребка для очистки трафика с помощью Python и Селена

Автор оригинала: 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 в комментариях! 💻 🐍 🤙🏼