CoderCastrov logo
CoderCastrov
Наука о данных

Парсинг веб-страниц 'NFTs' с использованием Selenium

Парсинг веб-страниц 'NFTs' с использованием Selenium
просмотров
6 мин чтение
#Наука о данных

Data Science

Подробное руководство для каждого энтузиаста криптовалюты!

NFT сейчас находятся на пике популярности, и я, будучи энтузиастом криптовалюты, решил присоединиться к этой моде. Давление со стороны коллег заставляет вас делать вещи!! Изначально я решил спарсить opensea.io, но они не позволяют это сделать, они позволили бы, если бы я использовал API, но использование API не было частью моего курса (пока). Поэтому, вместо того, чтобы иметь круто звучащее название для моего проекта вроде “So-Much-2-C-@-OpenSea”, нам придется работать с скучным рабочим названием вроде “Парсинг веб-страниц NFT с использованием Selenium”.

Давайте начнем, хорошо? Прежде всего, что такое NFT?

Мир работает по принципу спроса и предложения, а NFT в основном создает «цифровую дефицитность». NFT - это цифровой актив, который представляет объекты реального мира, такие как искусство, музыка, предметы в играх и видео. Подумайте о том, что богатый бизнесмен покупает картину Раджа Рави Вармы за 30 миллионов долларов и объявляет ее офисной мебелью, чтобы получить налоговое льготное списание. Вы понимаете, куда я клоню? Мы прекратим говорить о NFT сейчас, так как этот статья не является критикой NFT, это больше о моем путешествии в область науки о данных.

Теперь, когда мы знаем, что такое NFT, давайте перейдем к другому аспекту этого проекта, что такое веб-парсинг? Предположим, вам нужна информация с веб-сайта? Допустим, параграф о Дональде Трампе! Что вы делаете? Что ж, вы можете скопировать и вставить информацию с Википедии в свой собственный файл. Но что, если вы хотите получить большие объемы информации с веб-сайта как можно быстрее? Например, большие объемы данных с веб-сайта для обучения алгоритма машинного обучения? В такой ситуации копирование и вставка не сработает! И вот тогда вам понадобится веб-парсинг. В отличие от долгого и утомительного процесса ручного получения данных, веб-парсинг использует методы интеллектуальной автоматизации для получения тысяч или даже миллионов наборов данных за меньшее количество времени.

Теперь, когда мы избавились от жаргона, давайте познакомимся с еще большим количеством жаргона. Библиотека, которую мы собираемся использовать, называется Selenium, которая помогает нам парсить, то есть автоматизировать извлечение данных с динамического веб-сайта. Поскольку я пишу эту статью с мамой в качестве целевого читателя, я расскажу вам о типах веб-сайтов: СТАТИЧЕСКИЕ и ДИНАМИЧЕСКИЕ. Статический веб-сайт или статическая веб-страница содержит информацию, которая не меняется автоматически. Она остается такой же, или статичной, для каждого пользователя сайта. Динамический веб-сайт или динамическая веб-страница содержит информацию, которая изменяется в зависимости от пользователя, времени суток, часового пояса, родного языка пользователя и других факторов.

Если вам нужен только код, вот ссылка на репозиторий Github repository.


Давайте сначала посмотрим на импорты, которые нам нужно сделать:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
import time
import pandas as pd
import smtplib
import os

Как уже упоминалось, opensea не позволяет парсить веб-страницы, и обход этой проблемы не является частью поставленной задачи, поэтому мы нашли новый веб-сайт с названием

