Учебное пособие по сбору данных о землетрясениях с правительственных веб-сайтов.

Концепция парсинга выглядит простой, но мощной. Существуют миллионы и даже миллиарды веб-сайтов, в которых есть ценные данные, которые вы, возможно, захотите получить. Вы можете просто скопировать данные с веб-сайта и вставить их в текстовый редактор, Excel или любой другой инструмент. Но, конечно, это долго и неэффективно. Вот почему нам нужен язык программирования для автоматического выполнения процесса.

Python — хороший язык программирования для начинающих, так как вы можете легко читать код. Множество пакетов, созданных разработчиками, делают его еще более полезным. Пакеты, которые мы будем использовать для этого проекта, это beautifulsoup4 и requests(с ‘s’). Вы можете найти его на https://pypi.org/project/beautifulsoup4/ и https://pypi.org/project/requests/ или перейти на https://pypi.org/. » и введите beautifulsoup4и запросы в поле "поиск проекта". Там вы можете найти все подробности, связанные с проектом.

Здесь я покажу вам, как использовать этот пакет. Я сделаю это в 3 главе

  • Установите BeautifulSoup4 и пакет запросов
  • Определить функции для извлечения данных из Интернета
  • Вызов функции

Я также предполагаю, что вы:

  • Знакомство с PyCharm
  • Знать базовый синтаксис Python
  • Знать, как проверить элемент
  • Знать некоторые основы HTML

Установите BeautifulSoup4 и пакет запросов

Перед установкой пакета убедитесь, что ваш проект работает в виртуальной среде Python. Это делается для того, чтобы ваш проект не пересекался с системным интерпретатором. Если вы не знаете, как его использовать, посмотрите мою предыдущую статью о виртуальной среде здесь:



Как обычно, мы используем PyCharm. Существует 2 способа установить пакет в ваш проект. Используя настройки PyCharm или введите на терминале.

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

Чтобы добавить пакет, перейдите в PyCharm Настройки.

В разделе Project:‹ProjectName› нажмите Python Interpreter.
Нажмите кнопку "+" и выполните поиск beautifulsoup4.

Нажмите на пакет beautifulsoup4, затем нажмите Установить пакет внизу. Сделайте то же самое с пакетом requests.

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

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

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

pip install beautifulsoup4
pip install requests

Определить функции для извлечения данных из Интернета

Ниже находится каталог моего проекта. У меня есть только 2 модуля: файл __init__.py и main.py. Я определяю функцию для извлечения данных из Интернета в __init__.py и вызываю ее из main.py.

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

Вот полный код __init__.py. Давайте разберемся.

Импорт-Пакет/Модуль

import requests
from bs4 import BeautifulSoup

Импортируйте пакет, который мы будем использовать: requests и beautifulsoup.

Использовать обработку исключений и запрашивать данные из Интернета

# Extract data from Website

def data_extraction():
    try:
        content = requests.get('https://bmkg.go.id')
    except Exception:
        return None

Мы создаем функцию data_extraction и ставим ее на обработку исключений по возвращаемому значению None, если есть ошибка. Здесь мы используем модуль requests.get, чтобы получить HTML-код с веб-сайта https://bmkg.go.id и поместить данные в переменную content.

Получить данные о дате и времени

Если вы посмотрите на код, мы используем 2 разных кода для получения данных. Первый код предназначен для получения данных о дате и времени, а второй — для получения величины, глубины, ls, bt, местоположения и воспринимаемыеданные. Это связано с разным форматом между ними в коде HTML. Значение даты и времени находится внутри тега ‹span›, а другое значение вне тега ‹span› под тегом ‹li›. Это искусство парсинга данных. Ваш код будет зависеть от того, как веб-разработчики создают свои веб-сайты.

if content.status_code == 200:
    # Get and assign Date and Time data
    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:code проверяет, дает ли код состояния HTTP из переменной content успешный ответ (200). Если соединение успешно, строка после этого выполняется. Затем мы используем функцию BeautifulSoup, чтобы получить текст контентана soup = BeautifulSoup(content.text, ‘html.parser’)Затем мы ищем тег spanс классомwaktu и поместите его в переменную result. Затем, используя ту же переменную result, мы получаем его текст, затем разделяем результат, который имеет разделитель ‘, ‘. Он покажет значение [’01 Desember 2021', ‘07:05:45 WIB’]Есть значение уже в форме списка, теперь мы помещаем индекс 0 в переменную dateи индекс 1 в переменную time.Теперь мы уже получили значения date и time.

Получите и назначьте величину, глубину, ls, bt, местоположение и воспринимаемые данные

# Get and assign magnitude, depth, ls, bt, location, and perceived data
result = soup.find('div', {'class', 'col-md-6 col-xs-6 gempabumi-detail no-padding'})
result = result.findChildren('li')

Как видно из HTML-кода, чтобы получить значение величины, глубины и т. д., нам нужен другой подход, например, положение значения вне тега span. Мы находим данные внутри тега div,под классомcol-md-6 col-xs-6 gempabumi-detail no-padding.Итак, мы находим тег li и помещаем его в resultvariable.

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

В конце этой функции мы return output, если соединение успешно и после выполнения кода. В противном случае return None, если соединение не удалось.

Показать данные извлечения

Теперь мы получили все данные и присвоили их переменным. Вторая функция — показать данные, которые у нас есть.

# Show the data from extraction

def show_data(result):
    if result is None:
        print('Latest earthquake data is not found')
        return
    print('Latest earthquacke based on BMKG')
    print(f"Date: {result['date']}")
    print(f"Time: {result['time']}")
    print(f"Magnitude: {result['magnitude']}")
    print(f"Depth: {result['depth']}")
    print(f"Coordinate: LS={result['coordinate']['ls']}, BT={result['coordinate']['bt']}")
    print(f"Location: {result['location']}")
    print(f"Perceived: {result['perceived']}")

В приведенном выше коде функция show_data с параметром result будет печатать Latest earthquake data is not foundесли при выполнении функции data_extraction возникнет ошибка, такая как ошибка соединения и т. д. В противном случае программа продолжит выполнение следующей строки. Он начинается с печати Latest earthquacke based on BMKG, затем Date со значением из словаря result с ключом date и так далее для Time, Magnitude, Depth, Coordinate, Location и Perceived.

Вызов функции

Мы уже определили все необходимые функции. Теперь в файле 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.

Сделанный!! Этот проект — то, как выглядит Data Scraping простым способом. Получите данные с любого сайта, затем покажите их. Вы можете запланировать запуск программы в определенное время, использовать данные на другой платформе или любые другие возможности. Это сложно, но весело иметь возможность выполнять очистку данных. Широкое использование, которое будет полезно для многих проектов.

До встречи в следующих историях.

Больше контента на plainenglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку здесь.