当前位置:   article > 正文

python实现网页/HTML截图并转PDF_python 在不打开本地html的情况下获取到相关内容并生成截图

python 在不打开本地html的情况下获取到相关内容并生成截图

通过Python,Node等服务端程序对现有网站或者HTML文件在不打开浏览器窗口的情况下进行截图,可以很方便的实现某些需求。如

  • 实现办公自动化,将数据制作成<tr><td>表格或者图表后截图保存为PDF或图片,发送到通讯软件中
  • GEO程序的开发,可以把地图和上面的自定义标记截图下来,以图片形式嵌入到自己应用中,这样就不需要集成地图SDK了
  • 网站的定期自动化快照,可以保留网站变化历史
  • 增强对浏览器和移动端的支持,对于无法渲染HTML5的浏览器,可以直接以图片代替

等等需求还有很多。下面介绍集中常用的方法。

方案一:Python+wkhtmltopdf

这个是百度出来最常见的方案,通过下载wkhtmltopdf/wkhtmltoimg工具,然后在python中进行跨进程调用,实现截图和保存为PDF,首先我们需要先上其官网下载Driver文件,其实就是一个Headless无窗口的虚拟浏览器,其内核为QtWebKit,类似早期苹果手机的Sarfari,对HTML5的支持较差

其官网为:https://wkhtmltopdf.org/downloads.html 支持Linux和Windows服务器,并且支持多种CPU的架构

1、保存为图片

  1. import imgkit
  2. import pdfkit
  3. if __name__ == '__main__':
  4. path_wkimg = r'C:\Program Files\wkhtmltopdf\bin\wkhtmltoimage.exe' # 工具路径,需要替换为服务器的真实路径
  5. cfg = imgkit.config(wkhtmltoimage=path_wkimg)
  6. options = {
  7. 'javascript-delay': '2000',
  8. 'height': '1500',
  9. 'width': '2000'
  10. }
  11. # 1、将html文件转为图片
  12. imgkit.from_file(r'F:/map.html', 'map.jpg', config=cfg, options=options)
  13. # 2、从url获取html,再转为图片
  14. imgkit.from_url('https://html5test.com/', 'h5.jpg', config=cfg, options=options)
  15. # 3、将字符串转为图片
  16. imgkit.from_string('<h1>Hello!</h1>', 'hello.jpg', config=cfg)

javascript-delay是等待js执行的时间,而不是等HTML都加载完直接截图,根据实际页面渲染时间来定

height和width是浏览器窗口的大小,可以超过显示器的实际大小(服务器上没有浏览器也无所谓),所以如果要截取整个页面,需要把height设置到和预估的网页高度一样。

如果不设置height,可以自动截取到页面底端,但是往往测算的会有问题,远远超出实际的大小,后文会有详细的测试

 

2、保存为PDF

  1. import pdfkit
  2. if __name__ == '__main__':
  3. cfg = imgkit.config(wkhtmltoimage=path_wkimg)
  4. options_pdf = {
  5. 'javascript-delay': '15000',
  6. 'margin-bottom': '20mm',
  7. 'footer-line': None
  8. }
  9. path_wkpdf = r'C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe' # 替换为服务器的真实路径
  10. config = pdfkit.configuration(wkhtmltopdf=path_wkpdf)
  11. url = 'https://html5test.com'
  12. pdfkit.from_url(url, 'h5.pdf', configuration=config, options=options_pdf)
  13. pdfkit.from_file('C:/echats.html', options=options_pdf,configuration=config,output_path='echarts.pdf')

方案二:Python+selenium

selenium是很火的Python前端自动化测试框架,通过指定chrome浏览器的Driver,可以在有窗口或Headless的情况下进行截图,但是无法转换为PDF,也无法自动截取全高度网页,必须指定窗口大小

有点是ChromeDriver可以在Headless或窗口模式下执行,只需要指定--headless参数即可。这样就可以在程序执行的时候观察实际效果。并且selenium还可以在页面上执行自定义js代码,用来滚动屏幕,非常好用

下载ChromeDriver的地址是:https://sites.google.com/chromium.org/driver/downloads?authuser=0

  1. from selenium import webdriver
  2. from selenium.common.exceptions import WebDriverException
  3. if __name__ == '__main__':
  4. options = webdriver.ChromeOptions()
  5. options.add_argument('--headless')
  6. options.add_argument('--disable-gpu')
  7. options.add_argument('--no-sandbox')
  8. options.add_argument('window-size=1920x1080')
  9. try:
  10. driver = webdriver.Chrome(executable_path='chromedriver_win32/chromedriver.exe', options=options)
  11. # driver.get("file:///C:/map.html")
  12. driver.get('https://echarts.apache.org/examples/zh/editor.html?c=graph')
  13. driver.execute_scri
本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号