如何用Python Requests实现网站截图?求更优解决方案
高效网页截图解决方案
Requests 是 HTTP 请求库,仅能获取页面源码,无法渲染页面中的 JavaScript、CSS 等资源,所以没法直接实现截图。你当前的方案每次启动完整 Chrome 浏览器,资源消耗大,以下是几种更高效的替代方案:
1. Chrome Headless + Selenium
使用 Chrome 的无头模式(无需可视化窗口)配合 Selenium,资源占用远低于普通 Chrome 实例,同时保留完整的页面渲染能力。
步骤与代码:
安装依赖:
pip install selenium确保你的 Chrome 浏览器版本与 ChromeDriver 版本匹配(Selenium 4.6+ 可自动管理驱动)。
截图代码:
from selenium import webdriver from selenium.webdriver.chrome.options import Options def capture_screenshot(url, save_path): # 配置无头模式参数 chrome_options = Options() chrome_options.add_argument("--headless=new") chrome_options.add_argument("--disable-gpu") chrome_options.add_argument("--no-sandbox") # 避免权限问题(Linux 环境常用) chrome_options.add_argument("--window-size=1920,1080") # 设置截图分辨率 driver = webdriver.Chrome(options=chrome_options) try: driver.get(url) # 可选:等待页面加载完成(比如等待元素或固定时长) # driver.implicitly_wait(5) driver.save_screenshot(save_path) finally: driver.quit() # 调用示例 capture_screenshot("https://your-target-site.com", "screenshot.png")
2. Playwright
微软推出的自动化测试工具,支持多浏览器,自带驱动管理,API 更简洁,自动等待机制更智能,适合复杂页面截图。
步骤与代码:
安装依赖:
pip install playwright playwright install # 自动下载所需浏览器(Chromium/Firefox/WebKit)截图代码:
from playwright.sync_api import sync_playwright def capture_screenshot(url, save_path): with sync_playwright() as p: # 启动无头 Chromium browser = p.chromium.launch(headless=True) page = browser.new_page(viewport={"width": 1920, "height": 1080}) page.goto(url) # 等待网络空闲(页面加载完成) page.wait_for_load_state("networkidle") # 可选:截取完整页面(而非可见区域) page.screenshot(path=save_path, full_page=True) browser.close() # 调用示例 capture_screenshot("https://your-target-site.com", "full_page_screenshot.png")
3. Pyppeteer(Python 版 Puppeteer)
基于 Chrome DevTools 协议的轻量工具,无需依赖 Selenium,直接控制 Chromium,适合异步场景。
步骤与代码:
安装依赖:
pip install pyppeteer截图代码:
import asyncio from pyppeteer import launch async def capture_screenshot(url, save_path): browser = await launch(headless=True, args=['--window-size=1920,1080']) page = await browser.newPage() await page.setViewport({'width': 1920, 'height': 1080}) # 等待网络空闲后截图 await page.goto(url, waitUntil='networkidle2') # 可选:截取完整页面 await page.screenshot({'path': save_path, 'fullPage': True}) await browser.close() # 调用示例 asyncio.get_event_loop().run_until_complete( capture_screenshot("https://your-target-site.com", "pyppeteer_screenshot.png") )
方案对比
- 若你已有 Selenium 使用经验,优先选 Chrome Headless + Selenium;
- 追求简洁API和智能等待,选 Playwright;
- 偏好轻量异步方案,选 Pyppeteer。
这些方案均无需启动可视化浏览器,带宽和资源消耗远低于你当前的临时方案,同时支持自定义截图参数,更适配爬虫场景。
内容的提问来源于stack exchange,提问作者Misterknow
相关产品推荐
相关产品推荐

