JavaRush /Курсы /Python SELF /Автоматизация задач на основе времени для регулярного сбо...

Автоматизация задач на основе времени для регулярного сбора данных

Python SELF
40 уровень , 1 лекция
Открыта

1. Работа с погодным API

Теперь, когда мы усвоили основы, давайте рассмотрим реалистичный сценарий. Представьте, что нам необходимо собрать данные о погоде каждые 30 минут. Для этого мы будем использовать API получения погодных данных. Конечно, в учебных целях, использование настоящего API может быть ограничено, поэтому представим, как бы это выглядело.

Получение текущей погоды через OpenWeather API

Этот пример показывает, как с помощью requests получить данные о погоде в конкретном городе, используя API OpenWeather.

Python

import schedule
import time
import requests

def fetch_weather(city):
    api_key = "YOUR_API_KEY"  # Замените на ваш API-ключ OpenWeather
    url = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={api_key}&units=metric"

    try:
        response = requests.get(url)
        response.raise_for_status()
        data = response.json()
        temperature = data["main"]["temp"]
        weather_description = data["weather"][0]["description"]
        print(f"Текущая температура в {city}: {temperature}°C")
        print(f"Описание погоды: {weather_description}")
    except requests.exceptions.RequestException as e:
        print(f"Ошибка при получении данных о погоде: {e}")

def fetch_weather_of_london():
    fetch_weather("London")

# Настройка выполнения задачи каждые 30 минут
schedule.every(30).minutes.do(fetch_weather_of_london)

while True:
    schedule.run_pending()
    time.sleep(1)

Здесь мы отправляем GET-запрос к API OpenWeather, чтобы получить текущую погоду для заданного города. В ответе JSON мы извлекаем температуру и описание погоды, которые выводим на экран. Не забудьте заменить YOUR_API_KEY на свой ключ API.

Получение текущего курса валют с API

В этом примере мы будем использовать requests для получения текущего курса валют через API.

Python

import schedule
import time
import requests

def fetch_exchange_rate():
    url = "https://api.exchangerate-api.com/v4/latest/USD"
    try:
        response = requests.get(url)
        response.raise_for_status()  # Проверка на успешное выполнение запроса
        data = response.json()
        usd_to_eur = data["rates"]["EUR"]
        print(f"Текущий курс USD к EUR: {usd_to_eur}")
    except requests.exceptions.RequestException as e:
        print(f"Произошла ошибка при получении данных: {e}")

# Настройка выполнения задачи каждые 10 минут
schedule.every(10).minutes.do(fetch_exchange_rate)

while True:
    schedule.run_pending()
    time.sleep(1)

Здесь мы отправляем GET-запрос к API обменного курса валют и получаем данные в формате JSON. Курс USD к EUR извлекается из JSON-ответа и выводится на экран. Этот скрипт можно адаптировать для сбора данных по другим валютным парам, изменяя ключ в data["rates"].

С помощью этого скрипта мы можем постоянно собирать данные о погоде и о валюте. Неплохо для начала, правда?

Реальные сценарии использования

Автоматизация сбора данных может быть полезна в разных сценариях:

  • Мониторинг состояния серверов: Автоматические проверки состояния сервера могут выявить и предупредить о проблемах до их возникновения.
  • Сбор данных о соцсетях: Постоянный анализ трендов и упоминаний брендов.
  • Отслеживание курсов валют: Изменения курса валют могут быть полезны для бизнеса или личных нужд.

2. Пример автоматизированного сбора веб-данных

Что, если мы хотим собирать данные с веб-страницы? Скажем, регулярно проверять наличие новостей. Для этого нам на помощь придет BeautifulSoup и requests.

Сбор данных с веб-страницы

Допустим, у нас есть сайт, с которого мы хотим собирать заголовки новостей. Вот как мы можем это сделать:

Python

import requests
from bs4 import BeautifulSoup

def fetch_news():
    response = requests.get("http://example.com/news")
    soup = BeautifulSoup(response.content, 'html.parser')
    for headline in soup.find_all('h2', class_='news'):
        print(headline.text)

schedule.every().hour.do(fetch_news)

while True:
    schedule.run_pending()
    time.sleep(1)

В этом примере мы можем видеть, что каждые 60 минут наш скрипт будет проверять веб-страницу и выводить заголовки новостей. Это упрощает процесс получения актуальной информации.

Сбор заголовков новостей с веб-сайта

В этом примере мы будем использовать requests для загрузки HTML-страницы и BeautifulSoup для парсинга заголовков новостей.

Python

import requests
from bs4 import BeautifulSoup

def fetch_news_headlines():
    url = "https://www.bbc.com/news"
    try:
        response = requests.get(url)
        response.raise_for_status()
        soup = BeautifulSoup(response.text, 'html.parser')
        
        headlines = soup.find_all('h3')  # Поиск всех тегов <h3> (где обычно находятся заголовки)
        print("Последние заголовки новостей на BBC:")
        for headline in headlines[:5]:  # Берем первые 5 заголовков
            print("-", headline.get_text(strip=True))
    except requests.exceptions.RequestException as e:
        print(f"Ошибка при получении данных: {e}")

fetch_news_headlines()

Здесь мы загружаем страницу BBC News и с помощью BeautifulSoup ищем все теги <h3>, где находятся заголовки новостей. Мы выводим первые 5 заголовков, удаляя лишние пробелы и символы с помощью strip=True.

Сбор данных о ценах товаров с интернет-магазина

Этот пример показывает, как извлекать данные о ценах товаров с сайта интернет-магазина (например, Amazon или другого магазина). Используем requests для запроса страницы и BeautifulSoup для парсинга цен.

Python

import requests
from bs4 import BeautifulSoup

def fetch_product_price(url):
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36"
    }
    try:
        response = requests.get(url, headers=headers)
        response.raise_for_status()
        
        soup = BeautifulSoup(response.text, 'html.parser')
        product_name = soup.find('span', {'id': 'productTitle'}).get_text(strip=True)
        price = soup.find('span', {'class': 'a-price-whole'}).get_text(strip=True)
        
        print(f"Товар: {product_name}")
        print(f"Цена: {price} руб.")
    except requests.exceptions.RequestException as e:
        print(f"Ошибка при получении данных: {e}")
    except AttributeError:
        print("Не удалось найти информацию о товаре или цене")

# Пример ссылки на товар
fetch_product_price("https://www.amazon.com/dp/B08N5WRWNW")

В этом примере мы отправляем GET-запрос с заголовком User-Agent, чтобы избежать блокировок. Затем, используя BeautifulSoup, мы ищем название продукта по его id="productTitle" и цену товара по классу a-price-whole. Мы используем strip=True для удаления лишних пробелов.

Комментарии (3)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Long_byte Уровень 55
3 октября 2025
хорошо было бы показать примеры с асинхронными функциями
Slevin Уровень 2
28 июля 2025
>> Сбор заголовков новостей с веб-сайта >> Сбор данных о ценах товаров с интернет-магазина Эти темы так относятся к schedule, что он даже не импортируется в коде. Задачи ровно так-же не относятся к schedule (потому что там нечего учить дольше 1-2 лекций, а не уровней). Они про BeautifulSoup и прочий web-scrapping который не пригодится 9 из 10 будущим давителям питона - никогда.
Vlad Tagunkov Уровень 36
15 января 2025
валидатор анализирует не только код но и комменты. даже если в коде все верно но в комменте ошибка задача не засчитывается :)