Selenium基於PIL實現拼接滾動截圖
阿新 • • 發佈:2020-04-12
Selenium預設的截圖save_screenshot只支援對當前視窗內容進行截圖,當如果你想要擷取整個網頁,那麼,可以明確的告訴你。
Selenium做不到。
你可以手工使用開發者工具Ctrl+Shift+P調出命令列選單,執行Capture full screenshot命令進行截圖,如下圖圖:
也可以通過
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開啟轉換為二維矩陣拼接到上一個圖片的二維矩陣中。
迴圈完,最後再將拼接的二維矩陣輸出成圖片。
效果展示,如下圖:
注意:如果是流式載入的頁面,頁面高度是不斷變長的,非固定為第一次獲取到的page_height的值,需要另外處理
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。