Как парсить последние данные о землетрясениях с государственного веб-сайта
Table Of Content
- Руководство по парсингу данных о землетрясениях с государственных веб-сайтов.
- Установка пакетов beautifulsoup4 и requests
- Лучшие практики использования виртуального окружения Python
- Виртуальное окружение - это лучшая практика, которую должен знать каждый программист на Python.
- Использование настроек PyCharm
- Использование терминала
- Определение функций для извлечения данных из веб-страниц
- Импорт пакетов/модулей
- Использование обработки исключений и запрос данных с веб-страницы
- Извлечение данных с веб-сайта
- Получение данных о дате и времени
- Получение и присвоение данных о магнитуде, глубине, ls, bt, местоположении и воспринимаемых данных
- Получение и присвоение данных о магнитуде, глубине, ls, bt, местоположении и воспринимаемых данных
- Показать данные из извлечения
- Показать данные из извлечения
- **Вызов функции**
Руководство по парсингу данных о землетрясениях с государственных веб-сайтов.
Концепция парсинга выглядит простой, но мощной. Есть миллионы, даже миллиарды веб-сайтов, на которых хранятся ценные данные, которые вам могут понадобиться. Вы можете просто скопировать данные с веб-сайта и вставить их в текстовый редактор, Excel или любой другой инструмент. Но, конечно, это занимает много времени и неэффективно. Поэтому нам нужен язык программирования, чтобы автоматически выполнять этот процесс.
Python - хороший язык программирования для начинающих, так как вы можете легко читать код. Множество пакетов, созданных разработчиками, делают его еще более полезным. Пакеты, которые мы собираемся использовать для этого проекта, - beautifulsoup4 и requests (с 's'). Вы можете найти их на https://pypi.org/project/beautifulsoup4/ и https://pypi.org/project/requests/ или перейти на https://pypi.org/ и ввести beautifulsoup4 и requests в поле "поиск проекта". Там вы можете найти все подробности, связанные с проектом.
Здесь я покажу вам, как использовать этот пакет. Я разделю его на 3 главы:
- Установка пакетов beautifulsoup4 и requests
- Определение функций для извлечения данных из веб-сайта
- Вызов функции
Я также предполагаю, что вы:
- Знаете PyCharm
- Знаете основы синтаксиса Python
- Умеете использовать инструмент "Инспектировать элемент"
- Знаете основы HTML
Установка пакетов beautifulsoup4 и requests
Перед установкой пакета убедитесь, что ваш проект работает в Python Virtual Environment. Это необходимо, чтобы избежать конфликтов с системным интерпретатором. Если вы не знаете, как использовать виртуальное окружение, ознакомьтесь с моей предыдущей статьей о виртуальном окружении Python здесь:
Лучшие практики использования виртуального окружения Python
Виртуальное окружение - это лучшая практика, которую должен знать каждый программист на Python.
riautechdev.medium.com
Как обычно, мы используем PyCharm. Существует 2 способа установки пакета в ваш проект. С помощью настроек PyCharm или вводом команды в терминале.
Использование настроек PyCharm
Чтобы добавить пакет, перейдите в Настройки PyCharm.
В разделе Проект:<Название проекта>
нажмите на Python Interpreter. Нажмите кнопку плюс "+", а затем найдите beautifulsoup4.
Выберите пакет beautifulsoup4 и нажмите Установить пакет внизу. Сделайте то же самое с пакетом requests.
Дождитесь завершения установки и закройте "Доступные пакеты". Вы вернетесь в окно "Настроек", нажмите OK. Теперь пакет готов к использованию.
Использование терминала
Использование терминала позволяет работать быстрее, если вы привыкли к нему. Введите следующий код, чтобы установить пакет, и дождитесь завершения процесса.
pip install beautifulsoup4
pip install requests
Определение функций для извлечения данных из веб-страниц
Ниже показана структура моего проекта. У меня есть только два модуля: файлы init.py и main.py. В файле init.py я определяю функцию для извлечения данных из веб-страницы, а затем вызываю ее из файла main.py.
Данные, которые мы хотим получить с https://bmkg.go.id, находятся в красном прямоугольнике на следующей картинке.
Вот полный код файла init.py. Давайте разберем его по частям.
Импорт пакетов/модулей
import requests
from bs4 import BeautifulSoup
Импортируем пакеты/модули, которые мы собираемся использовать - requests и beautifulsoup.
Использование обработки исключений и запрос данных с веб-страницы
# Извлечение данных с веб-сайта
def извлечение_данных():
try:
content = requests.get('https://bmkg.go.id')
except Exception:
return None
Мы создаем функцию извлечение_данных
и помещаем ее в блок обработки исключений, возвращая значение None
, если происходит ошибка. Здесь мы используем модуль requests.get для получения HTML-кода с веб-сайта [https://bmkg.go.id](https://bmkg.go.id)
и сохраняем данные в переменной content.
Получение данных о дате и времени
Если посмотреть на код, мы используем 2 разных кода для получения данных. Первый код предназначен для получения данных о дате и времени, а второй код предназначен для получения данных о величине, глубине, ls, bt, местоположении и воспринимаемых данных. Это связано с различным форматом между ними в HTML-коде. Значение даты и времени находится внутри тега <**span>
, в то время как остальные значения находятся вне тега <**span>
под тегом <**li>
**. Вот искусство парсинга данных. Ваш код будет зависеть от того, как веб-разработчики создают свои веб-сайты.
if content.status_code == 200:
# Получение и присвоение данных о дате и времени
soup = BeautifulSoup(content.text, 'html.parser')
result = soup.find('span', {'class': 'waktu'})
result = result.text.split(', ')
date = result[0]
time = result[1]
Код if content.status_code == 200:
проверяет, дает ли переменная content успешный ответ HTTP (код 200). Если соединение успешно, выполняется следующая строка. Затем мы используем функцию BeautifulSoup для получения текста из переменной content в soup = BeautifulSoup(content.text, 'html.parser')
. Затем мы ищем тег span с классом waktu и помещаем его в переменную result. Затем, используя ту же переменную result, мы получаем текст из него и разделяем результат, который имеет разделитель ‘, ‘. Это покажет значение [’01 Декабря 2021', ‘07:05:45 WIB’]
. Значение уже находится в форме списка, теперь мы помещаем индекс 0 в переменную date
и индекс 1 в переменную time
. Теперь у нас есть значения date
и time
.
Получение и присвоение данных о магнитуде, глубине, ls, bt, местоположении и воспринимаемых данных
# Получение и присвоение данных о магнитуде, глубине, ls, bt, местоположении и воспринимаемых данных
result = soup.find('div', {'class', 'col-md-6 col-xs-6 gempabumi-detail no-padding'})
result = result.findChildren('li')
Как видно из HTML-кода, для получения значения магнитуды, глубины и т.д. нам нужен другой подход, так как значение находится вне тега span. Мы находим данные внутри тега div, под class col-md-6 col-xs-6 gempabumi-detail no-padding
. Поэтому мы находим тег li
и помещаем его в переменную result
.
i = 0
magnitude = None
depth = None
ls = None
bt = None
location = None
perceived = None
for res in result:
if i == 1:
magnitude = res.text
elif i == 2:
depth = res.text
elif i == 3:
coordinate = res.text.split(' - ')
ls = coordinate[0]
bt = coordinate[1]
elif i == 4:
location = res.text
elif i == 5:
perceived = res.text
i = i + 1
Затем мы определяем начальное значение каждой переменной magnitude = None
и так далее. После этого мы создаем цикл for
для переменной result
и присваиваем каждое значение индекса соответствующей переменной.
output = dict()
output['date'] = date
output['time'] = time
output['magnitude'] = magnitude
output['depth'] = depth
output['coordinate'] = {'ls': ls, 'bt': bt}
output['location'] = location
output['perceived'] = perceived
Затем мы создаем словарь output
. Затем мы добавляем все полученные значения из цикла в словарь.
return output
else:
return None
В конце этой функции мы возвращаем output
, если соединение успешно и после выполнения кода. В противном случае возвращаем None
, если соединение не удалось.
Показать данные из извлечения
Теперь у нас есть все данные и мы присваиваем их переменным. Вторая функция предназначена для отображения полученных данных.
# Показать данные из извлечения
def show_data(result):
if result is None:
print('Последние данные об землетрясении не найдены')
return
print('Последний землетрясение на основе данных BMKG')
print(f"Дата: {result['date']}")
print(f"Время: {result['time']}")
print(f"Магнитуда: {result['magnitude']}")
print(f"Глубина: {result['depth']}")
print(f"Координаты: Широта={result['coordinate']['ls']}, Долгота={result['coordinate']['bt']}")
print(f"Местоположение: {result['location']}")
print(f"Ощущение: {result['perceived']}")
В приведенном выше коде функция show_data
с параметром result
будет печатать Последние данные об землетрясении не найдены
, если возникнет ошибка, такая как ошибка соединения и т. д., при выполнении функции data_extraction
. В противном случае программа будет продолжать выполнение следующей строки. Она начинается с печати Последний землетрясение на основе данных BMKG
, затем Дата
со значением из словаря result
с ключом date
, и так далее для Время
, Магнитуда
, Глубина
, Координаты
, Местоположение
и Ощущение
.
Вызов функции
Мы уже определили все необходимые функции. Теперь в файле main.py мы вызываем функцию, чтобы показать результаты последних данных об землетрясениях. Это занимает всего несколько строк.
Мы импортируем пакет latestearthquake
, в котором есть модуль init.py. Строка if __name__ == '__main__':
выполняет код внутри нее только при запуске файла main.py. Если мы импортируем его из других модулей, код внутри if
не будет выполняться.
Если выполнены требования, программа выведет Main Application.
На строке result = latestearthquake.data_extraction()
мы вызываем функцию data_extraction()
из пакета latestearthquake
и присваиваем ее переменной result
. Это означает, что данные с веб-сайта уже извлечены и сохранены в новой переменной с именем result
. Данные здесь еще не отображаются, поэтому на следующей строке мы показываем данные, вызывая функцию show_data()
и используя параметр result
.
Готово!! Этот проект демонстрирует, как выглядит парсинг данных в простом виде. Получаем данные с любого сайта и показываем их. Вы можете запланировать запуск программы в определенное время, использовать данные на другой платформе или в любых других проектах. Парсинг данных - это интересно и вызывает увлечение. Это широко используемая техника, которая будет полезна для множества проектов. До новых историй!
Больше контента на plainenglish.io. Подпишитесь на наш бесплатный еженедельный бюллетень здесь.