Найти в Дзене
keskes

Парсинг данных с сайта за 5 минут: Python + BeautifulSoup 🌐

Интернет переполнен данными, и часто возникает необходимость извлекать их с веб-страниц для своих задач. В этой статье мы разберём, как с помощью Python и библиотеки BeautifulSoup можно быстро и просто спарсить данные с сайта. моя телега pip install requests beautifulsoup4 import requests from bs4 import BeautifulSoup import re # Функция для транслитерации с кириллицы на латиницу def translit(text): alphabet = { 'а': 'a', 'б': 'b', 'в': 'v', 'г': 'g', 'д': 'd', 'е': 'e', 'ё': 'e', 'ж': 'zh', 'з': 'z', 'и': 'i', 'й': 'i', 'к': 'k', 'л': 'l', 'м': 'm', 'н': 'n', 'о': 'o', 'п': 'p', 'р': 'r', 'с': 's', 'т': 't', 'у': 'u', 'ф': 'f', 'х': 'kh', 'ц': 'ts', 'ч': 'ch', 'ш': 'sh', 'щ': 'shch', 'ы': 'y', 'э': 'e', 'ю': 'yu', 'я': 'ya', ' ': '_', 'ь': '', 'ъ': '', '–': '-', # Убираем 'ь' и 'ъ', пробел заменяем на '_', тире на '-' } return ''.join(alphabet.get(c, c) for c in text.lower()) def get_weather(city_name): try: city_name_formatted = translit(city_name) url = f"https://pogoda.mail.ru/pr
Оглавление

Интернет переполнен данными, и часто возникает необходимость извлекать их с веб-страниц для своих задач. В этой статье мы разберём, как с помощью Python и библиотеки BeautifulSoup можно быстро и просто спарсить данные с сайта.

моя телега

Мы создадим скрипт, который соберёт актуальные данные о погоде с сайта pogoda.mail
Мы создадим скрипт, который соберёт актуальные данные о погоде с сайта pogoda.mail

🛠 Что нам понадобится?

  1. Python (установите последнюю версию с официального сайта).
  2. Установим нужные библиотеки:
pip install requests beautifulsoup4

📋 Полный код для парсинга данных

import requests
from bs4 import BeautifulSoup
import re
# Функция для транслитерации с кириллицы на латиницу
def translit(text):
alphabet = {
'а': 'a', 'б': 'b', 'в': 'v', 'г': 'g', 'д': 'd', 'е': 'e', 'ё': 'e', 'ж': 'zh', 'з': 'z', 'и': 'i', 'й': 'i',
'к': 'k', 'л': 'l', 'м': 'm', 'н': 'n', 'о': 'o', 'п': 'p', 'р': 'r', 'с': 's', 'т': 't', 'у': 'u', 'ф': 'f',
'х': 'kh', 'ц': 'ts', 'ч': 'ch', 'ш': 'sh', 'щ': 'shch', 'ы': 'y', 'э': 'e', 'ю': 'yu', 'я': 'ya',
' ': '_', 'ь': '', 'ъ': '', '–': '-', # Убираем 'ь' и 'ъ', пробел заменяем на '_', тире на '-'
}
return ''.join(alphabet.get(c, c) for c in text.lower())
def get_weather(city_name):
try:
city_name_formatted = translit(city_name)
url = f"https://pogoda.mail.ru/prognoz/{city_name_formatted}/"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
}
response = requests.get(url, headers=headers)
response.raise_for_status()
soup = BeautifulSoup(response.text, "html.parser")
# Основная температура
temp_element = soup.find("div", class_="information__content__temperature")
temperature = temp_element.text.strip().replace('°', '°C') if temp_element else "Неизвестно"
# Ощущается как
feels_like = soup.find("span", string=re.compile(r"ощущается как"))
feels_like = feels_like.find_next_sibling(text=True).strip() if feels_like else "Не указано"
# Тип облачности
weather_type = soup.find("div", class_="information__content__additional information__content__additional_first")
weather_type = weather_type.find("div").text.strip() if weather_type else "Не указано"
# Информация о ветре
wind_element = soup.find("span", title=re.compile(r"Ветер"))
wind_info = wind_element["title"].split(":")[1].strip() if wind_element else "Нет данных"
# Итоговый текст
result = f"""
В городе {city_name.capitalize()} сейчас:
Температура: {temperature}
Ощущается как: {feels_like}
Облачность: {weather_type}
Ветер: {wind_info}
"""
return result.strip()
except requests.exceptions.RequestException as e:
return f"Ошибка при подключении к сайту: {e}"
except Exception as e:
return f"Произошла ошибка: {e}"
def main():
print("🌤️ Добро пожаловать в погодный бот!")
print("Введите название города, чтобы узнать текущую погоду.")
while True:
city = input("\nВведите город (или 'выход' для завершения): ").strip()
if city.lower() in ["выход", "exit"]:
print("👋 Спасибо за использование программы! До встречи!")
break
else:
weather_info = get_weather(city)
print(weather_info)
if __name__ == "__main__":
main()

✈Краткое объяснение кода:

1. Импорт библиотек:

  • requests — для отправки HTTP-запросов.
  • BeautifulSoup из bs4 — для парсинга HTML-кода страницы.
  • re — для работы с регулярными выражениями.

2. Функция translit(text):

  • Транслитерирует русские буквы в латиницу.
  • Заменяет пробелы на _, тире оставляет, а мягкий и твёрдый знаки удаляет.
  • Используется для преобразования названия города в формат URL.

3. Функция get_weather(city_name):

  • Принимает название города и:
  1. Транслитерирует его с помощью translit().
  2. Формирует URL для запроса погоды на сайте Mail.ru.
  3. Отправляет запрос на сайт с заданными заголовками headers.
  4. С помощью BeautifulSoup извлекает:
  • Температуру (из блока с классом information__content__temperature).
  • Чувствуется как (ищет span, содержащий текст "ощущается как").
  • Тип облачности (первый div в блоке с дополнительной информацией).
  • Ветер (берёт из span с атрибутом title, содержащим слово "Ветер").

Формирует и возвращает текстовый отчёт с данными о погоде.
Если запрос не удался, выводит сообщение об ошибке.

4. Функция main():

  • Позволяет пользователю взаимодействовать с программой:
  1. Приветствует пользователя.
  2. Просит ввести название города (или "выход" для завершения).
  3. Вызывает get_weather() для получения данных о погоде и выводит их.
  4. Завершает работу при вводе команды "выход".

5. Точка входа:

  • Если скрипт запущен как основная программа (if __name__ == "__main__"), вызывается функция main().

Примеры вывода погоды из разных городов:

парсинг погоды с mail.pogoda
парсинг погоды с mail.pogoda

Подписывайтесь на мой Telegram-канал для ещё большего количества крутых материалов.

Теперь вы знаете, как легко и быстро извлекать актуальную информацию из интернета! 🚀