zoukankan      html  css  js  c++  java
  • 将博客转成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 Fileswkhtmltopdfinwkhtmltopdf.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"mergedocker.pdf")   当do函数执行完后,将需要合并的pdf放到merge目录下(提前创建),再将do注释,再执行mergepdf函数即可
    

      爬取所有文章生成pdf,将生成的pdf放在pdf目录下,需提前创建

    将每部分pdf拷贝到另外目录merge下

    最终的pdf:

  • 相关阅读:
    Ynoi 杂题选做
    CSP-S2021 浙江 游记
    P6272 [湖北省队互测2014]没有人的算术
    P5206 [WC2019]数树
    P5405 [CTS2019]氪金手游
    LOJ6679 Unknow
    LOJ3040 「JOISC 2019 Day4」合并
    P6122 [NEERC2016]Mole Tunnels
    三维凸包
    三,四元环计数
  • 原文地址:https://www.cnblogs.com/zqj-blog/p/10602702.html
Copyright © 2011-2022 走看看