Рассказываем о том, как можно сэкономить время и нервы при автоматизации процесса получения данных с веб-сайтов без соответствующего 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 на нашем сайте.
Релиз Python 3.13 принес возможность отключения GIL, что значительно улучшает производительность многопоточных приложений. Отключение GIL позволяет потокам работать параллельно, открывая новые горизонты для многопоточной обработки данных.