之前爬取了1800多万的知乎用户,因而想生成pdf方便保存和阅读,正好试试wkhtmltopdf+pdfkit。
1:pdfkit是wkhtmltopdf的python封装,因此需要先下载安装wkhtmltopdf,版本wkhtmltopdf-0.12.2.4_mingw-w64,下载地址http://download.csdn.net/download/cainiaowuzui/10024376%20%E2%80%9Cwkhtmltopdf-0.12.2.4_mingw-w64%E2%80%9D
2:使用pip install pdfkit安装pdfkit(版本0.6.1)
这里我选择把丁香医生的文章+回答按获赞数从高到低排序生成pdf。
pdfkit默认是生成带目录书签的pdf.由于内容存储在mongo数据库中,因此我先从mongo数据库中选取出来再通过pdfkit.from_string()生成pdf。
主要知识点:python,pdfkit,mongo,html,知乎爬取
过程中遇到以下问题:1. 中文乱码,参数中须指定编码options={'encoding': 'utf-8'}2. pdf目录无法自动生成,经过试验,采用把字符串补成html格式的字符串,且输出文件指定为out.pdf,可以解决问题。3. 个别回答数据库中没有对应的提问标题,因此去知乎爬取对应的提问,有兴趣爬取知乎的朋友可以参考。
import pymongo
import os
from bson.objectid import ObjectId
import wkhtmltopdf
import pdfkit
import requests
import json
client=pymongo.MongoClient(host="127.0.0.1")
db=client["zhihu"]
wkhtmltopdf_path='F:\\Program Files\\wkhtmltopdf\\bin\\wkhtmltopdf.exe'#wkhtmltopdf的安装目录
def printpdf(url_token):cursor=db['article'].find({"url_token":url_token})article=list(cursor)article.sort(key=lambda k :k["voteup_count"],reverse=True)#按文章获赞的总数排序formatstr='''<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="zh-CN" class=" no-touch"><head><meta charset="utf-8" /><title>{title}</title>
</head><body><h1 align='center'>{title}</h1>{content}</body></html>'''#补成html格式的字符串pdfstr=''for art in article:pdfstr+=formatstr.format(title=art['title'],content=art['content'])cursor=db['answer'].find({"url_token":url_token})article=list(cursor)article.sort(key=lambda k :k["voteup_count"],reverse=True)headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36','authorization':'这里填你的知乎令牌'}    for art in article:question_id=art["question_id"]cid=str(question_id)_id = ObjectId(bytes(cid.ljust(12),encoding='utf-8'))question=db['question'].find_one({"_id":_id})#通过问题id找问题的标题if question:title=question["title"]else:#如果在question表中找不到相应的question,那么去知乎网址爬取,嗯由于不多,这里仅仅单线程print("can not find question :%d,now try to get" % question_id)url='https://www.zhihu.com/api/v4/questions/{id}'.format(id=question_id)r=requests.get(url=url,headers=headers)try:results = json.loads(r.text)results['url_token']=''results['_id']=_iddb['question'].update({'_id': _id}, {'$set': results}, True)#保存到mongo数据库title=results['title']print("save question %d ok" % question_id)except Exception as e:print(e)            title=cidpdfstr+= formatstr.format(title=title,content=art['content'])pdfstr.replace('\"','"')print("prepare to pdf")filetree="G:\\ebook\\zhihu\\article\\"+url_token+"\\"if os.path.exists(filetree):passelse:os.mkdir(filetree)   file=filetree+"out.pdf" #多次测试,如不指定为out.pdf不会生成pdf目录,原因不清楚,如有朋友知道麻烦告知options={'encoding': 'utf-8', 'outline-depth': 1}#指定utf-8编码,防止中文乱码config = pdfkit.configuration(wkhtmltopdf=wkhtmltopdf_path)pdfkit.from_string(pdfstr,file,options=options,configuration=config)

最后,上一张效果图

最后附上wkhtmltopdf的中文参数详解
wkhtmltopdf [OPTIONS]… [More input files]
常规选项
–allow 允许加载从指定的文件夹中的文件或文件(可重复)
–book* 设置一会打印一本书的时候,通常设置的选项
–collate 打印多份副本时整理
–cookie 设置一个额外的cookie(可重复)
–cookie-jar 读取和写入的Cookie,并在提供的cookie jar文件
–copies 复印打印成pdf文件数(默认为1)
–cover* 使用HTML文件作为封面。它会带页眉和页脚的TOC之前插入
–custom-header 设置一个附加的HTTP头(可重复)
–debug-javascript 显示的javascript调试输出
–default-header* 添加一个缺省的头部,与页面的左边的名称,页面数到右边,例如: –header-left ‘[webpage]’ –header-right ‘[page]/[toPage]’ –header-line
–disable-external-links* 禁止生成链接到远程网页
–disable-internal-links* 禁止使用本地链接
–disable-javascript 禁止让网页执行JavaScript
–disable-pdf-compression* 禁止在PDF对象使用无损压缩
–disable-smart-shrinking* 禁止使用WebKit的智能战略收缩,使像素/ DPI比没有不变
–disallow-local-file-access 禁止允许转换的本地文件读取其他本地文件,除非explecitily允许用 –allow
–dpi 显式更改DPI(这对基于X11的系统没有任何影响)
–enable-plugins 启用已安装的插件(如Flash
–encoding 设置默认的文字编码
–extended-help 显示更广泛的帮助,详细介绍了不常见的命令开关
–forms* 打开HTML表单字段转换为PDF表单域
–grayscale PDF格式将在灰阶产生
–help Display help
–htmldoc 输出程序HTML帮助
–ignore-load-errors 忽略claimes加载过程中已经遇到了一个错误页面
–lowquality 产生低品质的PDF/ PS。有用缩小结果文档的空间
–manpage 输出程序手册页
–margin-bottom 设置页面下边距 (default 10mm)
–margin-left 将左边页边距 (default 10mm)
–margin-right 设置页面右边距 (default 10mm)
–margin-top 设置页面上边距 (default 10mm)
–minimum-font-size 最小字体大小 (default 5)
–no-background 不打印背景
–orientation 设置方向为横向或纵向
–page-height 页面高度 (default unit millimeter)
–page-offset* 设置起始页码 (default 1)
–page-size 设置纸张大小: A4, Letter, etc.
–page-width 页面宽度 (default unit millimeter)
–password HTTP验证密码
–post Add an additional post field (repeatable)
–post-file Post an aditional file (repeatable)
–print-media-type* 使用的打印介质类型,而不是屏幕
–proxy 使用代理
–quiet Be less verbose
–read-args-from-stdin 读取标准输入的命令行参数
–readme 输出程序自述
–redirect-delay 等待几毫秒为JS-重定向(default 200)
–replace* 替换名称,值的页眉和页脚(可重复)
–stop-slow-scripts 停止运行缓慢的JavaScripts
–title 生成的PDF文件的标题(第一个文档的标题使用,如果没有指定)
–toc* 插入的内容的表中的文件的开头
–use-xserver* 使用X服务器(一些插件和其他的东西没有X11可能无法正常工作)
–user-style-sheet 指定用户的样式表,加载在每一页中
–username HTTP认证的用户名
–version 输出版本信息退出
–zoom 使用这个缩放因子 (default 1)

页眉和页脚选项
–header-center* (设置在中心位置的页眉内容)
–header-font-name* (default Arial) (设置页眉的字体名称)
–header-font-size* (设置页眉的字体大小)
–header-html* (添加一个HTML页眉,后面是网址)
–header-left* (左对齐的页眉文本)
–header-line* (显示一条线在页眉下)
–header-right* (右对齐页眉文本)
–header-spacing* (设置页眉和内容的距离,默认0)
–footer-center* (设置在中心位置的页脚内容)
–footer-font-name* (设置页脚的字体名称)
–footer-font-size* (设置页脚的字体大小default 11)
–footer-html* (添加一个HTML页脚,后面是网址)
–footer-left* (左对齐的页脚文本)
–footer-line* 显示一条线在页脚内容上)
–footer-right* (右对齐页脚文本)
–footer-spacing* (设置页脚和内容的距离)
./wkhtmltopdf –footer-right ‘[page]/[topage]’ http://www.baidu.com baidu.pdf
./wkhtmltopdf –header-center ‘报表’ –header-line –margin-top 2cm –header-line http://192.168.212.139/oma/ oma.pdf
表内容选项中
–toc-depth* Set the depth of the toc (default 3)
–toc-disable-back-links* Do not link from section header to toc
–toc-disable-links* Do not link from toc to sections
–toc-font-name* Set the font used for the toc (default Arial)
–toc-header-font-name* The font of the toc header (if unset use –toc-font-name)
–toc-header-font-size* The font size of the toc header (default 15)
–toc-header-text* The header text of the toc (default Table Of Contents)
–toc-l1-font-size* Set the font size on level 1 of the toc (default 12)
–toc-l1-indentation* Set indentation on level 1 of the toc (default 0)
–toc-l2-font-size* Set the font size on level 2 of the toc (default 10)
–toc-l2-indentation* Set indentation on level 2 of the toc (default 20)
–toc-l3-font-size* Set the font size on level 3 of the toc (default 8)
–toc-l3-indentation* Set indentation on level 3 of the toc (default 40)
–toc-l4-font-size* Set the font size on level 4 of the toc (default 6)
–toc-l4-indentation* Set indentation on level 4 of the toc (default 60)
–toc-l5-font-size* Set the font size on level 5 of the toc (default 4)
–toc-l5-indentation* Set indentation on level 5 of the toc (default 80)
–toc-l6-font-size* Set the font size on level 6 of the toc (default 2)
–toc-l6-indentation* Set indentation on level 6 of the toc (default 100)
–toc-l7-font-size* Set the font size on level 7 of the toc (default 0)
–toc-l7-indentation* Set indentation on level 7 of the toc (default 120)
–toc-no-dots* Do not use dots, in the toc
轮廓选项
–dump-outline 转储目录到一个文件
–outline 显示目录(文章中h1,h2来定)
–outline-depth 设置目录的深度(默认为4)
页脚和页眉
* [page] 由当前正在打印的页的数目代替
* [frompage] 由要打印的第一页的数量取代
* [topage] 由最后一页要打印的数量取代
* [webpage] 通过正在打印的页面的URL替换
* [section] 由当前节的名称替换
* [subsection] 由当前小节的名称替换
* [date] 由当前日期系统的本地格式取代
* [time] 由当前时间,系统的本地格式取代
./wkhtmltopdf –footer-right ‘[page]/[topage]’ http://www.baidu.com baidu.pdf
./wkhtmltopdf –header-center ‘报表’ –outline –header-line –margin-top 2cm –header-line http://www.hao123.com/ hao123.pdf
./wkhtmltopdf –header-left ‘[webpage]’ –footer-center ‘测试([page]/[toPage])’ http://www.baidu.com baidu.pdf

把知乎丁香医生的文章及回答转pdf相关推荐

  1. 丁香医生APP被App Store拒绝更新:违反苹果内购系统规定

    5月25日消息,苹果App Store以其构建戒备森严的生态圈,在安全系数上比其他应用商城要高出不少.苹果也因这个封闭生态,躺着赚了不少钱. 这因为苹果要求登陆App Store的APP,都要经过苹果 ...

  2. 利用python爬取丁香医生上新型肺炎数据,并下载到本地,附带经纬度信息

    新增:国外疫情网站介绍 已更新:爬取国外疫情数据 已更新:新型肺炎历史数据下载 2020年3月27日补充: 制作了一个全球肺炎数据查询下载网站,效果如下: 访问地址:http://119.3.227. ...

  3. python爬取电脑本地数据_利用python爬取丁香医生上新型肺炎数据,并下载到本地,附带经纬度信息...

    原标题:利用python爬取丁香医生上新型肺炎数据,并下载到本地,附带经纬度信息 新型肺炎肆虐全国,可以预知,最近一两年地理学中会有一部分论文研究新型肺炎的空间分布及与其他指标的关联分析.获取其患病人 ...

  4. 近视手术能不能做?怎么做?丁香医生告诉你

    这些年,做近视手术的人是越来越多了.我们后台也每天有读者留言催近视手术科普. 文章主要是介绍几种常见的近视手术方案,帮你判断自己适合的手术类型. 1.近视手术,不是人人都能做 近视手术作为一种「手术」 ...

  5. 医疗产品取经: “丁香医生”交互原型模板免费分享

    医疗类产品,虽然相比其他生活类产品,在用户使用上比较低频,但本身医疗产品对整个医疗行业的创新价值却不容小觑.可以想见,当人们可以在线上完成一系列关于预约.医生咨询.付费.排号等行为时,就医体验会得到多 ...

  6. ReactNative 在丁香医生项目中引入的踩坑日记

    ReactNative 在丁香医生项目中引入的踩坑日记 this没绑定到函数导致空指针 参考 React-Native 踩坑第二弹-undefined is not a function(evalua ...

  7. 知乎python练手的_Python—爬虫之初级实战项目:爬取知乎任一作者的文章练手

    爬虫之初级实战项目:爬取知乎任一作者的文章练手 在正式上代码之前,先过一遍之前所学知识的框架内容,温故而知新!!! 接下来我们直接上代码,一定要手敲代码.手敲代码.手敲代码!!! import req ...

  8. 【报告分享】代餐行业营销洞察报告-丁香医生(附下载)

    摘要:基于全网消费大数据和深度用户调研结果,解析代餐市场情况和消费趋势. 来源:丁香医生 如需查看完整报告和报告下载或了解更多,微信公众号:行业报告智库

  9. 工作积累⑨——从丁香医生增长看地推的重要性

    工作总结系列目录: 工作总结③--数据分析师到底该如何分析? 工作积累⑥--从留存下降看小红书的精细化运营 工作积累⑦--从新零售和漏斗模型解读亚马逊增长策略 工作积累⑧--从星巴克送外卖看新零售的线 ...

最新文章

  1. Python入门篇-数据结构堆排序Heap Sort
  2. mysql批量修改字符集
  3. 以太坊钱包1-Android-创建钱包
  4. 大数据实践的 6 个阶段
  5. 看完这篇不要告诉我不会封装ant design弹框组件了
  6. 固件的完整形式是什么?
  7. python3 批量修改文件扩展名——递归
  8. pytorch optim.SGD
  9. Unity 项目 - Ruby‘s Adventure 学习笔记
  10. 图片 和 base64 互转
  11. 数据结构上机实践第四周项目1 - 建立单链表
  12. android中当内容超出一页,滚动条滚动到某一个位置的另一个思路
  13. tensorflow安装中踩到的坑protobuf、h5py、tensorboard、werkzeug
  14. 磊科NBR100企业有线路由器IP和Mac地址绑定教程
  15. cortex系列处理器排行_arm处理器排行_ARM Cortex A系列处理器性能分类比较ARM处理器排名 ZNDS资讯...
  16. “男朋友送了我一瓶才100多块的香水”
  17. AI 人工智能学习路线
  18. 江湖有故人!欢迎来到程序员的江湖
  19. 怎么拼魔方6个面方法_怎样拼魔方,6面的
  20. css立体3d效果动画,css3 实现动画,变换基点及3D效果~

热门文章

  1. SAP EPIC 银企直连 付款接口(建设银行)
  2. 动能芯片 | DP4301—SUB-1G高集成度无线收发芯片
  3. System Analysis and Project Management
  4. 【风电功率预测】基于matlab麻雀算法优化LSSVM风电功率预测(多输入单输出)【含Matlab源码 1718期】
  5. Leetcode岛屿问题系列分析
  6. 对B/S,C/S,RIA的理解
  7. Excel VBA 锁定特定单元格
  8. 北京邮电大学2020-2022年各院研究生分专业报考录取情况
  9. 树莓派 | 01 无显示器安装并通过wifi、ssh无线连接学习教程记录
  10. QQ2009 的溢出漏洞