最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python利用Selenium實現(xiàn)全網(wǎng)頁截圖

 更新時間:2025年05月18日 08:20:48   作者:winfredzhang  
這篇文章主要為大家詳細(xì)介紹了如何使用Python,Selenium和wxPython構(gòu)建一個用戶友好的網(wǎng)頁截圖工具,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下

無論是歸檔網(wǎng)站、測試頁面設(shè)計,還是為報告記錄網(wǎng)頁內(nèi)容,一個可靠的截圖工具都能大大提升效率。本文將介紹如何使用Python、Selenium和wxPython構(gòu)建一個用戶友好的網(wǎng)頁截圖工具。該工具能在瀏覽器中顯示網(wǎng)頁,自動平滑滾動到底部以觸發(fā)懶加載內(nèi)容,并將整個網(wǎng)頁截圖保存為PNG文件。

為什么需要一個網(wǎng)頁截圖工具

現(xiàn)代網(wǎng)頁通常是動態(tài)的,會隨著用戶滾動加載內(nèi)容(即懶加載)。傳統(tǒng)的截圖方法只能捕獲可見區(qū)域,可能會遺漏動態(tài)加載的內(nèi)容。我們的工具解決了以下問題:

  • 顯示網(wǎng)頁:通過可見的瀏覽器窗口,讓用戶可以看到網(wǎng)頁加載和滾動的過程。
  • 平滑滾動:自動以平滑動畫滾動到底部,確保所有懶加載內(nèi)容都加載完成。
  • 完整截圖:捕獲整個網(wǎng)頁,包括超出視口的部分。
  • 用戶友好界面:提供圖形界面,方便輸入URL、選擇保存路徑,并顯示進(jìn)度反饋。

使用技術(shù)

Python:核心編程語言,用于編寫工具邏輯。

Selenium:瀏覽器自動化框架,用于控制Chrome瀏覽器并捕獲截圖。

wxPython:用于創(chuàng)建跨平臺的圖形用戶界面(GUI)。

ChromeDriver:Chrome的WebDriver,通過webdriver_manager自動管理。

工作原理

該工具基于wxPython構(gòu)建,提供簡單的圖形界面。用戶輸入網(wǎng)頁URL,選擇保存路徑,點擊按鈕即可開始截圖。以下是工作流程:

1. 用戶界面