[https://www.flips.finance/](https://www.flips.finance/)

который делает то же самое, хотя и не с таким красивым интерфейсом, несмотря на то, что интерфейс opensea менее глючный.

Снимок экрана главной страницы flip.finace, который дает нам информацию о лучших NFT дня и недели.

Цель этого проекта по парсингу веб-страниц - получить всю информацию, видимую на изображении, плюс мы хотим получить доступ к каждой коллекции NFT и извлечь дополнительную информацию, такую ​​как ссылки на их дискорд, opensea и looks-rare и другие.

def get_driver():
    chrome_options = Options()
    chrome_options.add_argument(‘ — no-sandbox’)
    chrome_options.add_argument(‘ — headless’)
    chrome_options.add_argument(‘ — disable-dev-shm-usage’)
    driver = webdriver.Chrome(options=chrome_options)
    return driver

driver = get_driver()

Важно отметить в приведенном выше блоке кода, что driver=get_driver() теперь был превращен в «глобальную функцию», что означает, что ее не нужно вызывать снова во всем остальном коде.


Следующим шагом мы создаем список со всеми названиями коллекций NFT, присутствующих на странице, для этого мы определяем функцию «get_nft_title»

def get_nft_title():
    nft_div_tag=’Rankings_tableRowLink__2wVPO’
    driver.get(flip_url)
    time.sleep(5)
    nft=driver.find_elements(By.CLASS_NAME,nft_div_tag)
    nft_title=[]
    for i in nft:
        nft_title.append(i.text)
    return nft_title

здесь мы используем div_tag, присутствующий в html-коде, и затем извлекаем элементы, обладающие классом «Rankings_tableRowLink__2wVPO», и помещаем их в цикл for. Затем мы очищаем элементы, которые мы получили в теперь не таком пустом списке, и используем функцию .text для очистки элементов и получения только названий. nft_title выглядит как на картинке ниже.

Список названий NFT, полученных с помощью вышеуказанной функции.

Не вдаваясь в подробности о том, как получить другую информацию, такую ​​как «Title», «Volume», «Sales», «Floor Price», «24 hr Change», «Total Owners», «Change Owners», «% Supply Listed» и «24 hr Listing Change». Для вызова всей этой информации написана отдельная функция, которая предоставлена по ссылке.

Наконец, мы создаем объединяющую функцию, которая содержит все различные функции. Мы назовем эту функцию scrape_nft(), которая создаст словарь со всей спарсенной информацией.

def scrape_nft():
    nft_url = ‘https://www.flips.finance/'
    driver = get_driver()
    nft_dict = {
        ‘Title’: get_nft_title(),
        ‘Volume’: get_nft_vol(),
        ‘Sales’: get_nft_sales(),
        ‘Floor Price’: nft_floor_price(),
        ’24 hr Change’: get_nft_change(),
        ‘Total Ownsers’: get_nft_owners(),
        ‘Change Owners’: get_nft_owners_change(),
        ‘% Supply Listed’: nft_supply_listed(),
        ’24 hr Listing Change’: get_nft_listings(),
    }
    return pd.DataFrame(nft_dict)

Эту информацию можно далее преобразовать в объект pandas dataframe, который выглядит немного как на картинке ниже.

Объект pandas dataframe, содержащий 193 строки и 7 столбцов.

Новичок, подумал я про себя, этого должно быть достаточно, я собрал так много информации о 193 разных NFT, но меня ожидало неприятное пробуждение. Теперь мне нужно было перейти к каждой из этих коллекций и получить дополнительную информацию из нее. Эта гора, которую мне предстояло преодолеть, привела меня к очень интересной части selenium. Нет, это не x-path. Я не буду говорить о x-path, это уже было сделано множеством учебников в Интернете (именно там я научился этому, с большой помощью сообщества Jovian), а встроенной функции click() в selenium.

Теперь это было немного сложнее, потому что после парсинга ссылок из первой коллекции мне нужно было заставить программу вернуться на главную страницу...подождать, пока она загрузится...затем перейти на вторую страницу....подождать, пока она загрузится, спарсить информацию (ссылки на opensea, looksrare, discord и т. д.) и затем снова вернуться на главную страницу... Утомительно, я знаю! Поэтому для этого мы использовали класс объектов действий и использовали встроенную функцию sleep в selenium, которая заставляет программу ждать обновления страницы перед выполнением функции. Довольно удобно, по мнению автора, но все равно очень затратно по времени. Небольшой отрывок кода предоставлен ниже.

def get_other_links():
    final_list=[]
    for i in range(10):
        wd.get('https://www.flips.finance/')
        time.sleep(3)
        y=wd.find_elements(By.CLASS_NAME,'Rankings_tableRowLink__2wVPO')
        #print(y)#print(y[i])
        x=y[i]
        x.click()
        time.sleep(3)
        z=wd.find_elements(By.CLASS_NAME,'cstats_l__6AaiS')
        nft_links = []
        for j in z:
            p=j.get_attribute('href')
            nft_links.append(p)
        final_list.append(nft_links)
    return final_list

Результат выполнения вышеуказанного блока кода дает нам следующее.

Код и результаты парсинга страниц с использованием функций 'sleep' и 'click' в Selenium.

Теперь осталось только разобрать эту информацию в созданный нами pandas dataframe, а затем преобразовать всю эту спарсенную информацию в CSV-файл.

И это совсем не сложно, мы сделали это с помощью следующего блока кода.

nft_csv_data = df.to_csv(‘NFT.csv’, index = False)
print(‘\nCSV String:\n’, nft_csv_data)

Далее мы хотим отправить себе этот набор данных с помощью python. Этот код не будет работать на Google Collab, однако этот код работает отлично на Replit, Код Replit предоставлен ниже.

def send_email():
 
 try:
 server_ssl = smtplib.SMTP_SSL(‘smtp.gmail.com’, 465)
 server_ssl.ehlo()sender_email = ‘[sendtrends7@gmail.com](mailto:sendtrends7@gmail.com)’
 receiver_email = ‘[sendtrends7@gmail.com](mailto:sendtrends7@gmail.com)’ 
 my_secret = os.environ[‘gmail_pass’]
 print(‘Password:’, my_secret)
 subject = ‘OMG Test Message from Replit’
 body = ‘Hey, this is a test email sent via replit using python’
 
 email_text = f”””
 From: {sender_email}
 To: {receiver_email}
 
 Subject: {subject}
 
 {body}
 “””
 server_ssl.login(sender_email, my_secret)
 server_ssl.sendmail(sender_email, receiver_email, email_text)
 server_ssl.close()
 
 except:
 print (‘Something went wrong…’)send_email()

Что делать дальше?

Затем мы развертываем этот код на AWS, следите за обновлениями, чтобы узнать, как я это сделал.

P.S: Если вы дочитали до этого момента, пожалуйста, помните... Я делаю это за аплодисменты. Пожалуйста, аплодируйте за эту статью.


Ссылки на:


Найдите меня здесь:

Linkedln

Twitter