利用 Python + Selenium 自動化快速截圖

Earlene0026 8年前發布 | 30K 次閱讀 Selenium Python Python開發

 

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/

 本文由用戶 Earlene0026 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!