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

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

Python SELF UA
Рівень 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 для видалення зайвих пробілів.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