把知乎丁香医生的文章及回答转pdf

来源:互联网 发布:deepin15 linux 教程 编辑:程序博客网 时间:2024/04/29 12:10
之前爬取了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 pymongoimport os from bson.objectid import ObjectIdimport wkhtmltopdfimport pdfkitimport requestsimport jsonclient=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']=_id                db['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=cid        pdfstr+= 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):        pass    else:        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

原创粉丝点击