如何用Python捕获本地运行的特定网页(URL)?
如何捕获特定网页而非全屏?
当然可以捕获特定网页——不管是本地运行的页面还是在线URL(比如谷歌、Stack OverFlow)。下面给两种适合新手的实现方案,你可以根据需求选择:
方案1:基于现有代码改进,定位浏览器窗口区域截图
你的现有代码是全屏截图,我们可以通过获取目标浏览器窗口的位置和尺寸,只截取对应区域,不需要大改现有逻辑。
步骤:
- 先安装窗口定位依赖:
pip install pygetwindow pywin32(Windows平台,Mac/Linux可改用pyobjc或wmctrl) - 修改代码,先定位浏览器窗口,再截取指定区域
修改后的代码示例:
import numpy as np import cv2 as cv import pyautogui from time import time import pygetwindow as gw # 找到目标浏览器窗口(这里以Chrome为例,可改为你用的浏览器名称,比如"Edge") try: browser_window = gw.getWindowsWithTitle("Chrome")[0] # 确保窗口处于前台 browser_window.activate() except IndexError: print("未找到目标浏览器窗口,请先打开网页") exit() loop_time = time() while True: # 获取窗口的位置和尺寸(修正窗口边框偏移,不同浏览器可能需要微调) x, y = browser_window.left + 8, browser_window.top + 30 width, height = browser_window.width - 16, browser_window.height - 38 # 只截取浏览器窗口内的区域 screenshot = pyautogui.screenshot(region=(x, y, width, height)) screenshot = np.array(screenshot) screenshot = cv.cvtColor(screenshot, cv.COLOR_BGRA2BGR) cv.imshow('Capture Web Page', screenshot) print(f'FPS { 1/(time()-loop_time):.0f}') loop_time = time() keyCode = cv.waitKey(1) if keyCode == 27 or keyCode == ord('q'): print('窗口已关闭') cv.destroyAllWindows() break
说明:
gw.getWindowsWithTitle("Chrome")里的标题要匹配你的浏览器窗口标题,比如打开Stack OverFlow后,窗口标题会包含"Stack Overflow",也可以用这个关键词定位- 窗口的偏移值(+8、+30等)是为了去掉浏览器的标题栏和边框,不同浏览器/系统可能需要微调
方案2:用Selenium直接捕获网页(更稳定精准)
如果窗口定位容易出错,推荐用Selenium直接控制浏览器加载网页并截图,这种方法不依赖系统窗口管理,兼容性更好。
步骤:
- 安装Selenium:
pip install selenium - 下载对应浏览器的驱动(比如ChromeDriver,要和你的Chrome版本匹配),把驱动文件放到系统PATH里或和代码同目录
代码示例:
import numpy as np import cv2 as cv from selenium import webdriver from selenium.webdriver.chrome.options import Options from time import time # 配置Chrome选项,可设置窗口大小 chrome_options = Options() chrome_options.add_argument("--window-size=1920,1080") # 设置网页显示尺寸 # 如果需要后台运行,可以添加 --headless 参数 # 启动浏览器并打开目标网页 driver = webdriver.Chrome(options=chrome_options) driver.get("https://stackoverflow.com") # 替换成你要捕获的URL loop_time = time() while True: # 获取网页截图,转成OpenCV格式 screenshot = driver.get_screenshot_as_png() screenshot = np.frombuffer(screenshot, np.uint8) screenshot = cv.imdecode(screenshot, cv.IMREAD_COLOR) cv.imshow('Capture Web Page', screenshot) print(f'FPS { 1/(time()-loop_time):.0f}') loop_time = time() keyCode = cv.waitKey(1) if keyCode == 27 or keyCode == ord('q'): print('窗口已关闭') driver.quit() cv.destroyAllWindows() break
说明:
- 这种方法可以直接加载任意在线URL,也可以加载本地HTML文件(把
driver.get()的参数改成file:///本地文件路径) - 如果需要捕获滚动后的完整网页,还可以用Selenium执行JS获取页面高度,调整窗口后再截图
内容的提问来源于stack exchange,提问作者so-me
相关产品推荐
相关产品推荐

