1. Работа с погодным API
Теперь, когда мы усвоили основы, давайте рассмотрим реалистичный сценарий. Представьте, что нам необходимо собрать данные о погоде каждые 30 минут. Для этого мы будем использовать API получения погодных данных. Конечно, в учебных целях, использование настоящего API может быть ограничено, поэтому представим, как бы это выглядело.
Получение текущей погоды через OpenWeather API
Этот пример показывает, как с помощью requests получить данные о погоде в конкретном городе, используя API OpenWeather.
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.
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.
Сбор данных с веб-страницы
Допустим, у нас есть сайт, с которого мы хотим собирать заголовки новостей. Вот как мы можем это сделать:
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 для парсинга заголовков новостей.
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 для парсинга цен.
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 для удаления лишних пробелов.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