天善博客内容如何转成PDF文档?附Seng的Blog的PDF文档

浏览: 4286

上一个博客《Python网络数据采集》读后总结 --第4-6章  提到了访问pdf的方法,我就在想是否能将天善博客内容转成PDF文档,这个功能应该很有用,可以方便查找啊。

找了一下,发现有一个命令行工具:wkhtmltopdf,可以将html 转成 PDF。

而且Python也有个包python-pdfkit,方便了wkhtmltopdf和Python的结合。

但是目前读取的页面数有限制,需要合并,可以使用http://www.pdfmerge.com/实现,而且这个也提供了html to pdf的线上工具。http://www.htmlpdf.com/

接下来具体介绍一下做法。

1.wkhtmltopdf功能简介:

下载页面:http://wkhtmltopdf.org/downloads.html

 使用0.12.3 Linux版下载后直接解压即可。

 tar -xvf wkhtmltox-0.13.0-alpha-7b36694_linux-centos6-amd64.rpm.part
 sudo ln -s ./wkhtmltox/bin/wkhtmltopdf /usr/bin/wkhtmltopdf

使用示例如下:

wkhtmltopdf  'http://www.flybi.net/blog/seng/3645' 'http://www.flybi.net/blog/seng/3599'  sengblog.pdf

注意:天善使用的javascript,好像对这个有影响,只能生成一个页面,要等javascript运行完,加参数即可--javascript-delay 2000,或者屏蔽掉也可以--disable-javascript

wkhtmltopdf  --javascript-delay 2000 'http://www.flybi.net/blog/seng/3645' 'http://www.flybi.net/blog/seng/3599'  sengblog.pdf

如果出问题,可以看一下大纲的信息:

wkhtmltopdf  --dump-outline out.xsl  toc 'http://www.flybi.net/blog/seng/3645' 'http://www.flybi.net/blog/seng/3599'  sengblog.pdf

2.pdfkit调用的接口

参考网站:https://pypi.python.org/pypi/pdfkit

Install python-pdfkit:
$ pip install pdfkit
简单的示例:
import pdfkit
pdfkit.from_url([ 'http://www.flybi.net/blog/seng/3645','http://www.flybi.net/blog/seng/3599'], 'sengblog.pdf')  

3.生成Seng的blog的PDF文件

我的首页:

http://www.flybi.net/people/seng

我的博客就5页,获取这些链接就可以了

http://www.flybi.net/blog/id-seng__page-1

核心逻辑如下:

(1)获取所有blog具体页面的URL

(2)排序:暂时偷个懒,先按默认字符排序了

(3)生成pdf文档,注意目前测试只能包含有限的页面,目前使用20个,按类似以下格式sengblog20160419_1_20生成

(4)合并pdf文档,目前没有现成代码,使用http://www.pdfmerge.com/手工做了。

4.代码

2016-04-22程序更新了一版,原来取中文id有问题,目前还没完全解决(手工给一个值),正在测试如何合并pdf, 测试完一起更新。

#-*- coding: utf-8 -*-
#2-crawlAllBlogs.py
from urllib.request import urlopen
from bs4 import BeautifulSoup
import re

userid='华青莲' #需要修改,自己的id
userid_encode = "%E5%8D%8E%E9%9D%92%E8%8E%B2"
pdfname_pre = userid + '20160421'
blognumber=5 #注意修改,看一下自己的网页 如 http://www.flybi.net/people/seng
pages = set()
loop_cur=1
loop_max=10000

def getLinks(pageUrl):
global pages,loop_cur,loop_max,userid
urllink = "http://www.flybi.net/people/blogs/" + userid_encode
# urllink = "http://www.flybi.net/blog/" + userid + "" + pageUrl
print(urllink)
html = urlopen(urllink)
bsObj = BeautifulSoup(html,"html.parser")

# for link in bsObj.findAll("a", href=re.compile("\/blog\/" + userid + "\/[0-9]+")) :
for link in bsObj.findAll("a", href=re.compile("\/blog\/[A-Za-z0-9]+\/[0-9]+")) :
loop_cur = loop_cur + 1
if 'href' in link.attrs and loop_cur < loop_max:
if link.attrs['href'] not in pages:
#We have encountered a new page
newPage = "http://www.flybi.net" + link.attrs['href']
pages.add(newPage)
#getLinks(newPage)

#1.获取所有blog link
#for i in range(1, 5):
getLinks(str(i) )

#2.html to pdf
import pdfkit

#参数 见http://wkhtmltopdf.org/usage/wkhtmltopdf.txt
options = {
# 'disable-javascript': '',
'outline-depth': '1',
'javascript-delay': '3000',
'load-error-handling': 'skip'
}

bloglist = list(pages)
bloglist.sort()

#add First Page
bloglist.insert(0,'http://www.flybi.net/people/' + userid_encode)
bloglist.insert(0,'http://www.flybi.net/people/' + userid_encode) #简化后面程序,偷懒了

print(bloglist)
page_per_pdf =20
#注意有utf 8 转换错误,先屏蔽掉,有空再看
for i in range(1, int(len(bloglist)/page_per_pdf)):
pdfname = pdfname_pre + str((i-1)* page_per_pdf +1) + '_' + str(i*page_per_pdf) + '.pdf'
try:
pdfkit.from_url(bloglist[(i-1)* page_per_pdf + 1:i*page_per_pdf], pdfname, options=options)
except IOError:
print("IO error!")
except :
print("other error!")

#last pdf
i = i +1
pdfname = pdfname_pre + str((i-1)* page_per_pdf +1) + '_' + str(i*page_per_pdf) + '.pdf'
try:
pdfkit.from_url(bloglist[(i-1)* page_per_pdf + 1:], pdfname, options=options)
except IOError:
print("IO error!")
except :
print("other error!")

 5.附件

pdf和代码

推荐 7
本文由 seng 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

6 个评论

越来越高级
seng总出品,精品啊
seng总这个系列都是实操型的
2016-04-22代码更新了一版,原来取中文id有问题,目前还没完全解决(手工给一个值先过了),完全修正等如何合并pdf一起完成后一起更新。
好先进,网络爬虫一直也想学python,可惜编程底子弱,一直没学成,好像好多现成封装好的包可以调用很方便
python就是package多,如果只是做数据分析,编程要求也不多的。 我也不是程序员出来的,大家一起学啊。

要回复文章请先登录注册