Selenium скачать весь HTML
Я пытался использовать селен, чтобы очистить и всю веб-страницу. Я ожидаю, что, по крайней мере, несколько из них - спа, такие как Angular, React, Vue, поэтому я использую Selenium.
Мне нужно загрузить всю страницу (если какой-то контент не загружается из-за отложенной загрузки из-за отсутствия прокрутки, это нормально). Я попытался установить задержку time.sleep(), но это не сработало. После того, как я получил страницу, я хочу ее хешировать и сохранить в БД для последующего сравнения и проверки, изменился ли контент. В настоящее время хэш каждый раз отличается, и это потому, что селен не загружает всю страницу, каждый раз, когда отсутствует другая частичная сумма. Я подтвердил это на нескольких веб-страницах, а не только на единственном.
У меня также есть, вероятно, более 1000 веб-страниц, которые нужно пройти вручную, просто получая все ссылки, поэтому у меня нет времени, чтобы найти элемент на них, чтобы убедиться, что он загружен.
Сколько времени занимает этот процесс, не важно. Если это займет 1+ часа, так и быть, скорость важна не только точность.
Если у вас есть альтернативная идея, пожалуйста, поделитесь.
Моя декларация водителя
from selenium import webdriver
from selenium.common.exceptions import WebDriverException
driverPath = '/usr/lib/chromium-browser/chromedriver'
def create_web_driver():
options = webdriver.ChromeOptions()
options.add_argument('headless')
# set the window size
options.add_argument('window-size=1200x600')
# try to initalize the driver
try:
driver = webdriver.Chrome(executable_path=driverPath, chrome_options=options)
except WebDriverException:
print("failed to start driver at path: " + driverPath)
return driver
Мой URL-адрес называется мой тайм-аут = 20
driver.get(url)
time.sleep(timeout)
content = driver.page_source
content = content.encode('utf-8')
hashed_content = hashlib.sha512(content).hexdigest()
^ здесь каждый раз получается новый хеш, так как один и тот же URL не создает одну и ту же веб-страницу
2 ответа
Поскольку тестируемое приложение (AUT) основано на Angular, React, Vue, в этом случае Selenium кажется идеальным выбором.
Теперь, как вы в порядке с тем, что some content isn't loaded from lazy loading because of not scrolling
делает возможный случай использования. Но всеми возможными способами ...do not have time to find an element on them to make sure it is loaded...
не может быть действительно компенсированным побуждением time.sleep()
как time.sleep()
имеют определенные недостатки. Вы можете найти подробное обсуждение в разделе Как перевести webdriver в Python на миллисекунды. Стоит отметить, что состояние HTML DOM будет разным для всех 1000 нечетных веб-страниц.
Решение
Пара жизнеспособных решений:
Возможное решение могло бы заключаться в том, чтобы вызвать WebDriverWait и обеспечить загрузку некоторых элементов HTML в соответствии с обсуждением. Как я могу убедиться, что некоторые элементы HTML загружены для Selenium + Python? проверка по крайней мере одного из следующих:
- Заголовок страницы
- Заголовок страницы
Другим решением было бы настроить возможность pageLoadStrategy. Вы можете установить pageLoadStrategy для всех 1000 нечетных веб-страниц в общую точку, назначив значение либо:
normal
(полная загрузка страницы)eager
(Интерактивный)none
Вы можете найти подробное обсуждение в разделе Как заставить Selenium не ждать полной загрузки страницы с медленным сценарием?
Если вы реализуете pageLoadStrategy, page_source
Метод будет запущен в той же точке отключения, и, возможно, вы увидите идентичный hashed_content.
По моему опыту time.sleep() плохо работает с динамическим временем загрузки. Если страница содержит большое количество javascript, вы должны использовать предложение WebDriverWait.
Что-то вроде этого:
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get(url)
element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "[my-attribute='my-value']")))
Измените 10 с любым таймером, который вы хотите, и By.CSS_SELECTOR и его значение с любым типом, который вы хотите использовать в качестве ссылки для lo
Вы также можете обернуть WebDriverWait вокруг оператора Try/Except с помощью TimeoutException
исключение, которое вы можете получить из субмодуля selenium.common.exceptions
в случае, если вы хотите установить жесткий лимит.
Вы, вероятно, можете установить его внутри цикла while, если действительно хотите, чтобы он проверял вечность до тех пор, пока страница не будет загружена, потому что я не смог найти в документации никаких ссылок на ожидание "навсегда", но вам придется поэкспериментировать с ним.