Selenium скачать весь HTML - PullRequest
       31

Selenium скачать весь HTML

0 голосов
/ 08 октября 2018

Я пытался использовать селен для очистки всей веб-страницы.Я ожидаю, что, по крайней мере, несколько из них - спа, такие как 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-вызов my timeout = 20

 driver.get(url)
 time.sleep(timeout)
 content = driver.page_source

 content = content.encode('utf-8')
 hashed_content = hashlib.sha512(content).hexdigest()

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

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

В качестве тестируемого приложения (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 нечетных веб-страниц.

Решение

Пара жизнеспособных решений:

Если вы реализуете метод pageLoadStrategy , page_source будет запущен в той же точке отключения и, возможно, вы увидите идентичные hashed_content .

0 голосов
/ 08 октября 2018

По моему опыту 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, если вы действительно хотите, чтобы он проверял до тех пор, пока страница не будет загружена, потому что я не смог найти в документации никаких ссылок на ожидание «навсегда», но вам придется поэкспериментировать с ним.

...