Алекс Артемов
Алекс Артемов личный блог
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, 11:34
      Replikant_mih, примерно секунд 25 ) давно уже перешел на него
      • Replikant_mih
        13 апреля 2023, 11:37
        Андрей К, Ыы, ну там же нужно направлять бездушную машину, но всё равно на таких простых скриптах, думаю, прирост эффективности написания кода большой будет.
        • Андрей К
          13 апреля 2023, 11:45
          Replikant_mih, эта зараза даже умеет на asm и verilog код выдавать. Но я больше конечно там ищу теоретические ответы. Где нужно перерывать 5-6 страниц поиска сначала яндекса, потом гугла на английском. А эта бездушная херня за 10 сек строит мини курсовую работу. Знаю, что прогрессивные преподы там уже готовятся.

          Коллеги еще говорят, что есть спец нейронка, которая заточена на построение кодов, еще не проверял
          • Replikant_mih
            13 апреля 2023, 11:49
            Андрей К, Да, мощные крутые креативные способы взаимодействия с такими нейросетями ещё только придумываются-открываются. И как и везде скорее всего самое интересное это не какие-то банальные варианты в лоб.
    • Илья Нечаев
      13 апреля 2023, 11:38
      Replikant_mih, Михаил сразу вопрос как к опытному Питонисту)
      Например задача написать простого робота на Питоне (брок Сбер соотвественно квик), ну есть еще Тинек со своими прибамбасами но через него не хочется.

      Вопросы которые крутятся в голове
      1) Как получить котиру? (их же в квик транслируют)  чем пользуешься
      2) Как слать ордера

      Короче мне надо какой-то коннектор Python к Quik)
      Раньше  обычно заказывал роботов на C#, а сейчас весна охота для души что-то поковырять ))

      Жду ответа — если кто знает подскажите.
      • Replikant_mih
        13 апреля 2023, 11:43

        Илья Нечаев, У этого автора есть серия постов, там код, есть код для отправки управляющих воздействий в квик — работа с заявками, получение данных из таблиц и т.д., есть код для стриминга данных из квика. Поверх этих штук написал свои библиотеки и использую их в своих скриптах.

        smart-lab.ru/my/jatotrade_com/

        • Илья Нечаев
          13 апреля 2023, 11:55
          Replikant_mih, походу придется ковырять)) у тебя что-нибудь с ML получилось в итоге или руками все?
          • Replikant_mih
            13 апреля 2023, 11:57
            Илья Нечаев, Ну у меня алго. ML тоже есть, но те данные, которые вместе ковыряли, не участвуют в нём пока).
      • Alex Turner
        13 апреля 2023, 20:01
        Илья Нечаев, посмотрите у Чечета: github.com/cia76/QuikPy
  • Игорь
    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

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

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