Создание трекера цен на криптовалюты с помощью Python

Комментарии: 0

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

Мы рассмотрим, как с помощью Python периодически скрапить актуальные цены на 150 ведущих криптовалют. Для нашего трекера цен на криптовалюты мы будем скрапить такие данные:

  • Название монеты;
  • Тикер;
  • Цена;
  • Изменение цены за 24 часа в процентах.

Шаг 1: Импорт библиотек

Первый шаг — импорт необходимых библиотек. Мы будем использовать requests для отправки запросов и BeautifulSoup из библиотеки bs4 для извлечения данных из HTML.

import requests
from bs4 import BeautifulSoup
import csv
import time
import random

Также используем библиотеку csv для работы с CSV-файлами, а time и random для управления частотой обновлений цен и ротацией прокси соответственно.

Шаг 2: Настройка прокси

При отправке запросов без использования приватных прокси могут возникать ошибки типа “Доступ запрещен”. Пример настройки прокси:

proxy = {
 "http": "http://Your_proxy_IP_Address:Your_proxy_port",
}
html = requests.get(url, proxies=proxy)

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

proxy = {
 "http": "http://username:password@Your_proxy_IP_Address:Your_proxy_port",
}
html = requests.get(url, proxies=proxy)

“Your_proxy_IP_Address”, “Your_proxy_port”, “username” и “password” нужно изменить на фактические данные прокси.

Шаг 3: Настройка ротации прокси

Ротация прокси — важная техника для успешного скрапинга веб-сайтов, которые могут блокировать или ограничивать доступ, если обнаружат множество запросов с одного IP-адреса. Для настройки ротации прокси сначала используется библиотека random.

Создайте список прокси для ротации:

# Список прокси
proxies = [ 
 "username:password@Your_proxy_IP_Address:Your_proxy_port1",
 "username:password@Your_proxy_IP_Address:Your_proxy_port2",
 "username:password@Your_proxy_IP_Address:Your_proxy_port3",
 "username:password@Your_proxy_IP_Address:Your_proxy_port4",
 "username:password@Your_proxy_IP_Address:Your_proxy_port5",
]

Затем определите функцию get_proxy(), которая случайным образом выбирает прокси из списка для каждого запроса:

# Метод для ротации ваших прокси 
def get_proxy(): 
  # Выбираем случайный прокси из списка
  proxy = random.choice(proxies) 
  return {
            "http": f'http://{proxy}',
            "https": f'http://{proxy}'
    }

Эта функция возвращает словарь с выбранным прокси для HTTP и HTTPS-протоколов. Такая настройка позволяет выполнять запросы с нескольких IP-адресов, которые определяются сайтом как разные пользователи, что повышает шансы обойти анти-скрапинговые системы обнаружения.

Шаг 4: Получение и анализ данных о криптовалютах

Функция get_crypto_prices() будет скрапить цены на криптовалюты с выбранного сайта. Она отправляет GET-запрос на веб-сайт с использованием функции requests.get(), передавая в качестве аргумента ротируемые прокси. Затем текст ответа передается в конструктор BeautifulSoup с парсером “html.parser”.

def get_crypto_prices():
    url = "https://crypto.com/price"
    html = requests.get(url, proxies=get_proxy())
    soup = BeautifulSoup(html.text, "html.parser")

Шаг 5: Изучение структуры сайта

Перед тем как приступить к извлечению данных, важно тщательно изучить структуру сайта. Используйте инструменты разработчика браузера для осмотра HTML-кода страницы. Для доступа к инструментам разработчика щелкните правой кнопкой мыши по веб-странице и выберите “Просмотреть код элемента”.

1.png

Затем найдите все контейнеры с ценами на странице, применяя функцию find_all() из библиотеки BeautifulSoup с CSS-селектором "tr" и классом 'css-1cxc880'. Для каждого такого контейнера извлекаем название монеты, тикер, цену и 24-часовое изменение в процентах. Полученные данные сохраняем в словаре, который затем добавляется в список цен.

2.png

Извлечение названия монеты

Здесь мы используем row.find('p', class_='css-rkws3') для поиска элемента ‘p’ с классом “css-rkws3”. Затем мы извлекаем текст и сохраняем его в переменной “name”.

3.png

coin_name_tag = row.find('p', class_='css-rkws3')
name = coin_name_tag.get_text() if coin_name_tag else "no name entry"

Извлечение тикера

Аналогично, мы используем row.find("span", class_="css-1jj7b1a") для поиска элемента span с классом "css-1jj7b1a". Метод get_text() извлекает текстовое содержимое, предоставляя нам тикер.

4.png

coin_ticker_tag = row.find('span', class_='css-1jj7b1a')
ticker = coin_ticker_tag.get_text() if coin_ticker_tag else "no ticker entry"

Извлечение цены

Находим элемент “div” с классом “css-b1ilzc”. Текстовое содержимое затем очищается от лишних пробелов и присваивается переменной price. Мы используем условное выражение для обработки случаев, когда элемент может отсутствовать.

5.png

coin_price_tag = row.find('div', class_='css-b1ilzc')
price = coin_price_tag.text.strip() if coin_price_tag else "no price entry"

Извлечение процентного изменения

Аналогично, мы находим элемент “p” с классом “css-yyku61” для извлечения процентного изменения. Текстовое содержимое очищается, и условное выражение обрабатывает потенциальное отсутствие.

6.png

