You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Selenium+Python无弹窗下载带资源的完整HTML网页

问题分析与解决方案

你的代码问题所在

  1. Chrome偏好设置不生效:你配置的download.default_directory等选项仅针对浏览器的文件下载操作(比如点击链接下载文件),但Ctrl+S触发的是网页保存对话框——这是系统级原生弹窗,Selenium的下载偏好完全无法控制它。
  2. pyautogui的局限性:模拟键盘操作极度依赖Chrome窗口处于前台焦点,且操作时机(比如页面是否完全加载)很难精准把控;一旦页面加载缓慢、窗口失焦,或者输入法状态异常,整个模拟流程都会失效。

修复方案:用Chrome DevTools协议(CDP)保存完整页面

不用依赖pyautogui,直接通过Selenium调用Chrome的CDP命令,就能保存包含所有资源的页面,本地打开效果和服务器完全一致。

方案1:保存为MHTML(推荐)

MHTML格式会把页面所有资源(CSS、JS、图片)打包进单个文件,无需额外资源文件夹,本地打开直接还原页面效果:

from selenium import webdriver

chrome_options = webdriver.ChromeOptions()
driver = webdriver.Chrome(options=chrome_options)

# 执行登录流程
driver.get("你的目标URL")
driver.find_element("xpath", '//*[@id="id_username"]').send_keys('username')
driver.find_element("xpath", '//*[@id="id_password"]').send_keys('password')
driver.find_element("xpath", '//*[@id="datagrid-0"]/div[2]/div[1]/div[1]/table/tbody/tr[1]/td[2]/a').click()

# 等待页面完全加载(可根据实际情况替换为显式等待)
driver.implicitly_wait(10)

# 调用CDP命令捕获MHTML内容
mhtml_content = driver.execute_cdp_cmd("Page.captureSnapshot", {"format": "mhtml"})["data"]

# 保存到指定路径
with open("C:\\Users\\pathtodir\\hello1.mhtml", "w", encoding="utf-8") as f:
    f.write(mhtml_content)

driver.quit()

方案2:保存为标准HTML+资源文件夹

如果需要传统的HTML文件+配套资源文件夹的格式,可通过CDP命令触发浏览器自动保存:

from selenium import webdriver

chrome_options = webdriver.ChromeOptions()
preferences = {
    "download.default_directory": "C:\\Users\\pathtodir",
    "download.prompt_for_download": False,
    "download.directory_upgrade": True,
    "safebrowsing.enabled": True,
    "profile.default_content_settings.popups": 0
}
chrome_options.add_experimental_option("prefs", preferences)
chrome_options.add_argument("--enable-save-page-as-mhtml")

driver = webdriver.Chrome(options=chrome_options)
# 登录流程同上...

# 调用CDP命令触发页面保存
driver.execute_cdp_cmd("Page.saveAs", {
    "url": driver.current_url,
    "saveFormat": "html"
})

driver.quit()

替代库推荐

  1. Playwright(推荐):微软开发的新一代自动化工具,支持多浏览器,内置完整页面保存API,代码简洁易维护:
    from playwright.sync_api import sync_playwright
    
    with sync_playwright() as p:
        browser = p.chromium.launch()
        page = browser.new_page()
        page.goto("你的目标URL")
        # 执行登录
        page.fill('//*[@id="id_username"]', 'username')
        page.fill('//*[@id="id_password"]', 'password')
        page.click('//*[@id="datagrid-0"]/div[2]/div[1]/div[1]/table/tbody/tr[1]/td[2]/a')
        # 保存完整页面到指定路径
        page.save_as("C:\\Users\\pathtodir\\hello1.html")
        browser.close()
    
  2. Pyppeteer:Python版Puppeteer,基于Chrome DevTools协议,轻量灵活:
    import asyncio
    from pyppeteer import launch
    
    async def save_target_page():
        browser = await launch()
        page = await browser.newPage()
        await page.goto("你的目标URL")
        # 登录操作
        await page.type('//*[@id="id_username"]', 'username')
        await page.type('//*[@id="id_password"]', 'password')
        await page.click('//*[@id="datagrid-0"]/div[2]/div[1]/div[1]/table/tbody/tr[1]/td[2]/a')
        # 保存页面
        await page.save('C:\\Users\\pathtodir\\hello1.html')
        await browser.close()
    
    asyncio.get_event_loop().run_until_complete(save_target_page())
    
  3. Requests + BeautifulSoup + urllib:适合静态页面,手动控制登录会话与资源下载,灵活性拉满但需要更多代码:
    • 用requests.Session()维持登录状态,获取页面HTML
    • 用BeautifulSoup解析页面中的资源链接(CSS、JS、图片)
    • 用urllib.request下载资源到本地文件夹,修改HTML中的资源路径为本地路径

内容的提问来源于stack exchange,提问作者Manisha Biswas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 20:15:55