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

Python Selenium获取HTML页面内容不全,如何获取浏览器完整页面?

解决Selenium下载HTML页面内容不全的问题

你的问题出在browser.page_source仅能获取当前时刻的DOM树,但目标页面依赖JavaScript动态加载内容(比如滚动加载、延迟渲染),且headless模式下默认渲染行为可能导致部分内容未加载。浏览器右键“另存为”会触发完整的页面渲染与资源捕获,因此能拿到完整内容。以下是几个可行的解决方案:

方案1:等待动态内容加载+模拟滚动

先确保页面完全加载,再模拟滚动触发所有动态内容加载:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.support.ui import WebDriverWait
import time

chrome_options = Options()
chrome_options.add_argument("--headless=new")  # 新版headless更贴近正常浏览器行为
chrome_options.add_argument("--window-size=1920,1080")  # 设置窗口大小,避免渲染截断
browser = webdriver.Chrome(ChromeDriverManager().install(), options=chrome_options)

for url in URL_list:
    browser.get(url)
    # 等待页面DOM加载完成
    WebDriverWait(browser, 15).until(
        lambda driver: driver.execute_script('return document.readyState') == 'complete'
    )
    # 循环滚动到底部,加载所有动态内容
    last_scroll_height = browser.execute_script("return document.body.scrollHeight")
    while True:
        browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        time.sleep(1.5)  # 等待内容加载
        current_scroll_height = browser.execute_script("return document.body.scrollHeight")
        if current_scroll_height == last_scroll_height:
            break
        last_scroll_height = current_scroll_height
    # 此时获取的page_source包含所有加载完成的内容
    content = browser.page_source
    with open(f"{DOWNLOAD_PATH}{file_name}.html", "w", encoding='utf-8') as file:
        file.write(content)
browser.close()

方案2:模拟浏览器“另存为”操作

直接调用Chrome的DevTools协议触发页面保存,效果与手动右键另存为完全一致:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
import os
import time

chrome_options = Options()
chrome_options.add_argument("--headless=new")
chrome_options.add_argument("--window-size=1920,1080")
browser = webdriver.Chrome(ChromeDriverManager().install(), options=chrome_options)

# 设置下载路径
download_dir = os.path.abspath(DOWNLOAD_PATH)
browser.execute_cdp_cmd("Page.setDownloadBehavior", {
    "behavior": "allow",
    "downloadPath": download_dir
})

for url in URL_list:
    browser.get(url)
    # 等待页面加载+滚动加载所有内容
    WebDriverWait(browser, 15).until(
        lambda driver: driver.execute_script('return document.readyState') == 'complete'
    )
    last_scroll_height = browser.execute_script("return document.body.scrollHeight")
    while True:
        browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        time.sleep(1.5)
        current_scroll_height = browser.execute_script("return document.body.scrollHeight")
        if current_scroll_height == last_scroll_height:
            break
        last_scroll_height = current_scroll_height
    # 调用DevTools保存页面
    browser.execute_cdp_cmd("Page.savePage", {
        "path": f"{file_name}.html",
        "saveFormat": "html"
    })
    # 等待保存完成
    time.sleep(1)
browser.close()

方案3:轻量替代方案——使用requests-html

如果Selenium配置繁琐,可以试试requests-html,它内置JS渲染引擎,代码更简洁:

from requests_html import HTMLSession

session = HTMLSession()
for url in URL_list:
    r = session.get(url)
    # 渲染页面,scrolldown控制滚动次数,sleep控制每次滚动后的等待时间
    r.html.render(scrolldown=5, sleep=2)
    content = r.html.html
    with open(f"{DOWNLOAD_PATH}{file_name}.html", "w", encoding='utf-8') as file:
        file.write(content)
session.close()

注意事项

  • 调整等待时间:不同页面加载速度不同,需根据目标网站实际情况修改time.sleep时长。
  • 反爬处理:若目标网站有反爬机制,可给浏览器添加user-agent等参数,模拟正常用户请求。
  • 批量下载优化:下载数千个页面时,建议添加失败重试机制,避免单个页面出错中断整个流程。

内容的提问来源于stack exchange,提问作者Ron Keinan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 21:09:25