requests_html的HTML.render方法在Azure虚拟机中运行失败如何解决
故障排查与解决方案
根本原因
requests_html的render()方法底层依赖Chromium浏览器运行时完成JS动态渲染,本地运行正常是因为你的个人系统已经预装了Chromium/Chrome浏览器及相关依赖库,而Azure虚拟机默认的服务器级操作系统(无桌面环境)缺少Chromium运行所需的依赖包,同时也存在环境配置不兼容的问题。
分步解决方法
1. 预装Chromium及依赖库
手动安装Chromium可以同时解决依赖缺失、以及requests_html首次运行时自动下载Chromium失败的问题,对应不同操作系统执行对应命令:
- Debian/Ubuntu 系列:
sudo apt update && sudo apt install -y chromium-browser chromium-chromedriver libxss1 libnss3 libasound2 libatk-bridge2.0-0 libgtk-3-0
- CentOS/RHEL 系列:
sudo yum install -y chromium chromium-driver libXScrnSaver nss alsa-lib at-spi2-atk gtk3
2. 调整代码适配无桌面服务器环境
服务器无图形界面,需要给Chromium指定无头运行参数,同时规避权限、资源不足的问题,修改后代码如下:
from requests_html import HTMLSession def get_page_content(link): s = HTMLSession() # 自定义浏览器启动参数 browser_args = [ "--no-sandbox", # 关闭沙箱,解决root用户运行Chromium的权限报错 "--headless=new", # 启用无头模式,无需图形界面 "--disable-gpu", # 禁用GPU加速,规避无显卡环境兼容性问题 "--disable-dev-shm-usage", # 解决服务器共享内存不足的问题 "--single-process" # 单进程运行,降低资源占用 ] try: response = s.get(link, timeout=15) response.html.render( timeout=60, reload=False, browser_args=browser_args ) content = response.text finally: s.close() return content
3. 云环境特殊配置排查
如果上述操作后仍报错,检查以下配置:
- 检查Azure虚拟机网络安全组的出口规则,确认允许访问目标站点的端口,没有流量拦截限制
- 确认虚拟机可用内存不小于1G,Chromium运行最低需要1G左右内存,配置不足可以升级实例或者增加swap分区
- 不要使用root用户直接运行脚本,如果必须用root运行,确保已经添加
--no-sandbox参数
内容的提问来源于stack exchange,提问作者Felipe Sanchez
相关产品推荐
相关产品推荐

