所以,今天就以Yahoo奇摩股市網站為例,來和大家分享如何使用Python Selenium套件的自動化截圖方法(Method),截取網頁圖表,其中的重點包含:
- 安裝Python Selenium套件
- Python Selenium套件截圖方法(Method)
- Python Selenium套件特定位置截圖
一、安裝Python Selenium套件
Python Selenium套件在[Python爬蟲教學]整合Python Selenium及BeautifulSoup實現動態網頁爬蟲文章有詳細的介紹,簡單來說就是一個瀏覽器自動化套件,使用者能夠透過撰寫腳本的方式,驅動瀏覽器執行各種操作,所以常應用於網頁自動化測試。
而安裝的方法,可以透過以下的指令來完成:
$ pip install selenium
除此之外,還需安裝瀏覽器的驅動程式,這邊筆者推薦可以利用以下指令安裝使用Webdriver-Manager套件,能夠在執行Python Selenium時,自動偵測與安裝所使用的瀏覽器驅動程式:
$ pip install webdriver-manager
二、Python Selenium套件截圖方法(Method)
安裝完成後,建立app.py檔案,引用剛剛所安裝的Python Selenium及Webdriver-Manager模組(Module),如下範例:
from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager
接著,建立Python Selenium的Chrome瀏覽器驅動物件,並且請求所要截圖的網頁網址,這邊以Yahoo奇摩股市的台積電每股盈餘圖表為例,如下範例:
from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager driver = webdriver.Chrome(ChromeDriverManager().install()) driver.get("https://tw.stock.yahoo.com/quote/2330/eps")
而要進行截圖的動作,就需要使用Python Selenium套件的get_screenshot_as_file()方法(Method),傳入自訂的檔案名稱即可,如下範例:
from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager driver = webdriver.Chrome(ChromeDriverManager().install()) driver.get("https://tw.stock.yahoo.com/quote/2330/eps") driver.get_screenshot_as_file("2330.png")
執行完成,別忘了呼叫Python Selenium套件的close()方法(Method),關閉瀏覽器,如下範例:
from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager driver = webdriver.Chrome(ChromeDriverManager().install()) driver.get("https://tw.stock.yahoo.com/quote/2330/eps") driver.get_screenshot_as_file("2330.png") driver.close()
執行結果
三、Python Selenium套件特定位置截圖
前往Yahoo奇摩股市的台積電每股盈餘圖表,並且在圖表的地方按下右鍵,選擇「檢查」,可以看到它的原始碼如下:
其中,就可以使用圖表的class(樣式類別),來定位圖表的位置,如下範例第8行:
from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager driver = webdriver.Chrome(ChromeDriverManager().install()) driver.get("https://tw.stock.yahoo.com/quote/2330/eps") charts = driver.find_element_by_class_name('chartjs-render-monitor') driver.get_screenshot_as_file("2330.png") driver.close()
而要將畫面移動到圖表的位置,就需要引用Python Selenium套件的ActionChains模組(Module),如下範例第3行:
from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.common.action_chains import ActionChains driver = webdriver.Chrome(ChromeDriverManager().install()) driver.get("https://tw.stock.yahoo.com/quote/2330/eps") charts = driver.find_element_by_class_name('chartjs-render-monitor') driver.get_screenshot_as_file("2330.png") driver.close()
接著,建立ActionChains物件,並且呼叫move_to_element()方法(Method),傳入所要移動到的元素位置,如下範例第11、12行:
from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.common.action_chains import ActionChains driver = webdriver.Chrome(ChromeDriverManager().install()) driver.get("https://tw.stock.yahoo.com/quote/2330/eps") charts = driver.find_element_by_class_name('chartjs-render-monitor') action = ActionChains(driver) action.move_to_element(charts).perform() driver.get_screenshot_as_file("2330.png") driver.close()
執行結果
成功截取了我們所需要的每股盈餘網頁圖表。而如果要截取多家公司的話,透過迴圈的方式即可完成,如下範例第6、9、10、17行:
from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.common.action_chains import ActionChains stockNos = ['2330', '2303', '2408'] driver = webdriver.Chrome(ChromeDriverManager().install()) for stockNo in stockNos: driver.get(f"https://tw.stock.yahoo.com/quote/{stockNo}/eps") charts = driver.find_element_by_class_name('chartjs-render-monitor') action = ActionChains(driver) action.move_to_element(charts).perform() driver.get_screenshot_as_file(f"{stockNo}.png") driver.close()
執行結果
四、小結
學會使用Python Selenium套件的截圖技巧後,除了可以快速的蒐集網頁畫面外,如果有在做網頁自動化測試的朋友,當測式網頁的過程中發生問題時,也可以透過截圖的方式來記錄,將會提升解決問題的時間。
希望今天分享的技巧有幫助到大家,如果有其它想學習的Python Selenium主題或是有不錯的應用實例,都歡迎在底下留言和我分享唷~
如果您喜歡我的文章,別忘了在下面訂閱本網站,以及幫我按五下Like(使用Google或Facebook帳號免費註冊),支持我創作教學文章,回饋由LikeCoin基金會出資,完全不會花到錢,感謝大家。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYqMPD_mPLEileg1IdrsIYhFSWZkYFKYmEnUqWqiqdiJv2XYnkT23CFcXoTN6HBtGCEUylgVoUIVKm6KPRPM_TjcjsSei4lGE_YmZdrWA6Ulw1fp6-o8Cn-bVwr7_FANFoC4tjTe-ak6w-atFYq-a1pipQbZvQzt4wHRNK7tywcSG0dSCnpJpqoMP5wA/s1600/Python%E7%B6%B2%E9%A0%81%E7%88%AC%E8%9F%B2%E5%85%8D%E8%B2%BB%E7%B7%9A%E4%B8%8A%E5%9F%B9%E8%A8%93.png)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-fK9Da5M7X1lSpbZVan4Eo-PunVnQv-YHw3EDahTUhZr5FayVLaCPqrW44W3_xwQQO-gAWZEwe_A-SxL_nltT__ArbFOgLYAAIsi3RzETT9GqVsfyfN9PXDs-xGTkxZSqj_W1SCxwD2UcrJLqHZSYIrLB-HIU75vSom4YoqoWFUQz_o4PbnvTQUbE6Bab/w640-h426/2.png)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg61JC7N1hyphenhyphenPpzb1hNJauunevoWrOsJxk_Upz0ywnLtIAJ2rdd1ZxChyphenhyphenFPq8GHYfywtHv2mTce5NGdwwxWFWYARhA6In0xlOzkwlRb9kM04mwgdy9Un9JgVCoLQnwV25oUcitQy2OY4TeA3gVIs067wR4StGfkldbykOeL3TfPchWfNClWKhL10ZzWaxFtf/w640-h426/3.png)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh1XFQE0AmkZHSFB0Icq3uY4_FdsIYZ9nUqllOlo9ulRu0ri-LS1OeW2ybKOO2QRg-gyUOUr_3sMLYf7S4Q5ULZpIcXsS1pAkSMPm0OwqpbnLET51WEpQ3EoY5WaEVEWyTixBkRqp2tA7SpePM_MCIY6tnyUvu917rulqbLJTEEPsEho6Q-4Tf74DFdakd/w640-h426/4.png)
作者已經移除這則留言。
回覆刪除