Selenium全屏截圖,使用PIL拼接滾動截圖


Selenium默認的截圖save_screenshot只支持對當前窗口內容進行截圖,當如果你想要截取整個網頁,那么,可以明確的告訴你。
Selenium做不到。
你可以手工使用開發者工具Ctrl+Shift+P調出命令行菜單,執行Capture full screenshot命令進行截圖,如下圖圖:
Chrome開發者工具全屏截圖

也可以通過
Selenium Webdriver的 execute_cdp_cmd()來調用一下Chrome DevTools Protocal提供的方法。但是,很遺憾,沒有全屏截圖的方法。

Selenium2時,還可以使用Firefox全屏截圖。Selenium3之后,所有瀏覽器不再支持。

一種方式是使用aShot,一個jar包,這顯然是Java派的解決方案。

另外如果對樣式沒有強迫症的話,可以通過滾動頁面截取多張+PIL圖片拼接的方式實現全屏的截圖。

示例代碼:

from time import sleep
from PIL import Image
import numpy as np
from selenium import webdriver

driver = webdriver.Chrome()
driver.fullscreen_window()  # 全屏窗口
driver.get('https://www.qq.com/')
window_height = driver.get_window_size()['height']  # 窗口高度

page_height = driver.execute_script('return document.documentElement.scrollHeight')  # 頁面高度
driver.save_screenshot('qq.png')

if page_height > window_height:
    n = page_height // window_height  # 需要滾動的次數
    base_mat = np.atleast_2d(Image.open('qq.png'))  # 打開截圖並轉為二維矩陣

    for i in range(n):
        driver.execute_script(f'document.documentElement.scrollTop={window_height*(i+1)};')
        sleep(.5)
        driver.save_screenshot(f'qq_{i}.png')  # 保存截圖
        mat = np.atleast_2d(Image.open(f'qq_{i}.png'))  # 打開截圖並轉為二維矩陣
        base_mat = np.append(base_mat, mat, axis=0)  # 拼接圖片的二維矩陣
    Image.fromarray(base_mat).save('hao123.png')

driver.quit()

需要安裝PIL和numpy: pip install PIL numpy

上例中,全屏窗口以獲得最大展示范圍,通過get_window_size()獲取屏幕高度,通過執行js,獲取頁面高度。
相除后獲得滾動次數。
每次滾動后,截圖保存,然后使用Image打開轉換為二維矩陣拼接到上一個圖片的二維矩陣中。
循環完,最后再將拼接的二維矩陣輸出成圖片。

效果展示,如下圖:
selenium拼接的圖片

注意:如果是流式加載的頁面,頁面高度是不斷變長的,非固定為第一次獲取到的page_height的值,需要另外處理


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM