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
相关产品推荐
相关产品推荐