工具使用wxPython創(chuàng)建了一個簡潔的GUI,包含以下組件:

  • URL輸入框:用戶輸入目標(biāo)網(wǎng)頁的URL(若無http://或https://前綴,自動添加https://)。
  • 保存路徑選擇:允許用戶選擇截圖保存的文件夾,默認(rèn)路徑為用戶的“圖片”文件夾。
  • 截圖按鈕:觸發(fā)網(wǎng)頁加載和截圖過程。
  • 進(jìn)度條:實時顯示滾動和截圖進(jìn)度。
  • 狀態(tài)欄:顯示當(dāng)前操作狀態(tài)(如“正在加載網(wǎng)頁”或“截圖已保存”)。

2. 網(wǎng)頁加載與滾動

非無頭模式:工具使用Selenium控制Chrome瀏覽器,并以可見窗口運行(移除--headless選項),讓用戶看到網(wǎng)頁的加載和滾動過程。

平滑滾動:通過JavaScript的window.scrollTo方法實現(xiàn)平滑滾動(behavior: 'smooth'),每次滾動一小段(基于頁面高度和視口高度計算步數(shù)),并暫停0.5秒以確保內(nèi)容加載。

進(jìn)度反饋:滾動過程中,進(jìn)度條根據(jù)滾動步數(shù)更新,增強用戶體驗。

3. 截圖捕獲

CDP方法:使用Chrome DevTools Protocol(CDP)的Page.captureScreenshot方法,一次性捕獲整個網(wǎng)頁(captureBeyondViewport: True),無需拼接。

保存為PNG:截圖以PNG格式保存,文件名為{域名}_{時間戳}.png,例如example.com_20250516_194023.png。

4. 錯誤處理

驗證URL和保存路徑的有效性,若無效則彈出提示。

捕獲所有異常,確保瀏覽器在錯誤發(fā)生時正確關(guān)閉,并通過彈窗和狀態(tài)欄向用戶反饋詳細(xì)錯誤信息。

代碼實現(xiàn)

以下是核心代碼片段,展示了滾動和截圖邏輯:

import wx
import os
import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
import base64
from urllib.parse import urlparse
import threading
 
class ScreenshotApp(wx.Frame):
    def __init__(self, parent, title):
        super(ScreenshotApp, self).__init__(parent, title=title, size=(600, 300))
        self.InitUI()
        self.Centre()
        self.Show()
 
    def InitUI(self):
        panel = wx.Panel(self)
        vbox = wx.BoxSizer(wx.VERTICAL)
 
        # URL輸入?yún)^(qū)域
        url_box = wx.BoxSizer(wx.HORIZONTAL)
        url_label = wx.StaticText(panel, label="網(wǎng)頁URL:")
        self.url_text = wx.TextCtrl(panel, size=(400, -1))
        url_box.Add(url_label, flag=wx.RIGHT | wx.ALIGN_CENTER_VERTICAL, border=8)
        url_box.Add(self.url_text, proportion=1)
 
        # 保存路徑區(qū)域
        path_box = wx.BoxSizer(wx.HORIZONTAL)
        path_label = wx.StaticText(panel, label="保存路徑:")
        self.path_text = wx.TextCtrl(panel, size=(300, -1))
        browse_button = wx.Button(panel, label="瀏覽...")
        path_box.Add(path_label, flag=wx.RIGHT | wx.ALIGN_CENTER_VERTICAL, border=8)
        path_box.Add(self.path_text, proportion=1, flag=wx.RIGHT, border=5)
        path_box.Add(browse_button)
 
        # 截圖按鈕
        screenshot_button = wx.Button(panel, label="截取網(wǎng)頁")
 
        # 進(jìn)度條
        self.progress_bar = wx.Gauge(panel, range=100, size=(400, 20))
        self.progress_bar.SetValue(0)
 
        # 狀態(tài)顯示區(qū)域
        self.status_text = wx.StaticText(panel, label="")
 
        # 添加到垂直布局
        vbox.Add((-1, 20))
        vbox.Add(url_box, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=10)
        vbox.Add((-1, 20))
        vbox.Add(path_box, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=10)
        vbox.Add((-1, 30))
        vbox.Add(screenshot_button, flag=wx.ALIGN_CENTER)
        vbox.Add((-1, 20))
        vbox.Add(self.progress_bar, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=10)
        vbox.Add((-1, 10))
        vbox.Add(self.status_text, flag=wx.ALIGN_CENTER)
 
        # 綁定事件
        browse_button.Bind(wx.EVT_BUTTON, self.OnBrowse)
        screenshot_button.Bind(wx.EVT_BUTTON, self.OnScreenshot)
 
        # 設(shè)置默認(rèn)保存路徑為用戶的圖片文件夾
        default_path = os.path.join(os.path.expanduser("~"), "Pictures")
        self.path_text.SetValue(default_path)
 
        panel.SetSizer(vbox)
 
    def OnBrowse(self, event):
        dialog = wx.DirDialog(self, "選擇保存截圖的文件夾", style=wx.DD_DEFAULT_STYLE)
        if dialog.ShowModal() == wx.ID_OK:
            self.path_text.SetValue(dialog.GetPath())
        dialog.Destroy()
 
    def OnScreenshot(self, event):
        url = self.url_text.GetValue().strip()
        save_path = self.path_text.GetValue().strip()
 
        # 驗證URL
        if not url:
            wx.MessageBox("請輸入有效的URL", "錯誤", wx.OK | wx.ICON_ERROR)
            return
 
        # 如果URL沒有http前綴,添加https://
        if not url.startswith(('http://', 'https://')):
            url = 'https://' + url
            self.url_text.SetValue(url)
 
        # 驗證保存路徑
        if not os.path.exists(save_path):
            try:
                os.makedirs(save_path)
            except Exception as e:
                wx.MessageBox(f"創(chuàng)建保存路徑失敗: {str(e)}", "錯誤", wx.OK | wx.ICON_ERROR)
                return
 
        self.status_text.SetLabel("正在加載網(wǎng)頁并滾動,請稍候...")
        self.progress_bar.SetValue(0)
        self.Layout()
 
        # 使用線程避免界面凍結(jié)
        thread = threading.Thread(target=self.take_screenshot, args=(url, save_path))
        thread.daemon = True
        thread.start()
 
    def scroll_page(self, driver):
        """滾動頁面以觸發(fā)所有懶加載內(nèi)容,顯示滾動效果"""
        total_height = driver.execute_script("return document.body.scrollHeight")
        viewport_height = driver.execute_script("return window.innerHeight")
        steps = max(1, total_height // viewport_height)  # 計算滾動步數(shù)
        step_height = total_height / steps
 
        for i in range(steps + 1):
            scroll_position = int(i * step_height)
            driver.execute_script(f"window.scrollTo({{top: {scroll_position}, behavior: 'smooth'}});")
            wx.CallAfter(self.progress_bar.SetValue, int((i + 1) / (steps + 1) * 100))
            time.sleep(0.5)  # 等待平滑滾動和內(nèi)容加載
        time.sleep(1)  # 確保所有內(nèi)容加載完成
 
    def take_screenshot(self, url, save_path):
        try:
            # 設(shè)置Chrome選項,移除無頭模式以顯示瀏覽器
            chrome_options = Options()
            chrome_options.add_argument("--disable-gpu")
            chrome_options.add_argument("--disable-infobars")
            chrome_options.add_argument("--disable-extensions")
            chrome_options.add_argument("--window-size=1920,1080")  # 設(shè)置初始窗口大小
 
            # 啟動瀏覽器
            service = Service(ChromeDriverManager().install())
            driver = webdriver.Chrome(service=service, options=chrome_options)
 
            # 訪問網(wǎng)頁
            driver.get(url)
            time.sleep(3)  # 等待頁面初始加載
 
            # 滾動頁面以觸發(fā)懶加載內(nèi)容
            self.scroll_page(driver)
 
            # 獲取域名和時間戳
            domain = urlparse(url).netloc or "webpage"
            timestamp = time.strftime("%Y%m%d_%H%M%S")
 
            # 使用CDP方法獲取完整頁面截圖
            result = driver.execute_cdp_cmd('Page.captureScreenshot', 
                                            {'format': 'png', 'captureBeyondViewport': True})
            image_data = base64.b64decode(result['data'])
            save_file = os.path.join(save_path, f"{domain}_{timestamp}.png")
            with open(save_file, 'wb') as f:
                f.write(image_data)
 
            driver.quit()
            wx.CallAfter(self.screenshot_complete, save_file)
 
        except Exception as e:
            if 'driver' in locals():
                driver.quit()
            wx.CallAfter(self.screenshot_error, str(e))
 
    def screenshot_complete(self, filepath):
        self.status_text.SetLabel(f"截圖已保存至: {filepath}")
        self.progress_bar.SetValue(100)
        wx.MessageBox(f"截圖已保存至:\n{filepath}", "成功", wx.OK | wx.ICON_INFORMATION)
 
    def screenshot_error(self, error_msg):
        self.status_text.SetLabel(f"截圖失敗: {error_msg}")
        self.progress_bar.SetValue(0)
        wx.MessageBox(f"截圖失敗: {error_msg}", "錯誤", wx.OK | wx.ICON_ERROR)
 
if __name__ == '__main__':
    app = wx.App()
    ScreenshotApp(None, title='網(wǎng)頁截圖工具')
    app.MainLoop()

安裝與運行

環(huán)境要求

Python 3.8+

依賴庫:pip install wxPython selenium webdriver_manager

運行步驟

  • 安裝依賴庫。
  • 運行代碼,打開GUI窗口。
  • 輸入網(wǎng)頁URL(如example.com)。
  • 選擇保存路徑(或使用默認(rèn)路徑)。
  • 點擊“截取網(wǎng)頁”,觀察瀏覽器打開、平滑滾動并截圖。
  • 截圖完成后,查看保存的PNG文件。

優(yōu)勢與局限性

優(yōu)勢

  • 直觀體驗:可見的瀏覽器窗口和進(jìn)度條讓用戶清楚操作進(jìn)程。
  • 完整截圖:支持動態(tài) 網(wǎng)頁,確保捕獲所有內(nèi)容。
  • 易用性:簡單的GUI適合非技術(shù)用戶。
  • 跨平臺:wxPython和Selenium支持Windows、macOS和Linux。

局限性

  • 性能:對于超長網(wǎng)頁,滾動和加載可能需要較長時間。
  • 依賴性:需要安裝Chrome瀏覽器和ChromeDriver。
  • CDP限制:某些Chrome版本可能不支持CDP截圖(可回退到拼接方法)。

運行結(jié)果

到此這篇關(guān)于Python利用Selenium實現(xiàn)全網(wǎng)頁截圖的文章就介紹到這了,更多相關(guān)Python Selenium網(wǎng)頁截圖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python練習(xí)之操作SQLite數(shù)據(jù)庫

    Python練習(xí)之操作SQLite數(shù)據(jù)庫

    這篇文章主要介紹了Python練習(xí)之操作SQLite數(shù)據(jù)庫,主要通過三個問題如何創(chuàng)建SQLite數(shù)據(jù)庫?如何向SQLite表中插入數(shù)據(jù)?如何查詢SQLite表中的數(shù)據(jù)?展開文章主題詳情,需要的朋友可以參考一下
    2022-06-06
  • Ubuntu安裝Python3.8的兩種方法詳解

    Ubuntu安裝Python3.8的兩種方法詳解

    這篇文章主要給大家介紹了關(guān)于Ubuntu安裝Python3.8的兩種方法,在Ubuntu上安裝Python非常簡單,文中介紹了兩種方法,每種方法都給出了詳細(xì)實例,需要的朋友可以參考下
    2023-09-09
  • Python性能加速器__slots__屬性優(yōu)化內(nèi)存使用實例探索

    Python性能加速器__slots__屬性優(yōu)化內(nèi)存使用實例探索

    Python中的__slots__屬性是一個特殊的屬性,允許程序員顯式地定義類的屬性,提供了一種方式來優(yōu)化類的內(nèi)存占用和提高訪問速度,本文將深入探討__slots__屬性的概念、應(yīng)用和性能優(yōu)勢
    2024-01-01
  • 如何利用Anaconda配置簡單的Python環(huán)境

    如何利用Anaconda配置簡單的Python環(huán)境

    這篇文章主要為大家詳細(xì)介紹了如何利用Anaconda配置簡單的Python環(huán)境,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • python爬蟲MeterSphere平臺執(zhí)行報告流程解析

    python爬蟲MeterSphere平臺執(zhí)行報告流程解析

    這篇文章主要為大家介紹了python爬蟲MeterSphere平臺執(zhí)行報告流程解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • python爬蟲爬取監(jiān)控教務(wù)系統(tǒng)的思路詳解

    python爬蟲爬取監(jiān)控教務(wù)系統(tǒng)的思路詳解

    這篇文章主要介紹了python爬蟲監(jiān)控教務(wù)系統(tǒng),主要實現(xiàn)思路是對已有的成績進(jìn)行處理,變?yōu)閘ist集合,本文通過實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2020-01-01
  • 淺析Python中的序列化存儲的方法

    淺析Python中的序列化存儲的方法

    這篇文章主要介紹了Python中的序列化存儲的方法,序列化存儲主要針對的是內(nèi)存和硬盤之間的寫入操作,需要的朋友可以參考下
    2015-04-04
  • python、Matlab求定積分的實現(xiàn)

    python、Matlab求定積分的實現(xiàn)

    今天小編就為大家分享一篇python、Matlab求定積分的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • 如何解決import torchvision報錯問題 DLL:找不到模塊

    如何解決import torchvision報錯問題 DLL:找不到模塊

    這篇文章主要介紹了如何解決import torchvision報錯問題 DLL:找不到模塊,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 在Python的Django框架中創(chuàng)建和使用模版

    在Python的Django框架中創(chuàng)建和使用模版

    這篇文章主要介紹了在Python的Django框架中創(chuàng)建和使用模版的方法,包括使用manage.py shell來幫助設(shè)置模版的方法,需要的朋友可以參考下
    2015-07-07

最新評論

许昌市| 西吉县| 贡嘎县| 巨野县| 基隆市| 西昌市| 云和县| 三亚市| 米易县| 湘西| 应城市| 买车| 荣昌县| 清流县| 来宾市| 越西县| 牟定县| 河津市| 安陆市| 克拉玛依市| 松滋市| 册亨县| 稷山县| 合阳县| 九龙县| 鄂州市| 高雄市| 常山县| 西乌珠穆沁旗| 军事| 栖霞市| 和平县| 轮台县| 政和县| 菏泽市| 黄山市| 长治县| 延寿县| 元氏县| 迭部县| 洪雅县|