Веб-скрапинг динамического контента с Selenium и Python
Здравствуйте. В сегодняшней статье мы рассмотрим, как парсить некоторые динамические сайты при помощи
Python и библиотеки Selenium.
Многие современные сайты генерируют контент динамически или же имеют значения изменяющиеся в зависимости
от условий. Парсинг подобных сайтов с помощью библиотеки bs4 может вызвать множестов проблем. Один из подходов
заключается в том, чтобы имитировать взаимодействие пользователя на веб-сайте, прежде чем использовать bs4 для
анализа интересующих вас элементов.
Ниже приведен рабочий пример получения динамического контента с помощью Selenium. Он предназначен только для
иллюстративных целей.
from bs4 import BeautifulSoup
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium import webdriver
import lxml
import time
link = r'https://www.cryptocompare.com/'
browser = webdriver.Chrome()
browser.get(link)
try:
WebDriverWait(browser, 10).until(EC.presence_of_element_located(
(By.CLASS_NAME, "panel-body")))
crypt_elements = browser.find_element(By.CLASS_NAME, 'table-coins')
prices_html = BeautifulSoup(crypt_elements.get_attribute(
'innerHTML'), features='lxml').prettify()
# Затем вы можете разобрать price_html
# Вывод результата
print(prices_html)
# Запишем разметку в html файл
with open("coins.html","w") as f:
print(prices_html, file=f)
# Базовый try catch для проверки ошибок.
except Exception as e:
print(e)
finally:
time.sleep(2)
# закрываем браузер после всех манипуляций
browser.quit()
Здесь .get_attribute('innerHTML') используется для получения HTML выбранного элемента. Идея состоит в том,
чтобы дождаться загрузки элементов браузером, найти интересующие вас элементы, а затем разобрать их
через bs4 для получения окончательного результата.
Приведенный выше код извлекает цены один раз. Чтобы непрерывно получать цены, вы можете передать их
через рекурсивный цикл.
Таким образом, мы попытались обработать динамический контент при помощи Selenium и bs4.