coin_percentage_tag = row.find('p', class_='css-yyku61')
percentage = coin_percentage_tag.text.strip() if coin_percentage_tag else "no percentage entry"

Собирая все вместе, имеем цикл for, который выглядит так:

for row in price_rows:
        coin_name_tag = row.find('p', class_='css-rkws3')
        name = coin_name_tag.get_text() if coin_name_tag else "no name entry"

        coin_ticker_tag = row.find('span', class_='css-1jj7b1a')
        ticker = coin_ticker_tag.get_text() if coin_ticker_tag else "no ticker entry"
        
        coin_price_tag = row.find('div', class_='css-b1ilzc')
        price = coin_price_tag.text.strip() if coin_price_tag else "no price entry"

        coin_percentage_tag = row.find('p', class_='css-yyku61')
        percentage = coin_percentage_tag.text.strip() if coin_percentage_tag else "no percentage entry"
        
        prices.append({
            "Coin": name,
            "Ticker": ticker,
            "Price": price,
            "24hr-Percentage": percentage
        })
    
    return prices

Шаг 6: Экспорт данных в CSV

Функция export_to_csv() создана для экспорта извлеченных данных в файл CSV. Используем библиотеку CSV для записи данных из списка prices в указанный CSV-файл:

 def export_to_csv(prices, filename="proxy_crypto_prices.csv"):
       with open(filename, "w", newline="") as file:
           fieldnames = ["Coin", "Ticker", "Price", "24hr-Percentage"]
           writer = csv.DictWriter(file, fieldnames=fieldnames)
           writer.writeheader()
           writer.writerows(prices)

Шаг 7: Запуск трекера

В основной части нашего скрипта мы вызываем функцию get_crypto_prices() для скрапинга цен и export_to_csv() для их экспорта в файл CSV. Затем устанавливаем паузу в 5 минут (300 секунд) перед следующим обновлением цен. Это делается в бесконечном цикле, чтобы цены обновлялись каждые 5 минут до тех пор, пока программа не будет остановлена:

if __name__ == "__main__":
       while True:
           prices = get_crypto_prices()
           export_to_csv(prices)
           print("Prices updated. Waiting for the next update...")
           time.sleep(300)  # Обновление цен каждые 5 минут

Финальный код

Представленный код объединяет все ранее рассмотренные техники и шаги, обеспечивая комплексный подход к созданию трекера цен на криптовалюты.

import requests
from bs4 import BeautifulSoup
import csv
import time
import random

# Список прокси
proxies = [
     "username:password@Your_proxy_IP_Address:Your_proxy_port1",
     "username:password@Your_proxy_IP_Address:Your_proxy_port2",
     "username:password@Your_proxy_IP_Address:Your_proxy_port3",
     "username:password@Your_proxy_IP_Address:Your_proxy_port4",
     "username:password@Your_proxy_IP_Address:Your_proxy_port5",
]

# Пользовательский метод для ротации прокси

def get_proxy():
    # Выбираем случайный прокси из списка
    proxy = random.choice(proxies)
   # Возвращаем словарь с прокси для http протокола
    return {"http": f'http://{proxy}',
            "https": f'http://{proxy}'
          }


def get_crypto_prices():
    url = "https://crypto.com/price"
    html = requests.get(url, proxies=get_proxy())
    print(html.status_code)
    soup = BeautifulSoup(html.content, "html.parser")

    price_rows = soup.find_all('tr', class_='css-1cxc880')

    prices = []
    for row in price_rows:
        coin_name_tag = row.find('p', class_='css-rkws3')
        name = coin_name_tag.get_text() if coin_name_tag else "no name entry"

        coin_ticker_tag = row.find('span', class_='css-1jj7b1a')
        ticker = coin_ticker_tag.get_text() if coin_ticker_tag else "no ticker entry"
        
        coin_price_tag = row.find('div', class_='css-b1ilzc')
        price = coin_price_tag.text.strip() if coin_price_tag else "no price entry"

        coin_percentage_tag = row.find('p', class_='css-yyku61')
        percentage = coin_percentage_tag.text.strip() if coin_percentage_tag else "no percentage entry"
        
        prices.append({
            "Coin": name,
            "Ticker": ticker,
            "Price": price,
            "24hr-Percentage": percentage
        })
    
    return prices



def export_to_csv(prices, filename="proxy_crypto_prices.csv"):
    with open(filename, "w", newline="") as file:
        fieldnames = ["Coin", "Ticker", "Price", "24hr-Percentage"]
        writer = csv.DictWriter(file, fieldnames=fieldnames)

        writer.writeheader()
        writer.writerows(prices)


if __name__ == "__main__":
    while True:
        prices = get_crypto_prices()
        export_to_csv(prices)
        print("Prices updated. Waiting for the next update...")
        time.sleep(300)  # Обновление цен каждые 5 минут (настраивается по необходимости)

Финальный результат

Результаты нашего трекера цен на криптовалюты сохраняются в файл CSV под названием “proxy_crypto_prices.csv”, как показано ниже.

7.jpg

Благодаря простому синтаксису, Python является оптимальным инструментом для создания автоматизированного трекера цен на криптовалюты. Этот язык программирования позволяет легко добавлять новые функции и расширять возможности трекера. Рассмотренный пример позволяет создать базовый скрапер, который способен обрабатывать автоматическое обновление данных о курсах криптовалют через заданные интервалы времени, собирать данные через прокси и сохранять их в удобном формате.

Комментарии:

0 комментариев