Алекс Артемов
Алекс Артемов личный блог
13 апреля 2023, 00:00

Автоматизация отслеживания курса валют на Python

Всем привет. Напишем небольшую программу на Python для отслеживания курса валюты.
Программа будет работать следующим образом: данные будут скопированы из поисковой выдачи Google, после чего будет произведено сравнение изменения курса с момента запуска программы. В случае значительного изменения курса, программа будет автоматически отправлять уведомление в Telegram.

Первое, что нужно сделать — это решить, откуда брать курсы валют. Парсить данные будем с поисковой выдачи Google, чтобы не платить за API. Чтобы начать создавать программу, необходимо установить Python с официального сайта и загрузить IDE. Можно использовать PyCharm или любой другой редактор кода. Второе, нужно будет написать код для парсинга данных из поисковой выдачи Google, а затем сравнивать текущий курс с предыдущим.
Затем нам потребуются несколько библиотек. Первой из них является requests, которая позволит нам получать данные с сайтов. Второй библиотекой является BeautifulSoup, которая поможет нам парсить HTML-разметку и вытаскивать из нее нужные данные.

Устанавливаем библиотеки:

pip install requests
pip install beautifulsoup4
Создаем новый файл внутри проекта с названием main.py и начинаем писать следующий код:
import requests
from bs4 import BeautifulSoup
import time

# Функция для получения курса валюты
def get_currency_rate():
    # Адрес сайта, с которого мы будем получать данные
    url = "https://www.google.com/search?q=курс+доллара+к+рублю"
    
    # Получаем содержимое страницы
    response = requests.get(url)
    
    # Создаем объект BeautifulSoup для парсинга HTML-разметки
    soup = BeautifulSoup(response.content, "html.parser")
    
    # Получаем элемент с курсом валюты
    result = soup.find("div", class_="BNeawe iBp4i AP7Wnd").get_text()
    
    # Возвращаем курс валюты как число
    return float(result.replace(",", "."))

# Основной код программы
if __name__ == "__main__":
    # Получаем текущий курс валюты
    current_rate = get_currency_rate()
    print(f"Текущий курс валюты: {current_rate}")
    
    # Запускаем бесконечный цикл
    while True:
        # Ждем 5 секунд
        time.sleep(5)
        
        # Получаем новый курс валюты
        new_rate = get_currency_rate()
        
        # Если произошло сильное изменение курса валюты, отправляем уведомление
        if abs(new_rate - current_rate) > 2:
            print(f"Сильное изменение курса валюты! Старое значение: {current_rate}, новое значение: {new_rate}")
            current_rate = new_rate

Здесь мы получаем текущий курс валюты с помощью библиотек requests и BeautifulSoup и запускаем бесконечный цикл, который каждые 5 секунд получает новый курс валюты и проверяет, произошло ли сильное изменение курса. 

Для отправки уведомлений через Telegram Bot API необходимо создать бота в Telegram и получить его токен. Для этого подойдёт библиотека python-telegram-bot, чтобы настроить отправку сообщений:

import telegram

# Создаем объект бота и указываем токен
bot = telegram.Bot(token='YOUR_TELEGRAM_BOT_TOKEN')

# Получаем идентификатор чата, в который будем отправлять уведомление
chat_id = 'YOUR_TELEGRAM_CHAT_ID'

# Формируем текст сообщения с информацией о курсе валют
message_text = 'Курс доллара превысил 75 рублей'

# Отправляем сообщение
bot.send_message(chat_id=chat_id, text=message_text)

Для добавления возможности отслеживания нескольких валют одновременно и установки пороговых значений изменения курса для отправки уведомлений напишем следующий код:

import time
import requests
from bs4 import BeautifulSoup
import smtplib
import matplotlib.pyplot as plt

# Добавляем информацию о валютах и пороговых значениях
currencies = {'USD': {'threshold': 1.0, 'rate': 0}, 
              'EUR': {'threshold': 1.0, 'rate': 0},
              'GBP': {'threshold': 1.0, 'rate': 0}}

# Функция отправки уведомлений через Telegram Bot API
def send_notification(currency, rate):
    token = 'your_token'
    chat_id = 'your_chat_id'
    message = f'{currency} rate is {rate}'
    url = f'https://api.telegram.org/bot{token}/sendMessage?chat_id={chat_id}&text={message}'
    requests.get(url)

# Функция создания графиков
def create_graph(currency, rates):
    plt.plot(rates)
    plt.ylabel(f'{currency} rate')
    plt.show()

while True:
    # Парсим данные с сайта Центробанка
    url = 'https://www.cbr.ru/'
    response = requests.get(url)
    soup = BeautifulSoup(response.content, 'html.parser')
    
    # Получаем информацию о каждой валюте и ее курсе
    for currency, data in currencies.items():
        currency_rate = soup.find('div', {'class': f'currency__rate__{currency.lower()}'})
        rate = float(currency_rate.find('div', {'class': 'currency__rate__value'}).text.replace(',', '.'))
        
        # Если курс изменился больше, чем пороговое значение, отправляем уведомление
        if abs(rate - data['rate']) > data['threshold']:
            send_notification(currency, rate)
            
        # Обновляем информацию о курсе валюты
        data['rate'] = rate
        
        # Добавляем курсы в список для создания графиков
        data.setdefault('rates_history', []).append(rate)
        
        # Создаем график, если есть достаточно данных
        if len(data['rates_history']) >= 10:
            create_graph(currency, data['rates_history'])
            
    # Ждем 1 минуту, чтобы не перегружать сервер Центробанка
    time.sleep(60)
В этом примере мы создаем словарь currencies с информацией о каждой валюте и ее пороговых значениях изменения курса + добавляем историю курсов каждой валюты в список rates_history. В конце мы создаем функцию create_graph() для создания графика курсов каждой валюты в течение нужного нам периода времени.

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

Основы языка Python: переменные, условия, циклы, функции:
Работа с библиотеками requests и beautiful soup:
Использование API для получения данных о курсах валют:
  • Пост «Python и API: превосходное комбо для автоматизации работы с публичными данными»
Создание графиков и диаграмм с помощью библиотеки matplotlib:
  • Статья «Визуализация данных с matplotlib»
Отправка уведомлений через Telegram Bot API:
Happy Coding!
16 Комментариев
  • Sergio Fedosoni
    13 апреля 2023, 00:26
    Интересная идея а какой только курс вы будете с выдач Гугла анализировать?? Биржу, ЦБ или наличный???

    Ну и зачем так сложно если они всё онлайн транслируются
  • Replikant_mih
    13 апреля 2023, 09:25
    Любопытно, сколько времени ушло на написание. Любопытно, за сколько можно было бы это написать при использовании Github Copilot и Chat-GPT 4.
  • Игорь
    13 апреля 2023, 10:21
    Спасибо огромное, как раз питончик изучаю, пишите еще статьи очень интересно!
  • JZX
    16 апреля 2023, 19:23

    C:\Users\User\PycharmProjects\pythonProject_1SmartLab\venv\Scripts\python.exe C:\Users\User\PycharmProjects\pythonProject_1SmartLab\main.py
    Traceback (most recent call last):
    File «C:\Users\User\PycharmProjects\pythonProject_1SmartLab\main.py», line 27, in <module>
    current_rate = get_currency_rate()
    ^^^^^^^^^^^^^^^^^^^
    File «C:\Users\User\PycharmProjects\pythonProject_1SmartLab\main.py», line 21, in get_currency_rate
    return float(result.replace(",", "."))
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    ValueError: could not convert string to float: '81.55 Российский рубль'

    Process finished with exit code 1

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн