Python+Selenium實(shí)現(xiàn)無(wú)頭瀏覽器網(wǎng)頁(yè)截圖
一、背景
最近有個(gè)需求,就是需要登錄系統(tǒng),針對(duì)系統(tǒng)的流程數(shù)據(jù),有一個(gè)工作流程圖或者說(shuō)叫審批流程圖。每個(gè)階段都有相對(duì)應(yīng)的人員審批、評(píng)論信息,以及是否通過(guò)等等。這些信息都需要進(jìn)行網(wǎng)頁(yè)截圖。
這些信息人事需要進(jìn)行歸檔和壓縮,如果是人工操作,里面的流程有將近10w+的數(shù)據(jù)條目。 這如果讓人工實(shí)現(xiàn)實(shí)在是頭大,根本無(wú)法完成這個(gè)巨大的工作量。
自然這種事情落到了我的頭上,誰(shuí)讓我們會(huì)搞程序呢,呵呵。 我采用的Python3+Selenium的方式,模擬登錄比較麻煩需要驗(yàn)證碼各種,我直接使用人事賬號(hào)的登錄cookie即可實(shí)現(xiàn)登錄,那接下來(lái)就是訪問(wèn)頁(yè)面就可以。 訪問(wèn)到對(duì)應(yīng)頁(yè)面進(jìn)行截圖保存,然后又繼續(xù)翻頁(yè),繼續(xù)截圖,以此類推。
腦海里就浮現(xiàn)了我的實(shí)現(xiàn)邏輯。說(shuō)干就干。
二、Chrome無(wú)頭瀏覽器+驅(qū)動(dòng)下載安裝
注意事項(xiàng): google-chrome-stable和chromedriver最好保持一致的版本,否則可能會(huì)出現(xiàn)兼容性報(bào)錯(cuò)的情況!!!!
1、google-chrome-stable下載安裝
#1、安裝google-chrome-stable的依賴 yum install -y atk at-spi2-atk libdrm mesa-libgbm gtk3 vulkan xdg-utils #安裝中文字體 yum install -y wqy-microhei-fonts #2、下載rpm安裝包 https://mirrors.aliyun.com/google-chrome/google-chrome/google-chrome-stable-110.0.5481.77-1.x86_64.rpm #3、安裝 rpm -ivh google-chrome-stable-110.0.5481.77-1.x86_64.rpm #4、查看版本信息 google-chrome-stable --version
顯示版本信息如下,表示google-chrome-stable安裝成功:
2、安裝chromedriver驅(qū)動(dòng)
# 下載安裝包 wget "https://registry.npmmirror.com/-/binary/chromedriver/110.0.5481.77/chromedriver_linux64.zip" # 解壓 unzip chromedriver_linux64.zip -d /usr/local/chromedriver # 設(shè)置環(huán)境變量 export CHROME_DRIVER=/usr/local/chromedriver export PATH=$PATH:$CHROME_DRIVER # 驗(yàn)證chromedriver版本是否與google-chrome-stable版本完全一致,否則會(huì)出現(xiàn)兼容性問(wèn)題 chromedriver --version
三、Python樣例代碼
1、pip3安裝依賴
pip3 install selenium pip3 install pillow
2、樣例代碼
訪問(wèn)https://qq.com 騰訊門戶網(wǎng)站,將騰訊網(wǎng)截圖保存下來(lái)。 如果是自己的業(yè)務(wù),那么傳遞cookie這些參考文檔傳遞即可。此時(shí),您就當(dāng)你的程序就是一個(gè)chorme瀏覽器,chrome瀏覽器能做的事情,你的代碼就能做。 只是平時(shí)我們使用chrome是鼠標(biāo)點(diǎn)點(diǎn)點(diǎn),換到代碼就是調(diào)用API函數(shù)即可。
from selenium.webdriver import Chrome from selenium.webdriver.chrome.options import Options import time import os.path from PIL import Image def mergeImage(output_path): images = [Image.open(os.path.join(output_path, f"screenshot_{i}.png")) for i in range(scrolls)] widths, heights = zip(*(i.size for i in images)) total_width = max(widths) total_height = sum(heights) new_image = Image.new('RGB', (total_width, total_height)) y_offset = 0 for img in images: new_image.paste(img, (0, y_offset)) y_offset += img.height final_screenshot_path = os.path.join(output_path, "final_screenshot.png") new_image.save(final_screenshot_path) print(f"Final screenshot saved to {final_screenshot_path}") if __name__ == "__main__": # 設(shè)置瀏覽器 options = Options() options.add_argument('--no-sandbox') options.add_argument('--disable-gpu') options.add_argument('--headless') # 無(wú)頭參數(shù) output_path = "./screenshots" # 啟動(dòng)瀏覽器 driver = Chrome(options=options) driver.maximize_window() try: # 訪問(wèn)頁(yè)面 url = 'https://qq.com' driver.get(url) time.sleep(1) # 設(shè)置截屏整個(gè)網(wǎng)頁(yè)的寬度以及高度 scroll_width = 2500 scroll_height = 9500 driver.set_window_size(scroll_width, scroll_height) # 獲取頁(yè)面高度 total_height = driver.execute_script("return document.body.scrollHeight") viewport_height = driver.execute_script("return window.innerHeight") scrolls = int(total_height / viewport_height) + 1 # 創(chuàng)建輸出目錄 if not os.path.exists(output_path): os.makedirs(output_path) # 滾動(dòng)并截屏 for i in range(scrolls): y_offset = i * viewport_height driver.execute_script(f"window.scrollTo(0, {y_offset});") time.sleep(1) # 等待內(nèi)容加載 screenshot_path = os.path.join(output_path, f"screenshot_{i}.png") driver.get_screenshot_as_file(screenshot_path) print(f"Saved {screenshot_path}") # 合并圖片 mergeImage(output_path) # 關(guān)閉瀏覽器 driver.close() driver.quit() except Exception as e: print(e)
3、成功保存截圖
四、總結(jié)
使用Python的原因是,Python針對(duì)爬蟲這塊包很多,也很擅長(zhǎng), 腳本簡(jiǎn)單清晰。倒是也沒必要上Go、Java之類的,Python處理這類問(wèn)題信手拈來(lái),效率高才是王道!
Selenium就是個(gè)自動(dòng)化測(cè)試框架,底層還可以切換控制Chrome、火狐等等相關(guān)瀏覽器驅(qū)動(dòng)。
以上就是Python+Selenium實(shí)現(xiàn)無(wú)頭瀏覽器網(wǎng)頁(yè)截圖的詳細(xì)內(nèi)容,更多關(guān)于Python無(wú)頭瀏覽器截圖的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Python中使用 Selenium 實(shí)現(xiàn)網(wǎng)頁(yè)截圖實(shí)例
- 使用Python保存網(wǎng)頁(yè)上的圖片或者保存頁(yè)面為截圖
- Python 實(shí)現(xiàn)網(wǎng)頁(yè)自動(dòng)截圖的示例講解
- python實(shí)現(xiàn)自動(dòng)網(wǎng)頁(yè)截圖并裁剪圖片
- Python+Selenium+phantomjs實(shí)現(xiàn)網(wǎng)頁(yè)模擬登錄和截圖功能(windows環(huán)境)
- Python使用pyppeteer模塊實(shí)現(xiàn)無(wú)頭瀏覽器自動(dòng)化
相關(guān)文章
wxpython中利用線程防止假死的實(shí)現(xiàn)方法
上午抽空學(xué)習(xí)了一下在wxpython中啟用線程的方法,將GUI和功能的執(zhí)行分開,果然程序運(yùn)行起來(lái)杠杠滴。因?yàn)槲夷莻€(gè)軟件的代碼暫時(shí)不能公開,這里專門寫個(gè)小程序,作為今天的筆記吧2014-08-08如何使用?Python為你的在線會(huì)議創(chuàng)建一個(gè)假的攝像頭
這篇文章主要介紹了使用?Python為你的在線會(huì)議創(chuàng)建一個(gè)假的攝像頭,在?Python?的幫助下,不再?gòu)?qiáng)制開啟攝像頭,將向你展示如何為你的在線會(huì)議創(chuàng)建一個(gè)假的攝像頭,需要的朋友可以參考下2022-08-08python隨機(jī)生成庫(kù)faker庫(kù)api實(shí)例詳解
今天小編就為大家分享一篇python隨機(jī)生成庫(kù)faker庫(kù)api實(shí)例詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11python實(shí)現(xiàn)數(shù)據(jù)導(dǎo)出到excel的示例--普通格式
今天小編就為大家分享一篇python實(shí)現(xiàn)數(shù)據(jù)導(dǎo)出到excel的示例--普通格式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05