如何在Alpine Docker中安装Chromium以使用requests_html的html.render()
在Alpine Docker中处理JS渲染页面的问题解决
问题背景
需要抓取JS渲染的网站,使用requests_html库可实现该需求,本地运行时首次会自动安装Chromium完成页面渲染,但在Alpine Docker容器中运行时出现文件找不到的错误。
测试代码
from requests_html import HTMLSession url = "examplesite" # 替换为目标网站URL session = HTMLSession() r = session.get(url) r.html.render(sleep=1) print(r.html.html)
报错信息
FileNotFoundError: [Errno 2] No such file or directory: '/root/.local/share/pyppeteer/local-chromium/588429/chrome-linux/chrome': '/root/.local/share/pyppeteer/local-chromium/588429/chrome-linux/chrome'
尝试过的无效Docker配置
FROM python:3.7-alpine3.13 RUN apk add --no-cache chromium --repository=http://dl-cdn.alpinelinux.org/alpine/v3.10/main
解决方案
方案1:修复Alpine Docker中Chromium的安装与配置
之前的配置无效是因为使用了与基础镜像版本不兼容的Alpine源,且未指定requests_html使用系统安装的Chromium,导致库仍尝试自动下载私有版本。正确的Dockerfile配置如下:
FROM python:3.7-alpine3.13 # 安装Chromium及依赖,使用与基础镜像匹配的Alpine 3.13源 RUN apk add --no-cache chromium chromium-chromedriver # 设置环境变量,强制pyppeteer使用系统安装的Chromium,避免自动下载 ENV PYPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser # 安装requests_html库 RUN pip install requests_html
同时需要修改Python代码,添加无头模式及Docker适配参数(Docker容器无图形界面,必须启用无头模式):
from requests_html import HTMLSession url = "examplesite" session = HTMLSession() r = session.get(url) # 启用无头模式,添加沙箱禁用、共享内存限制禁用参数,适配Docker环境 r.html.render( sleep=1, headless=True, args=['--no-sandbox', '--disable-dev-shm-usage'] ) print(r.html.html)
方案2:推荐Docker环境友好的替代库
如果requests_html的配置仍有问题,可以考虑以下更适合容器环境的库:
Playwright
微软开发的自动化测试/网页抓取库,对Docker环境支持完善,API简洁直观,支持多浏览器:
- Dockerfile配置:
FROM python:3.7-alpine3.13 # 安装依赖及Chromium RUN apk add --no-cache chromium RUN pip install playwright # 安装Chromium浏览器二进制文件 RUN playwright install chromium
- 示例代码:
from playwright.sync_api import sync_playwright with sync_playwright() as p: # 启动无头Chromium,适配Docker环境 browser = p.chromium.launch( headless=True, args=['--no-sandbox', '--disable-dev-shm-usage'] ) page = browser.new_page() page.goto("examplesite") # 获取页面渲染后的HTML内容 print(page.content()) browser.close()
Selenium
老牌网页自动化库,配合Chromedriver可实现JS渲染页面抓取,适合复杂交互场景:
- Dockerfile配置:
FROM python:3.7-alpine3.13 RUN apk add --no-cache chromium chromium-chromedriver RUN pip install selenium
- 示例代码:
from selenium import webdriver from selenium.webdriver.chrome.options import Options chrome_options = Options() chrome_options.add_argument("--headless") chrome_options.add_argument("--no-sandbox") chrome_options.add_argument("--disable-dev-shm-usage") driver = webdriver.Chrome(options=chrome_options) driver.get("examplesite") print(driver.page_source) driver.quit()
内容的提问来源于stack exchange,提问作者MisterJAcobz
相关产品推荐
相关产品推荐

