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
预想效果
实际效果
经过测试await asyncio.sleep(10) # 增加等待时间,等待页面加载完成
可行有效,但是由于多个网站都需要这样操作该如何减少他的等待时间呢,而不是写死时间
不需要 sleep ,await page.goto(url)
优化下:
await page.goto(url, { // timeout: 2 * 1000, waitUntil: ['load', 'domcontentloaded', 'networkidle0']})
具体文档可见:https://pyppeteer.github.io/pyppeteer/reference.html#pyppetee...
这个问题可能是由于在页面完全加载之前就进行了截图,导致截图空白。你可以尝试以下方法来解决这个问题:
page.waitForLoadState()
方法来等待页面加载完成。这个方法会返回一个 Promise,当页面加载状态发生变化时,Promise 会被解析为新的状态。你可以在 waitForLoadState()
的 Promise 上调用 then()
方法,在页面加载完成后执行截图操作。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