Проблемы с получением нужных данных при парсинге сайта
Всем здравствуйте! Мне нужно получить данные, находящиеся на этой странице: https://www.huobi.com/en-us/exchange. Из левой панели нужно получить имя каждой монетки и её цену:
Как я понял, данные каждой монеты находятся в классах с именем "vue-recycle-scroller__item-view", и получается мне всех их нужно найти и взять из них данные? Вот код, с помощью которого я это стараюсь сделать:
website = 'https://www.huobi.com/en-us/exchange'
response = requests.get(website)
if response.status_code == 200:
soup = BeautifulSoup(response.content, "html.parser")
coins = soup.find_all('div', class_='vue-recycle-scroller__item-view')
print(coins)
else:
print('some troubles with connect')
В результате выполнения программы, в консоли я получаю это:
C:\python\python.exe C:/some_way/huobi_parser.py
[]
Process finished with exit code 0
То есть моя программа не нашла ни одного класса с подобным именем? Что я делаю не так? Может нужно сначала обращаться к классам, которые располагаются выше по иерархии? Подскажите пожалуйста, в чем ошибка, заранее спасибо!
Ответы (1 шт):
У меня получилось что-то следующим образом:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager # если модуля нету, вам нужен скачанный chromedriver.exe модуль для хром (если браузер хром) (https://chromedriver.chromium.org/)
chrome_options = Options()
chrome_options.headless = True # чтобы визуально не открывать хром
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options) # если есть модуль webdriver_managet
#driver = webdriver.Chrome(service=Service(path)) # пример path - r"C:\Users\User\Desktop\chromedriver.exe"
driver.get("https://www.huobi.com/en-us/exchange")
driver.implicitly_wait(120) # время ожидания загрузки сайта (120 секунд) прежде бросить TimeoutException
print("\nPROCESSING...")
coins = []
div_elems = WebDriverWait(driver, 120).until(
EC.presence_of_all_elements_located((By.CLASS_NAME, "vue-recycle-scroller__item-view"))
)
WebDriverWait(driver, 120).until(lambda d: False not in ["---" != div.find_element(By.XPATH, "//span[@class='price']").text for div in div_elems])
div_elems = driver.find_elements(By.CLASS_NAME, "vue-recycle-scroller__item-view")
for div_elem in div_elems:
token, last_price, change = (div_elem.text).split("\n")
print(token, "|", last_price, "|", change)
coins.append((token, last_price, change))
# или можно в одну строчку если не собираешься с этим работать, а так же можешь передавать их списком []
# coins.append(((div_elem.text).split("\n")))
print("\n", "LIST:\n", coins) # После, этот списочек можешь сохранить себе и ежедневно обновлять :)
driver.close()
driver.quit()
P.S. Мне кажется вышел не плохой вариант))
ОБНОВЛЕНО: Можешь убрать строчку с ожиданием сайта на 120 секунд в принципе, поскольку WebDriverWait все равно будет ожидать расположение элементов
