CoderCastrov logo
CoderCastrov
Парсер

Как легко получить десятки тысяч данных о криптовалюте с помощью Python

Как легко получить десятки тысяч данных о криптовалюте с помощью Python
просмотров
9 мин чтение
#Парсер

Введение

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

В этом случае мы будем получать данные с веб-сайта CoinGecko, используя язык программирования Python и библиотеки BeautifulSoup и Selenium.

Парсинг веб-сайта

Есть несколько шагов в парсинге данных.

  • Понимание поведения веб-сайта, который будет парситься

Посетите сайт, который мы будем парсить,

https://www.coingecko.com/en/all-cryptocurrency.

На веб-странице нам нужно прокрутить вниз и затем нажать кнопку "Показать больше", чтобы загрузить больше данных. Как показано ниже

Получение HTML-данных

Мы получим HTML-данные с веб-сайта CoinGecko, а затем сохраним их в локальный файл, который будет разобран с помощью Python с использованием библиотеки BeautifulSoup.

Извлечение данных

Разберите ранее записанные данные, а затем сохраните извлеченные данные в JSON-, CSV- или Excel-файл для удобного чтения обычным человеком с помощью библиотеки Pandas.


Примечания: Чтобы следовать этим шагам, вам следует иметь базовое понимание Python, чтобы не запутаться при чтении и написании кода.

Пошаговое руководство по парсингу веб-сайтов

Прежде всего, нам понадобится редактор кода для написания кода на Python. Мы будем использовать Visual Studio Code, который можно скачать здесь. Выберите в соответствии с вашей операционной системой, а затем установите его.

Затем нам также нужно скачать и установить Python здесь.

Если все готово, приступим к процессу парсинга

Создайте папку где угодно. Здесь я создаю папку на рабочем столе

Откройте Visual Studio Code, затем откройте ранее созданную папку

Каждый раз, когда вы создаете проект, вы должны использовать виртуальное окружение. Используя виртуальное окружение, вы можете более эффективно управлять своим проектом на Python и минимизировать возможные конфликты и проблемы зависимостей. Мы будем использовать библиотеку virtualenv для создания виртуального окружения.

