Отслеживание данных о ценах на популярные криптовалюты может быть сложным из-за их высокой волатильности. При работе с криптовалютами крайне важно проводить собственные исследования и быть готовым к использованию возможностей для получения прибыли. Скрипт Python позволит скрапить данные о ценах в автоматическом режиме и отслеживать их изменения.
Мы рассмотрим, как с помощью Python периодически скрапить актуальные цены на 150 ведущих криптовалют. Для нашего трекера цен на криптовалюты мы будем скрапить такие данные:
Первый шаг — импорт необходимых библиотек. Мы будем использовать requests для отправки запросов и BeautifulSoup из библиотеки bs4 для извлечения данных из HTML.
import requests
from bs4 import BeautifulSoup
import csv
import time
import random
Также используем библиотеку csv для работы с CSV-файлами, а time и random для управления частотой обновлений цен и ротацией прокси соответственно.
При отправке запросов без использования приватных прокси могут возникать ошибки типа “Доступ запрещен”. Пример настройки прокси:
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” нужно изменить на фактические данные прокси.
Ротация прокси — важная техника для успешного скрапинга веб-сайтов, которые могут блокировать или ограничивать доступ, если обнаружат множество запросов с одного 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-адресов, которые определяются сайтом как разные пользователи, что повышает шансы обойти анти-скрапинговые системы обнаружения.
Функция 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")
Перед тем как приступить к извлечению данных, важно тщательно изучить структуру сайта. Используйте инструменты разработчика браузера для осмотра HTML-кода страницы. Для доступа к инструментам разработчика щелкните правой кнопкой мыши по веб-странице и выберите “Просмотреть код элемента”.
Затем найдите все контейнеры с ценами на странице, применяя функцию find_all() из библиотеки BeautifulSoup с CSS-селектором "tr" и классом 'css-1cxc880'. Для каждого такого контейнера извлекаем название монеты, тикер, цену и 24-часовое изменение в процентах. Полученные данные сохраняем в словаре, который затем добавляется в список цен.
Здесь мы используем row.find('p', class_='css-rkws3') для поиска элемента ‘p’ с классом “css-rkws3”. Затем мы извлекаем текст и сохраняем его в переменной “name”.
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() извлекает текстовое содержимое, предоставляя нам тикер.
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. Мы используем условное выражение для обработки случаев, когда элемент может отсутствовать.
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” для извлечения процентного изменения. Текстовое содержимое очищается, и условное выражение обрабатывает потенциальное отсутствие.
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
Функция 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)
В основной части нашего скрипта мы вызываем функцию 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”, как показано ниже.
Благодаря простому синтаксису, Python является оптимальным инструментом для создания автоматизированного трекера цен на криптовалюты. Этот язык программирования позволяет легко добавлять новые функции и расширять возможности трекера. Рассмотренный пример позволяет создать базовый скрапер, который способен обрабатывать автоматическое обновление данных о курсах криптовалют через заданные интервалы времени, собирать данные через прокси и сохранять их в удобном формате.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.ru!
Комментарии: 0