原理:
使用Selenium + ChromeDriver打开页面, 拿到html 源码,然后再使用pdfkit生成pdf
概念:
Selenium:Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样
ChromeDriver:它是 google 为网站开发人员提供的自动化测试接口,是 selenium2 和 chrome浏览器 进行通信的桥梁
wkhtmltopdf:它是一个适用于多平台的html到pdf转换的软件
pdfkit:它是wkhtmltopdf的Python封装包
安装(Linux CentOS7)
1、安装wkhtmltopdf
1)在wkhtmltopdf的官网下载安装包
2)上传到linux服务器
scp wkhtmltox-0.12.6-1.centos7.x86_64.rpm [email protected]:~/soft/
3)安装
sudo rpm -ivh wkhtmltox-0.12.6-1.centos7.x86_64.rpm
报错:
错误:依赖检测失败:
xorg-x11-fonts-75dpi 被 wkhtmltox-1:0.12.6-1.centos7.x86_64 需要
安装xorg-x11-fonts-75dpi:
sudo yum install xorg-x11-fonts-75dpi
再次安装:
sudo rpm -ivh wkhtmltox-0.12.6-1.centos7.x86_64.rpm
4)在/usr/local/bin/目录下可以看到安装了wkhtmltoimage 和 wkhtmltopdf
5)测试是否安装成功
wkhtmltopdf http://www.baidu.com ~/test.pdf
执行成功后,打开test.pdf,看到下面效果,说明安装成功
2、安装pdfkit
1)安装Python环境
使用Anconada安装Python环境:
conda create --name python3.6.6 python=3.6.6
进入Python 3.6.6环境(后续所有命令都是在此环境下操作):
source activate python3.6.6
2)安装pdfkit
pip install pdfkit
3)示例
import pdfkit
pdf_options = {
'page-size': 'A4',
}
url = 'https://www.baidu.com/'
pdfkit.from_url(url, 'test.pdf', options=pdf_options)
打开test.pdf看到baidu页面,说明pdfkit安装成功
3、为什么要使用
Selenium + ChromeDriver
以上的方法仅适用于静态页,如果页面是动态加载出来的,使用以上方法会有问题,动态调用后端接口的部分会加载不出来
为了解决这个问题,可以使用Selenium + ChromeDriver打开页面,拿到页面源码,然后再使用pdfkit生成pdf
4、安装
ChromeDriver
ChromeDriver是依赖于Chrome运行的,所以需要先安装Chrome
1)安装Chrome
请自行搜索
2)安装ChromeDriver
ChromeDriver的版本号需要跟Chrome的版本号对应
比如我的Chrome版本号为Google Chrome 86.0.4240.183,那么对应的ChromeDriver版本号也是86
点击进入,查看notes.txt,可以看到这个版本的ChromeDriver对应的Chrome版本号
找到相应的系统版本下载:
scp到服务器:
scp ~/Downloads/chromedriver_linux64.zip [email protected]:~/soft/
解压:
unzip chromedriver_linux64.zip
移动:
sudo mv chromedriver /usr/local/bin/chromedriver
查看chromedriver版本:
chromedriver --version
显示版本:ChromeDriver 86.0.4240.22
5、安装
selenium
pip install selenium
示例
代码示例:
import pdfkit, time, pprint
from selenium import webdriver
options_chrome = webdriver.ChromeOptions()
# 以最高权限运行
options_chrome.add_argument('--no-sandbox')
# 浏览器不提供可视化页面,linux下如果系统不支持可视化不加这条会启动失败
options_chrome.add_argument('--headless')
# executable_path为chromedriver的位置
driver = webdriver.Chrome(executable_path='/usr/local/bin/chromedriver', chrome_options=options_chrome)
# 浏览器全屏
driver.fullscreen_window()
url = 'http://www.tn666.com/test?id=1'
driver.get(url)
# sleep 1秒
time.sleep(1)
source_text = driver.page_source
options_pdf = {
'page-size': 'A4'
}
result = pdfkit.from_string(source_text, 'test.pdf', options=options_pdf)
driver.quit()
请将url转换为您想转为pdf的url
更多内容,请扫码关注~