Учебное пособие по сбору данных о землетрясениях с правительственных веб-сайтов.
Концепция парсинга выглядит простой, но мощной. Существуют миллионы и даже миллиарды веб-сайтов, в которых есть ценные данные, которые вы, возможно, захотите получить. Вы можете просто скопировать данные с веб-сайта и вставить их в текстовый редактор, 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
и помещаем его в result
variable.
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. Подпишитесь на нашу бесплатную еженедельную рассылку здесь.