赞
踩
通过Python,Node等服务端程序对现有网站或者HTML文件在不打开浏览器窗口的情况下进行截图,可以很方便的实现某些需求。如
等等需求还有很多。下面介绍集中常用的方法。
这个是百度出来最常见的方案,通过下载wkhtmltopdf/wkhtmltoimg工具,然后在python中进行跨进程调用,实现截图和保存为PDF,首先我们需要先上其官网下载Driver文件,其实就是一个Headless无窗口的虚拟浏览器,其内核为QtWebKit,类似早期苹果手机的Sarfari,对HTML5的支持较差
其官网为:https://wkhtmltopdf.org/downloads.html 支持Linux和Windows服务器,并且支持多种CPU的架构
- import imgkit
- import pdfkit
-
- if __name__ == '__main__':
- path_wkimg = r'C:\Program Files\wkhtmltopdf\bin\wkhtmltoimage.exe' # 工具路径,需要替换为服务器的真实路径
- cfg = imgkit.config(wkhtmltoimage=path_wkimg)
- options = {
- 'javascript-delay': '2000',
- 'height': '1500',
- 'width': '2000'
- }
- # 1、将html文件转为图片
- imgkit.from_file(r'F:/map.html', 'map.jpg', config=cfg, options=options)
- # 2、从url获取html,再转为图片
- imgkit.from_url('https://html5test.com/', 'h5.jpg', config=cfg, options=options)
- # 3、将字符串转为图片
- imgkit.from_string('<h1>Hello!</h1>', 'hello.jpg', config=cfg)
javascript-delay是等待js执行的时间,而不是等HTML都加载完直接截图,根据实际页面渲染时间来定
height和width是浏览器窗口的大小,可以超过显示器的实际大小(服务器上没有浏览器也无所谓),所以如果要截取整个页面,需要把height设置到和预估的网页高度一样。
如果不设置height,可以自动截取到页面底端,但是往往测算的会有问题,远远超出实际的大小,后文会有详细的测试
- import pdfkit
-
- if __name__ == '__main__':
- cfg = imgkit.config(wkhtmltoimage=path_wkimg)
- options_pdf = {
- 'javascript-delay': '15000',
- 'margin-bottom': '20mm',
- 'footer-line': None
- }
- path_wkpdf = r'C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe' # 替换为服务器的真实路径
- config = pdfkit.configuration(wkhtmltopdf=path_wkpdf)
- url = 'https://html5test.com'
- pdfkit.from_url(url, 'h5.pdf', configuration=config, options=options_pdf)
- pdfkit.from_file('C:/echats.html', options=options_pdf,configuration=config,output_path='echarts.pdf')
-
selenium是很火的Python前端自动化测试框架,通过指定chrome浏览器的Driver,可以在有窗口或Headless的情况下进行截图,但是无法转换为PDF,也无法自动截取全高度网页,必须指定窗口大小
有点是ChromeDriver可以在Headless或窗口模式下执行,只需要指定--headless参数即可。这样就可以在程序执行的时候观察实际效果。并且selenium还可以在页面上执行自定义js代码,用来滚动屏幕,非常好用
下载ChromeDriver的地址是:https://sites.google.com/chromium.org/driver/downloads?authuser=0
- from selenium import webdriver
- from selenium.common.exceptions import WebDriverException
-
- if __name__ == '__main__':
- options = webdriver.ChromeOptions()
- options.add_argument('--headless')
- options.add_argument('--disable-gpu')
- options.add_argument('--no-sandbox')
- options.add_argument('window-size=1920x1080')
-
-
- try:
- driver = webdriver.Chrome(executable_path='chromedriver_win32/chromedriver.exe', options=options)
- # driver.get("file:///C:/map.html")
- driver.get('https://echarts.apache.org/examples/zh/editor.html?c=graph')
- driver.execute_scri
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。