Откройте терминал, нажав клавиши "ctrl/cmd" + ""`, или вы можете перейти в меню терминала сверху и нажать "новый терминал".

Затем введите следующую команду

pip install virtualenv

Если virtualenv установлен, то мы создадим виртуальное окружение с именем "venv" или вы можете назвать его как угодно, введя следующую команду.

virtualenv venv

Войдите в созданное виртуальное окружение, введя следующую команду

source venv/Scripts/activate

если вход выполнен, то появится надпись venv вот так

Нам нужно установить некоторые необходимые библиотеки, а именно beautifulsoup4, httpx, selenium, pandas и openpyxl.

pip install beautifulsoup4 httpx selenium pandas openpyxl

Создайте файл в Visual Studio Code с именем coincko.py или назовите его как вам нравится.

Откройте ранее созданный файл, затем импортируйте установленные библиотеки.

from httpx import Client
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By
import pandas as pd

Посетите веб-сайт CoinGecko по адресу https://www.coingecko.com/en/all-cryptocurrencies, затем щелкните правой кнопкой мыши и выберите "инспектировать элемент". Нажмите на вкладку "network", если ничего нет или пусто, просто обновите страницу, затем прокрутите вверх и выберите "all-cryptocurrencies", который обычно находится вверху.

Нажмите на вкладку "header", затем обратите внимание на то, что нужно для этого процесса парсинга. Конечно, нам нужны url запроса и user agent, которые мы можем получить через заголовки.

Создайте класс CoinGeckoSpider и его конструктор. Создайте переменную для хранения функции Client из библиотеки httpx и скопируйте и вставьте URL и User Agent, которые были найдены ранее, вот так.

class CoinGeckoSpider(object):
    def __init__(self) -> None:
        self.client = Client()
        self.base_url = 'https://www.coingecko.com/en/all-cryptocurrencies'
        self.user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36'
        self.headers = {'User-Agent': self.user_agent}

Мы уже знаем, что веб-сайт, который мы парсим, требует прокрутки вниз, а затем нажатия кнопки "Показать еще", чтобы загрузить больше данных, поэтому нам нужна автоматизация для этого с использованием Selenium.

Для запуска selenium нам нужен chromedriver в качестве браузера. мы должны сначала его скачать здесь. Подстройте его под используемую вами операционную систему и версию Chrome. Затем поместите скачанный chromedriver в ту же папку.

Создайте класс get_pages для сохранения html данных в файл

def get_pages(self):
        self.driver = webdriver.Chrome()
        self.driver.maximize_window()
        self.driver.get(self.base_url)

Переменная используется для открытия максимизированного браузера Chrome, затем будет доступен url переменной "self.base_url" в конструкторе.

Нам нужно автоматически прокрутить вниз, а затем автоматически нажать кнопку "Показать еще". Ниже приведен код.

previous_height = self.driver.execute_script('return document.body.scrollHeight')

while True:
    time.sleep(5)
    self.driver.execute_script('window.scrollTo(0, document.body.scrollHeight);')
    try:
        load_more = self.driver.find_element(By.LINK_TEXT, 'Show More')
        load_more.click()
        time.sleep(5)
    except NoSuchElementException:
        break

    new_height = self.driver.execute_script('return document.body.scrollHeight')

    if new_height == previous_height:
        break

    previous_height = new_height

В приведенном коде мы автоматически прокручиваем вниз, а затем нажимаем на объект с надписью "Show More". Если возникает ошибка, добавьте "import time" в верхней части кода.

Сохраните html данные в переменной content.

content = self.driver.page_source

Сохраните его в файл с именем response.html.

with open('response.html', 'wb' if isinstance(content, bytes) else 'w', encoding='UTF-8') as f:
    f.write(content)

Создайте функцию get_coins для получения данных о криптовалюте. Затем напишите код для чтения ранее созданного html файла.

def get_coins(self):
    with open('response.html', 'r', encoding='UTF-8') as f:
        response = f.read()

Создайте переменную soup, которая содержит BeautifulSoup для разбора html.

soup = BeautifulSoup(response, 'html.parser')

Чтобы начать получать данные, нам нужно знать, где находятся данные. Например, в этом случае мы получим данные о криптовалюте. После проверки элементов данные находятся в таблице, поэтому мы получим данные из таблицы.

Смотря на таблицу из инспектора элементов, мы можем узнать, что у тега table есть только атрибут "data-target", поэтому мы будем использовать его при выборе объектов с помощью BeautifulSoup.

table = soup.find('tbody', attrs={'data-target': 'all-coins.tablebody'})

Создайте переменную для хранения полученных данных.

coins = []

Затем мы изучаем местоположение данных в таблице.

Мы видим, что тег "tr" таблицы - это место, где находятся данные. Затем мы выбираем каждый тег "tr" в таблице.

if table:
    rows = table.find_all('tr')

Согласно коду, если таблица присутствует, все теги "tr" в таблице должны быть выбраны и сохранены в переменной "rows".

Мы начнем получать название криптовалюты. Нам нужно отслеживать, в каком html теге находится название. Чтобы упростить это, просто поместите курсор на название, затем щелкните правой кнопкой мыши и выберите "инспектировать элемент".

Когда местоположение названия определено, мы видим, что оно находится в теге "span". Давайте получим следующую информацию о названии. Но прежде, чем мы это сделаем, нам нужно выполнить цикл с использованием "for" для переменной "rows", чтобы его можно было обработать.

for item in row:
    try:
        name = item.find('span', attrs={'class': 'tw-text-blue-500 tw-font-bold lg:tw-block tw-hidden'}).text
    except:
        name = '-'

Из кода мы выполняем цикл по переменной "rows", затем пытаемся получить данные названия, находящиеся в теге "span" с атрибутом "class" вот так. Если не найдено, то устанавливаем название на "-"

Повторите этот процесс для каждого дополнительного данных таблицы, включая символы, цены, цены за 1 час, цены за 24 часа и так далее. Используйте "try" и "except" для обработки случая, когда данные, которые мы парсим, являются пустыми или отсутствуют. Этот код получит дополнительные данные.

try:
    symbol = item.find('span', attrs={'class': 'tw-hidden d-lg-inline font-normal text-3xs mt-1'}).text
except:
    symbol = '-'

try:
    price = item.find('span', attrs={'data-target': 'price.price'}).text
except:
    price = '-'

try:
    price_1h = item.find('td', attrs={'class': 'td-change1h'}).span.text
except:
    price_1h = '-'

try:
    price_24h = item.find('td', attrs={'class': 'td-change24h'}).span.text
except:
    price_24h = '-'

try:
    price_7d = item.find('td', attrs={'class': 'td-change7d'}).span.text
except:
    price_7d = '-'

try:
    price_30d = item.find('td', attrs={'class': 'td-change30d'}).span.text
except:
    price_30d = '-'

try:
    total_volume_24h = item.find('td', attrs={'class': 'td-total_volume'}).span.text
except:
    total_volume_24h = '-'

try:
    circulating_supply = item.find('td', attrs={'class': 'td-circulating_supply'}).div.text
except:
    circulating_supply = '-'

try:
    total_supply = item.find('td', attrs={'class': 'td-total_supply'}).div.text
except:
    total_supply = '-'

try:
    market_cap = item.find('td', attrs={'class': 'td-market_cap'}).span.text
except:
    market_cap = '-'

Если есть атрибут "data-target", предпочтительнее выбирать его, а не класс, потому что атрибут "data-target" обычно имеет значение одного, в отличие от класса, который часто имеет несколько значений, и несколько тегов часто используют одно и то же значение класса, что делает более вероятным получение нежелательных данных. Например, при получении данных о цене в коде выше.

Однако, если случай имеет такое же значение атрибута класса и data-target, как и другие данные, то мы смотрим на родительский тег. Данные находятся в теге span внутри td, когда мы хотим получить price_1h. Однако тег span выбирает такой же класс и data-target, как и другие данные. Поэтому мы смотрим на атрибут td тега, который оказывается разным для каждых данных. Оказывается, что для каждых данных есть разные значения атрибутов, поэтому мы будем использовать td для получения данных.

Такой тип случая возникает при получении данных 1h price, 24h price, 7d price, 30d price, 24h volume, circulating supply, total supply и market cap. Вы можете посмотреть на инспектор элементов и код получения данных выше, чтобы найти разницу.

После завершения получения данных, мы вводим все данные в переменную, которую мы назвали data, затем вводим ее в ранее созданную переменную coins.

data = {
    'Name': name,
    'Symbol': symbol,
    'Price': price,
    '1h price': price_1h,
    '24h price': price_24h,
    '7d price': price_7d,
    '30d price': price_30d,
    'Total volume 24h': total_volume_24h,
    'Circulating supply': circulating_supply,
    'Total supply': total_supply,
    'Market cap': market_cap
}
    
coins.append(data)

Создайте файлы CSV и Excel из переменной coins, содержащей все полученные данные с использованием библиотеки pandas.

df = pd.DataFrame(coins)
df.to_csv('coins.csv', index=False)
df.to_excel('coins.xlsx', index=False)

Все готово. Давайте создадим функцию для запуска всего кода. Разместите его внизу вне класса CoinGeckoSpider.

if __name__ == '__main__':
    spider = CoinGeckoSpider()
    spider.get_pages()
    spider.get_coins()

Запустим файл.

Откройте терминал и введите следующую команду.

python coingecko.py

Дождитесь завершения процесса. Этот процесс может занять некоторое время из-за объема данных, которые мы пытаемся получить.

И... вот оно. Результаты парсинга, которые мы создали в CSV и Excel.

Давайте посмотрим на результаты. Откройте coins.xlsx с помощью Microsoft Excel или аналогичной программы для удобного чтения.

Мы видим, что мы успешно получили 10186 данных.


Вот как получить данные о десятках тысяч криптовалютных данных с веб-сайта CoinGecko с использованием Python и библиотек Selenium, BeautifulSoup, Pandas и Openpyxl, а затем представить их в CSV и Excel. Надеюсь, что этот статья поможет тем, кто хочет изучить парсинг данных.