CoderCastrov logo
CoderCastrov
Парсер

Как парсить последние данные о землетрясениях с государственного веб-сайта

Как парсить последние данные о землетрясениях с государственного веб-сайта
просмотров
7 мин чтение
#Парсер

Руководство по парсингу данных о землетрясениях с государственных веб-сайтов.

Концепция парсинга выглядит простой, но мощной. Есть миллионы, даже миллиарды веб-сайтов, на которых хранятся ценные данные, которые вам могут понадобиться. Вы можете просто скопировать данные с веб-сайта и вставить их в текстовый редактор, 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.

PyCharm Preferences

В разделе Проект:<Название проекта> нажмите на Python Interpreter. Нажмите кнопку плюс "+", а затем найдите beautifulsoup4.

Python Interpreter

Выберите пакет beautifulsoup4 и нажмите Установить пакет внизу. Сделайте то же самое с пакетом requests.

Установка пакета

Дождитесь завершения установки и закройте "Доступные пакеты". Вы вернетесь в окно "Настроек", нажмите OK. Теперь пакет готов к использованию.

Использование терминала

Использование терминала позволяет работать быстрее, если вы привыкли к нему. Введите следующий код, чтобы установить пакет, и дождитесь завершения процесса.

pip install beautifulsoup4
pip install requests
Terminal

Определение функций для извлечения данных из веб-страниц

Ниже показана структура моего проекта. У меня есть только два модуля: файлы init.py и main.py. В файле init.py я определяю функцию для извлечения данных из веб-страницы, а затем вызываю ее из файла main.py.

Project Directory

Данные, которые мы хотим получить с https://bmkg.go.id, находятся в красном прямоугольнике на следующей картинке.

Web Data

Вот полный код файла 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. Подпишитесь на наш бесплатный еженедельный бюллетень здесь.