将博客转成pdf
前些天无意间看到了“birdben”的博客,写的比较详细,但是最新的文章更新时间是“2017-05-07”,时间很是久远,本打算有时间认真学习一下博主所写的文章,但是担心网站会因为某些原因停止服务,于是想到将博主写的所有文章爬下来保存成pdf,说干就干!
你们可以点击这里,查看博主的网站。
一、使用到的模块
pdfkit:可以将文本、html、url转成pdf,但是需要安装wkhtmltopdf.exe,并获取它的安装路径
pdfkit是基于wkhtmltopdf的python封装,支持url,本地文件,文本内容转成pdf,最终还是调用wkhtmltopdf的命令
PyPDF2:处理pdf的模块,可读可写可合并
二、思路分析
1、博客url分析
主页url:https://birdben.github.io/
第二页url:https://birdben.github.io/page/2/
最后一页url:https://birdben.github.io/page/14/
某篇文章的url:
查看主页的html
可以看出:该博客网站共有15个主页面,每篇文章的url可以使用 “主页url” + “href” (见上图)
2、整体思路
- 生成所有页面的url列表
- 遍历每个页面的url,在html中匹配出每个文章的href,拼接成每个文章的url
- 利用url生成pdf
- 合并pdf
三、代码过程
1、博客网站共有15个页面,生成这15个页面的url
def geturl():
url = "https://birdben.github.io/archives/"
list = [url]
for i in range(2,15):
str = "%spage/%d/" % (url,i)
list.append(str)
return list
返回的结果:
2、根据已经获得的页面url,读取url,查看html,匹配符合要求的href
def getname(url,):
r = requests.get ( url )
str = "".join(r.text)
pattern = re.compile(r'<a class="archive-article-title" href="(.*)">.*?</a>')
match = pattern.findall(str)
r.close()
return match
结果:
3、拼接url,生成每个文章的url,利用url转成pdf
4、合并pdf
四、最终代码
import requests
import re
import pdfkit
from PyPDF2 import PdfFileReader, PdfFileMerger
import os #获取一个页面所有的 文章全称 用于构建每篇文章的url路径
def getname(url,):
r = requests.get ( url )
str = "".join(r.text)
pattern = re.compile(r'<a class="archive-article-title" href="(.*)">.*?</a>')
match = pattern.findall(str)
r.close()
return match #获取他的所有页面,每个页面会有很多文章
def geturl():
url = "https://birdben.github.io/archives/"
list = [url]
for i in range(2,15):
str = "%spage/%d/" % (url,i)
list.append(str)
return list #将url转换成pdf
def savepdf(url,pdfname):
path_wkthmltopdf = r"C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe"
config = pdfkit.configuration ( wkhtmltopdf=path_wkthmltopdf )
pdfkit.from_url ( url , pdfname , configuration=config ) #爬取所有文章转成pdf
def do():
urllist = geturl()
for url in urllist:
namelist = getname(url)
for blog in namelist:
blogurl = "https://birdben.github.io" + blog
pdfname = r"pdf\%s.pdf" % blog.strip("/").split("/")[-1] #将pdf保存到当前目录下的pdf目录下,需提前创建
print(blogurl,pdfname)
savepdf(blogurl,pdfname) #合并pdf
def mergepdf(tmpdir,mergename): #合并文件存放的路径,合并后的pdf文件名
merger = PdfFileMerger()
listfile = [os.path.join(tmpdir, file) for file in os.listdir(tmpdir)]
for file in listfile:
if file.endswith('.pdf'):
filemsg = PdfFileReader(open(file, 'rb'))
label = file.split('\\')[-1].replace(".pdf", "")
merger.append (filemsg, bookmark=label , import_bookmarks=False)
merger.write(mergename)
merger.close()
以上代码是使用到的所有函数
执行:
if __name__ == '__main__':
do()
#mergepdf("merge",r"merge\docker.pdf") 当do函数执行完后,将需要合并的pdf放到merge目录下(提前创建),再将do注释,再执行mergepdf函数即可
爬取所有文章生成pdf,将生成的pdf放在pdf目录下,需提前创建
将每部分pdf拷贝到另外目录merge下
最终的pdf:
将博客转成pdf的更多相关文章
- 我是如何将博客转成PDF的
前言 只有光头才能变强 之前有读者问过我:"3y你的博客有没有电子版的呀?我想要份电子版的".我说:"没有啊,我没有弄过电子版的,我这边有个文章导航页面,你可以去文章导航 ...
- 将Medium中的博客导出成markdown
Medium(https://medium.com)(需要翻墙访问)是国外非常知名的一个博客平台.上面经常有很多知名的技术大牛在上面发布博客,现在一般国内的搬运的技术文章大多数都是来自于这个平台. M ...
- 爬取王垠的博客并生成pdf
尚未完善,有待改进 #!/usr/bin/env python3 # -*- coding: utf-8 -*- __author__ = 'jiangwenwen' import pdfkit im ...
- ahk打印成pdf记录
软工课程后记: 要求将博客打印成pdf存档.为了偷懒,不想自己点鼠标一个个保存,所以写了一个ahk小程序.博客教程推荐,建议一试,不难.还很方便.我也只学了点点皮毛,满足需求即止. 第一个成功的小例子 ...
- 推荐一款自己的软件作品[豆约翰博客备份专家],新浪博客,QQ空间,CSDN,cnblogs博客备份,导出CHM,PDF(转载)
推荐一款自己的软件作品[豆约翰博客备份专 豆约翰博客备份专家是完全免费,功能强大的博客备份工具,博客电子书(PDF,CHM和TXT)生成工具,博文离线浏览工具,软件界面美观大方,支持多个主流博客网站( ...
- MarkWord - 可发布博客的 Markdown编辑器 代码开源
因为前一段时间看到 NetAnalyzer 在Windows10系统下UI表现惨不忍睹,所以利用一段时间为了学习一下WPF相关的内容,于是停停写写,用了WPF相关的技术,两个星期做了一个Markdow ...
- 利用hexo+github+nodejs搭建自我博客的一天
放一张比较喜欢的背景图镇楼,伪文艺一波.因为刚刚抱着四个快递从公司大门走到宿舍,快递都比我高,坐电梯的时候电梯里面的灯一闪一闪,电梯还摇晃,上演了一波鬼吹灯,惊魂未定... 说正题:我喜欢的博客应该是 ...
- 基于 Hexo + GitHub Pages 搭建个人博客(二)
在 基于 Hexo + GitHub Pages 搭建个人博客(一) 这篇文章中,我们已经知道如何使用 Hexo + GitHub Pages 搭建一个个人博客,GitHub 为我们提供了免费的域名和 ...
- 历时25天,我的博客(www.ityouknow.com)终于又活了过来
时间回到2016年的7月10号,那时候我刚刚开始正式在博客园写博客,博客园的交流氛围很好,但鉴于博客园古老的界面,同时计划创建一个自己独立的博客,毕竟自己的博客怎么折腾都行. 那时候正在研究 Spri ...
随机推荐
- Spring @Scheduled定时任务的fixedRate,fixedDelay,cron的作用和不同
一. 三种定时类型. 1.cron --@Scheduled(cron="0/5 * * * *?") 当时间达到设置的时间会触发事件.上面那个例子会每5秒执行一次. 201 ...
- POJ3259-Wormholes-( spfa || Bellman_Ford )
题意:有n块田,之间有m条无向边表示路径,权值表示走过需要花费的时间.有w对虫洞,虫洞是单向的,表示穿越一定时间到过去,并且回到虫洞指向的点,问一个人有没有可能通过虫洞回到某个起点,并且在从这个起点出 ...
- 20-2 树莓派搭建服务器 Tornado Web服务器
Drive.google.com/drive/folders/1ahbeoEHkjxoo4NV1wReOmpoRWbl448z- 1.Tornado简介 Tornado一款使用 Python 编写的, ...
- Common Substrings POJ - 3415 (后缀自动机)
Common Substrings \[ Time Limit: 5000 ms\quad Memory Limit: 65536 kB \] 题意 给出两个字符串,要求两个字符串公共子串长度不小于 ...
- 解决window.location.href参数太长 post提交数据
前言:一提到页面跳转,最常用的一般就是window.location.href,如果需要带参数,也许可以在后面用?拼上,但这样并不安全,而且有个更严重的问题,这样的拼接是有长度限制的,如果达到好几千个 ...
- random库
伪随机数的原因: random库中函数主要用于产生各种分布的伪随机数序列.random库中的随机函数是按照一定算法模拟产生的,其概率是确定的.可见的,所以被称为伪随机数.而真正意义上的随机数是按照实验 ...
- Install Python3.6 on Amazon Linux/EC2 在Amazon Linux实例中安装使用Python3.6
本文转载自 https://gist.github.com/niranjv/f80fc1f488afc49845e2ff3d5df7f83b 由于Amazon Linux中预装的Python版本为2. ...
- Vue的Key属性,v-for和v-if,v-if/v-show,v-pre不渲染,v-once只渲染一次
key属性为什么要加 key -- api 解释 key的特殊属性主要用在vue的虚拟dom算法,如果不适用key,vue会使用一种最大限度减少动态元素并且尽可能的尝试修复/再利用相同类型元素的算法. ...
- [算法模板]ST表
[算法模板]ST表 ST表和线段树一样,都能解决RMQ问题(范围最值查询-Range Minimum Query). 我们开一个数组数组\(f[maxn][maxn\log_2]\)来储存数据. 定义 ...
- SpringMVC实现文件下载的两种方式及多文件下载
1.传统方法 @RequestMapping("/download") public String download( String fileName ,String filePa ...