当前位置: 首页 > 知识库问答 >
问题:

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

时同
2023-11-20

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) # 增加等待时间,等待页面加载完成
可行有效,但是由于多个网站都需要这样操作该如何减少他的等待时间呢,而不是写死时间

共有2个答案

颛孙庆
2023-11-20

不需要 sleep ,await page.goto(url) 优化下:

await page.goto(url, {    // timeout: 2 * 1000,    waitUntil: ['load', 'domcontentloaded', 'networkidle0']})

具体文档可见:https://pyppeteer.github.io/pyppeteer/reference.html#pyppetee...

郭修平
2023-11-20

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

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

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

import asyncioimport timefrom pyppeteer import launchasync 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 元素加载完成,再执行截图操作。这样就可以确保截图时页面已经完全加载并且元素已经加载完成。

 类似资料:
  • 6.1 渲染模板 一旦你拥有一个模版文件,你可以通过给一个map来给它传递数据。 map是一个变量及赋予的值的集合,模板使用它来得到变量的值,或者对于块标签求值。 它的渲染函数有一个可选的变量键值对map 通过 ctx.Render() 方法来渲染模板,例如: func (r *Render) Serve(ctx *faygo.Context) error { return ctx.Ren

  • 我试图使我的头的背景具有渐变。 这可以很好地使用代码: 然而,由于某种原因,我看不到我的边框和文本,似乎文本也应用了渐变? 我希望文本为黑色,各栏之间有彩色边框。有什么想法吗?

  • 问题内容: 我已经实现了一个Modal组件,该组件在屏幕上显示一个模态对话框。通常,模态将有条件地显示。我可以通过两种方法在render函数中执行此操作: 在Modal组件中,我使用this.props.show为其自身添加了一个不同的类。如果为假,它将添加display:none以隐藏模式。 另一种方式是这样的: 这用于确定是否在渲染中添加Modal。 我想找出的是: 这两种方式有何不同? 其中

  • 渲染模式 一个具有默认参数并且未分配值和纹理的标准着色器材质。参数『渲染模式』被突出显示。 标准着色器的第一个参数是 渲染模式。该参数描述对象是否透明。 不透明 — 默认值,适用于没有透明区域的常规固态物体。 镂空 — 允许你创建在不透明和透明区域之间具有硬边缘的透明效果。在该模式下,没有半透明区域,纹理或者 100% 不透明,或者不可见。当创建带有透明区域的材质时,例如叶子、带孔衣服和碎布这类形

  • Tango默认核心不包含模板渲染功能,在官方中间件中包含两个渲染引擎中间件,一个是 Go标准模板引擎, 另一个是 Pongo2模板引擎

  • 在控制器里模板渲染最常用的方法是display,在CMF中支持如下的模板渲染方式: //不带任何参数 $this->display(); 此种方式系统会自动判断模板路径,并渲染出模板内容,此种方式模板路径是:主题名/应用名/控制器名/操作名+模板文件后缀名; $this->display('edit'); 此种方式表示调用此控制器下的edit操作的模板; $this->display(':in