使用Python Requests无法解析JavaScript渲染网页的问题求助
解决动态页面HTML获取不完整的问题
你遇到的问题是因为微软应用商店的这个页面属于动态渲染页面:服务器返回的初始HTML仅包含页面基础框架,大部分内容是通过浏览器端的JavaScript动态加载生成的。而requests库只能获取服务器返回的静态初始HTML,无法执行JavaScript代码,所以保存的文件里body内容不完整。
以下是两种可行的解决方案:
方案一:使用Selenium模拟浏览器加载
Selenium可以模拟真实浏览器的行为,执行页面中的JavaScript,从而获取完整的渲染后HTML。
实现代码
from selenium import webdriver from selenium.webdriver.chrome.options import Options import time def get_full_html(url): # 配置Chrome无头模式(不弹出浏览器窗口) chrome_options = Options() chrome_options.add_argument("--headless=new") chrome_options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36") # 初始化浏览器驱动 driver = webdriver.Chrome(options=chrome_options) driver.get(url) # 等待页面内容加载完成(可根据实际情况调整等待时间) time.sleep(5) # 获取完整渲染后的页面HTML full_html = driver.page_source # 保存到文件 with open("full_index.html", "w", encoding="utf-8") as file: file.write(full_html) # 关闭浏览器 driver.quit() get_full_html("https://apps.microsoft.com/store/category/Business")
前置准备
- 安装Selenium:
pip install selenium - 下载对应版本的ChromeDriver,将其放入系统环境变量路径中,或者在初始化
webdriver.Chrome时通过executable_path参数指定驱动文件路径。
方案二:使用Playwright获取完整页面
Playwright是更现代的浏览器自动化工具,自带驱动管理,无需手动下载浏览器驱动,使用更便捷。
实现代码
from playwright.sync_api import sync_playwright def get_full_html(url): with sync_playwright() as p: # 启动无头模式的Chromium浏览器 browser = p.chromium.launch(headless=True) page = browser.new_page(user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36") # 访问页面,等待网络空闲确保内容加载完成 page.goto(url, wait_until="networkidle") # 获取完整页面HTML full_html = page.content() # 保存到文件 with open("full_index.html", "w", encoding="utf-8") as file: file.write(full_html) # 关闭浏览器 browser.close() get_full_html("https://apps.microsoft.com/store/category/Business")
前置准备
- 安装Playwright:
pip install playwright - 安装Chromium驱动:
playwright install chromium
额外优化方案(更高效)
如果不需要完整HTML,只是想获取页面中的应用数据,可以通过浏览器开发者工具抓包,找到页面加载数据的API接口,直接用requests请求接口获取结构化的JSON数据,这种方式比解析HTML效率更高,也更稳定。比如打开浏览器的「开发者工具」-「网络」面板,筛选XHR/Fetch请求,找到加载应用列表的接口,复制请求参数后用requests调用即可。
内容的提问来源于stack exchange,提问作者Yauheni Filipchanka
相关产品推荐
相关产品推荐

