项目有个需求是做分享图,第一时间想到的是网页截屏实现
以前是用wkhtmltoimage,但是1是得写原生html,css上又限制太多,为了一张图耗时一整天去调试
想弄个一劳永逸的方法,于是让GPT4帮我写了两个程序
首先是用的selenium库实现,但是有2个问题始终不好解决
- 我们需要整个页面截屏,页面如果过长它就只能截半屏(控制滚动条不是截上半就是截下半)
- vue写的页面,无法等到api请求就截屏了,这是最致命的伤
于是更换pyppeteer库. 这里有个坑,linux系统下,需要装pyppeteer2,用法一样但是它更支持linux系统
import asyncio
import sys
from pyppeteer import launch
url = sys.argv[1]
path = sys.argv[2]
async def screenshot(url):
browser = await launch(headless=True, args=['--no-sandbox'])
page = await browser.newPage()
await page.goto(url, waitUntil='networkidle0')
await page.screenshot({'path': path, 'fullPage': True})
await browser.close()
asyncio.get_event_loop().run_until_complete(screenshot(url))
--no-sandbox是为了可以root用户执行,这点谨慎,上线时记得去掉
headless=True是无头模式,无图形化的系统必须加这个
await page.goto(url, waitUntil='networkidle0') 这个很重要!!他可以让你页面的api顺利的执行完并渲染页面后,再截屏.为了这一段代码我问了GPT好久才问出来,可能是我prompt功力还不够吧= =
至此有了初步程序,改一改符合上线规范就能用了
还有个坑一定注意,url不能是python脚本同级的页面.比如页面链接是www.exam.com/page,页面解析至/usr/local/html/page/index.html,然后python脚本在/usr/local/html目录,那怎么都会报错,这个也是坑拖了我很久才解决
希望各位少踩点坑