上一个博客《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和代码