利用 Python + Selenium 自動化快速截圖
Selenium 是一個可以讓瀏覽器自動化地執行任務的工具,常用于自動化測試。與bs4等結合使用,也適合爬取動態網頁數據。不過沒想到,它居然可以用于網頁截圖,而且由于可編程性,用法更具想象空間。
目前,Selenium 支持 Java、C#、Ruby 以及 Python 四種客戶端語言。如果你使用 Python,則只需要在命令行里輸入 pip install selenium 并回車,即可安裝 selenium 的 Python 版本客戶端支持。
如何截取整個網頁窗口
如果想截取整個窗口的話,可以使用 driver.save_screenshot() 。下面以編程派的網站為例,編寫一個腳本截取首頁的截圖:
from selenium import webdriver
browser = webdriver.Firefox()
url = "http://codingpy.com"
browser.set_window_size(1200, 900)
browser.get(url)
browser.save_screenshot("codingpy.png")
browser.close()
我們運行這段代碼之后,會當前目錄創建名為codingpy.png的圖片文件。我們看一下實際效果(我已對圖片進行裁剪,只保留了前面一部分)。
我們發現,第二篇文章的配圖沒有加載出來,是空白的。這是因為我在設計時要求窗口滾動到元素位置時才加載圖片。
先執行JS腳本再截圖
不過還好 Selenium 支持注入JS腳本。我們先在首頁上執行一段 JavaScript 腳本,將頁面的滾動條拖到最下方,然后再拖回頂部,最后才截圖。這樣可以解決像上面那種按需加載圖片的情況。
下面是改進后的代碼,封裝進了一個名為 `take_screenshot 的函數中:
from selenium import webdriver
import time
def take_screenshot(url, save_fn="capture.png"):
browser = webdriver.Firefox() # Get local session of firefox
browser.set_window_size(1200, 900)
browser.get(url) # Load page
browser.execute_script("""
(function () {
var y = 0;
var step = 100;
window.scroll(0, 0);
function f() {
if (y < document.body.scrollHeight) {
y += step;
window.scroll(0, y);
setTimeout(f, 100);
} else {
window.scroll(0, 0);
document.title += "scroll-done";
}
}
setTimeout(f, 1000);
})();
""")
for i in xrange(30):
if "scroll-done" in browser.title:
break
time.sleep(10)
browser.save_screenshot(save_fn)
browser.close()
if __name__ == "__main__":
take_screenshot("http://codingpy.com")
如何截取某個網頁元素
有時候我們只想截取某個網頁元素的圖片呢?比如說會動態變化的驗證碼。本來 Selenium 也提供了對元素截圖的支持,只要在選中的元素上調用其 screenshot() 方法即可。
但是在實際使用時卻遇到了 Unrecognized command 這個異常,經過一段時間檢索也沒有找到解決辦法。所以,只能曲線救國,利用 Selenium 執行JS代碼,將頁面上不需要的元素一一刪除,只保留我們希望留下的元素,然后再利用上面的窗口截屏功能。
例如,如果我們只截取編程派網站右側的二維碼,可以執行這樣一段JQuery代碼:
$('#main').siblings().remove();
$('#related__wrapper').siblings().remove();
$('.ui.sticky').siblings().remove();
$('.follow-me').siblings().remove();
$('img.ui.image').siblings().remove();
代碼執行完畢之后,就只剩下二維碼的圖片了。然后我們再截屏。不過這樣有一點不好,就是截屏圖片的下方會有大量空白內容。
結語
雖然對元素截圖出現了問題,但是 Selenium 的這個截圖功能還是非常強大的。如上所示,它可以在頁面上注入并執行一段 JavaScript 代碼,還可以模擬鼠標點擊等行為;而且可以同時運行多個實例,多個線程同時截圖。
總的來說,使用 Selenium 進行網頁截圖是個不錯的選擇。
參考資料
來自: http://www.codingpy.com/article/take-screenshot-of-web-page-using-selenium/