pyppeteer无头模式截图未渲染完成?

http://m.chinajd995.com:8080/ 以上类似站点去pyppeteer访问会出现页面未加载完成就截图了,导致截图空白

        page = await self.browser.newPage()
        await page.evaluateOnNewDocument('() =>{ Object.defineProperties(navigator,'
                                         '{ webdriver:{ get: () => false } }) }')  # 本页刷新后值不变
        try:
            await page.setUserAgent(UserAgent().random)
            await page.goto(url)
            await page.screenshot({'path': path})
            time.sleep(0.5) # 防止报错
            await page.close()
        except:
            pass

预想效果
image.png
实际效果
whois_home.png
经过测试await asyncio.sleep(10) # 增加等待时间,等待页面加载完成
可行有效,但是由于多个网站都需要这样操作该如何减少他的等待时间呢,而不是写死时间

阅读 1.4k
avatarAI BotBETA

这个问题可能是由于在页面完全加载之前就进行了截图,导致截图空白。你可以尝试以下方法来解决这个问题:

  1. 增加等待时间:在页面加载完成后,再执行截图操作。你可以使用 page.waitForLoadState() 方法来等待页面加载完成。这个方法会返回一个 Promise,当页面加载状态发生变化时,Promise 会被解析为新的状态。你可以在 waitForLoadState() 的 Promise 上调用 then() 方法,在页面加载完成后执行截图操作。
  2. 使用等待器:除了等待页面加载完成,你还可以使用等待器来确保页面中的元素已经加载完成。在 Pyppeteer 中,你可以使用 page.waitForSelector() 方法来等待指定的元素加载完成。在截图之前,你可以等待一些关键的元素加载完成,然后再执行截图操作。

下面是一个修改后的代码示例,添加了等待时间并使用了等待器:

import asyncio
import time
from pyppeteer import launch

async def screenshot_page():
    url = 'http://m.chinajd995.com:8080/'  # 你要截图的网站地址
    path = 'screenshot.png'  # 截图文件路径
    browser = await launch()
    page = await browser.newPage()
    await page.evaluateOnNewDocument('() =>{ Object.defineProperties(navigator,'
                                     '{ webdriver:{ get: () => false } }) }')  # 本页刷新后值不变
    try:
        await page.setUserAgent(UserAgent().random)
        await page.goto(url)
        await asyncio.sleep(5)  # 增加等待时间,等待页面加载完成
        await page.waitForSelector('body')  # 等待页面中的 body 元素加载完成
        await page.screenshot({'path': path})
        await page.close()
    except:
        pass
    finally:
        await browser.close()

asyncio.get_event_loop().run_until_complete(screenshot_page())

这个代码示例中,我们在 page.goto() 方法后添加了一个 asyncio.sleep() 方法,等待 5 秒钟,以确保页面有足够的时间加载完成。然后,我们使用 page.waitForSelector('body') 方法等待页面的 body 元素加载完成,再执行截图操作。这样就可以确保截图时页面已经完全加载并且元素已经加载完成。

1 个回答
推荐问题