Делать скриншот всей страницы с Python Selen и Firefox или Chrome без головы
Этот пост связан с этим:
Снимок экрана Python Selen не получить всю страницу
Решение с PhantomsJS, кажется, работает:
driver = webdriver.PhantomJS()
driver.maximize_window()
driver.get('http://www.angelfire.com/super/badwebs/')
scheight = .1
while scheight < 9.9:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight/%s);" % scheight)
scheight += .01
driver.save_screenshot('angelfire_phantomjs.png')
Однако решение от 2014 года и PhantomJS пока что устарела. Я получаю именно это сообщение об ошибке:
...
UserWarning: Selenium support for PhantomJS has been deprecated, please use headless versions of Chrome or Firefox instead
warnings.warn('Selenium support for PhantomJS has been deprecated, please use headless '
Если я попытаюсь приспособиться, например, к Firefox без головы, вот так:
from selenium import webdriver
firefox_options = webdriver.FirefoxOptions()
firefox_options.set_headless()
firefox_driver = webdriver.Firefox(firefox_options=firefox_options)
firefox_driver.get('http://www.angelfire.com/super/badwebs/')
scheight = .1
while scheight < 9.9:
firefox_driver.execute_script("window.scrollTo(0, document.body.scrollHeight/%s);" % scheight)
scheight += .01
firefox_driver.save_screenshot('angelfire_firefox.png')
снимок экрана сделан, но не всей страницы.
Есть идеи, как заставить его работать с Firefox или Chrome без головы?
(PS Я тоже нашел этот пост:
Снимок экрана полной страницы с помощью Selenium Python (chromedriver)
но, похоже, это не общее решение, а гораздо сложнее.)
1 ответ
Это метод, который я придумал, который делает идеальный скриншот веб-сайта любой длины. Он использует тот факт, что браузер без головы может установить окно любого размера до его запуска, задача состоит в том, чтобы получить высоту прокрутки перед запуском браузера без головы. Это единственный недостаток, запустить сайт дважды.
from selenium import webdriver
from PIL import Image
from selenium.webdriver.chrome.options import Options
import time
url = 'any website url'
#run first time to get scrollHeight
driver = webdriver.Chrome()
driver.get(url)
#pause 3 second to let page load
time.sleep(3)
#get scroll Height
height = driver.execute_script("return Math.max( document.body.scrollHeight, document.body.offsetHeight, document.documentElement.clientHeight, document.documentElement.scrollHeight, document.documentElement.offsetHeight )")
print(height)
#close browser
driver.close()
#Open another headless browser with height extracted above
chrome_options = Options()
chrome_options.add_argument("--headless")
chrome_options.add_argument(f"--window-size=1920,{height}")
chrome_options.add_argument("--hide-scrollbars")
driver = webdriver.Chrome(options=chrome_options)
driver.get(url)
#pause 3 second to let page loads
time.sleep(3)
#save screenshot
driver.save_screenshot('screen_shot.png')
driver.close()