You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python网页截图工具开发难题:无法获取完全加载页面的截图

网页截图加载不完全问题解决方案

一、Selenium 弹窗与批量处理优化

针对Selenium弹窗问题,可通过配置浏览器参数禁用弹窗、启用无头模式,同时优化等待逻辑确保页面完全加载:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

# 配置Chrome参数
chrome_options = Options()
chrome_options.add_argument("--headless=new")  # 无头模式,不弹出浏览器窗口
chrome_options.add_argument("--disable-notifications")  # 禁用通知弹窗
chrome_options.add_argument("--disable-popup-blocking")  # 拦截页面弹窗
chrome_options.add_argument("--start-maximized")  # 最大化窗口,避免截图区域不全
chrome_options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36")  # 模拟真实浏览器UA

driver = webdriver.Chrome(options=chrome_options)
url_list = ["你的URL1", "你的URL2"]  # 替换为你的500个URL

for idx, url in enumerate(url_list):
    try:
        driver.get(url)
        # 等待关键元素加载完成(以main标签为例,可替换为页面核心元素)
        WebDriverWait(driver, 30).until(EC.visibility_of_element_located((By.TAG_NAME, "main")))
        # 等待所有图片加载完成(针对图片较多的页面)
        WebDriverWait(driver, 20).until(lambda d: all(img.get_attribute('complete') for img in d.find_elements(By.TAG_NAME, 'img')))
        # 保存截图
        driver.save_screenshot(f"screenshot_{idx}.png")
    except Exception as e:
        print(f"处理URL {url} 失败: {str(e)}")
        continue

driver.quit()

二、Pyppeteer 动态加载问题解决

针对Pyppeteer无法等待完全加载的情况,需结合网络空闲等待、懒加载处理、元素可见性校验:

import asyncio
from pyppeteer import launch

async def capture_screenshot(url, output_path):
    browser = await launch(
        headless=True,
        args=[
            '--start-maximized',
            '--disable-notifications',
            '--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'
        ]
    )
    page = await browser.newPage()
    await page.setViewport({'width': 1920, 'height': 1080})

    try:
        # 等待网络空闲(500ms内无请求),确保静态资源加载完成
        await page.goto(url, {'waitUntil': 'networkidle0', 'timeout': 60000})
        
        # 处理懒加载:模拟滚动到底部触发内容加载
        await page.evaluate('''() => {
            window.scrollTo(0, document.body.scrollHeight);
        }''')
        await asyncio.sleep(2)  # 滚动后等待内容加载
        
        # 等待核心元素可见(而非仅存在)
        await page.waitForSelector('main', {'visible': True, 'timeout': 30000})
        
        # 等待所有图片加载完成
        await page.evaluate('''async () => {
            const images = Array.from(document.querySelectorAll('img'));
            await Promise.all(images.map(img => {
                if (img.complete) return Promise.resolve();
                return new Promise(resolve => {
                    img.onload = resolve;
                    img.onerror = resolve;
                });
            }));
        }''')
        
        # 截取全页截图
        await page.screenshot({'path': output_path, 'fullPage': True})
    except Exception as e:
        print(f"处理URL {url} 失败: {str(e)}")
    finally:
        await browser.close()

async def main():
    url_list = ["你的URL1", "你的URL2"]  # 替换为你的500个URL
    tasks = []
    for idx, url in enumerate(url_list):
        output = f"screenshot_{idx}.png"
        tasks.append(capture_screenshot(url, output))
    await asyncio.gather(*tasks)

asyncio.run(main())

额外注意事项

  • 若页面存在反爬检测,可添加更多模拟真实浏览器的参数(如禁用自动化标识、启用GPU渲染等);
  • 批量处理时必须加入异常捕获,避免单个URL处理失败导致整个程序中断;
  • 可根据页面实际加载速度调整等待超时时间,平衡效率与加载完整性。

内容的提问来源于stack exchange,提问作者Sanjaikumar Matheshwaran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 00:47:33