Рассказываем о том, как можно сэкономить время и нервы при автоматизации процесса получения данных с веб-сайтов без соответствующего API-интерфейса.
Предположим, что в поисках данных, необходимых для вашего проекта, вы натыкаетесь на такую веб-страницу:
Вот они — все необходимые данные для вашего проекта.
Но что же делать, если нужные вам данные находятся на сайте, который не предоставляет API для их получения? Конечно же, можно потратить несколько часов и написать обработчик, который получит эти данные и преобразует их в нужный для вашего приложения формат.
Но есть и более простое решение — это библиотека Pandas и ее встроенная функция read_html(), которая предназначена для получения данных с html-страниц.
import pandas as pd
tables = pd.read_html("http://apps.sandiego.gov/sdfiredispatch/")
print(tables[0])
Прим. перев. В данной статье используется версия Pandas 0.20.3
Да, все настолько просто. Pandas находит html-таблицы на странице и возвращает их как новый объект DataFrame.
Теперь попробуем указать Pandas, что первая (а точнее нулевая) строка таблицы содержит заголовки столбцов, а также попросим ее сформировать datetime-объект из строки, находящейся в столбце с датой и временем.
Call Date Call Type Street Cross Streets Unit
0 2017-06-02 17:27:58 Medical HIGHLAND AV WIGHTMAN ST/UNIVERSITY AV E17
1 2017-06-02 17:27:58 Medical HIGHLAND AV WIGHTMAN ST/UNIVERSITY AV M34
2 2017-06-02 17:23:51 Medical EMERSON ST LOCUST ST/EVERGREEN ST E22
3 2017-06-02 17:23:51 Medical EMERSON ST LOCUST ST/EVERGREEN ST M47
4 2017-06-02 17:23:15 Medical MARAUDER WY BARON LN/FROBISHER ST E38
5 2017-06-02 17:23:15 Medical MARAUDER WY BARON LN/FROBISHER ST M41
Теперь все эти данные находятся в DataFrame-объекте. Если же нам нужны данные в формате json, добавим еще одну строчку кода:
Выполните код и откройте файл calls.csv. Он откроется в приложении для работы с таблицами:
И, конечно же, Pandas упрощает анализ:
calls_df.describe()
Статистика запроса:
Call Date Call Type Street Cross Streets Unit
count 69 69 69 64 69
unique 29 2 29 27 60
top 2017-06-02 16:59:50 Medical CHANNEL WY LA SALLE ST/WESTERN ST E1
freq 5 66 5 5 2
first 2017-06-02 16:36:46 NaN NaN NaN NaN
last 2017-06-02 17:41:30 NaN NaN NaN NaN
Группировку:
calls_df.groupby("Call Type").count()
Результат группировки:
Call Date Street Cross Streets Unit
Call Type
Medical 66 66 61 66
Traffic Accident (L1) 3 3 3 3
Теперь вы знаете, как с помощью Python и Pandas можно быстро получить данные с практически любого сайта, не прилагая особых усилий. Освободившееся время предлагаем посвятить чтению других интересных материалов по Python на нашем сайте.