Створення трекера цін на криптовалюти за допомогою 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 Коментаріїв