zoukankan      html  css  js  c++  java
  • 爬取博主的所有文章并保存为PDF文件

    继续改进上一个项目,上次我们爬取了所有文章,但是保存为TXT文件,查看不方便,而且还无法保存文章中的代码和图片。

    所以这次保存为PDF文件,方便查看。

    需要的工具:

    1、wkhtmltopdf安装包,下载并安装到电脑上,可使用  pip安装  ,注意环境变量的配置。具体参见下面的资料。

    2、pdfkit文件(whl文件),下载并安装到pycharm上。

    注意安装 whl 文件时:最好吧把 保存 whl文件的文件夹的路径  D:learning pythonScripts  添加到环境变量里面,然后在此文件夹下打开cmd,直接 pip install XXX.whl  即可。

    调用顺序:程序代码会使用pdfkit,pdfkit会调用wkhtmltopdf,而wkhtmltopdf会调用windows中的wkhtmltopdf.exe来转化html为pdf。

    1、在我们原理项目的基础上,修改 get_body 方法,直接返回str(div),而不是div.text。

    def get_body(url):
        """
        获取url下文章的正文内容
        :param url:
        :return:
        """
        html_page = get_html(url)
        soup = BeautifulSoup(html_page,'html.parser')   #HTML文档解析器
        div = soup.find(id = "cnblogs_post_body")
        return str(div)

    2、然后就是主要的下载方法了:

    和之前一样,先创建一个文件夹,然后吧PDF文件下载到刚刚创建的文件夹下面。

    def save_single_file_to_PDF(url):
        """
        首先在py文件同目录下创建一个以博主名字为名的文件,用来存放爬取的所有文章
        将文章正文保存在txt文件中,名字为文章标题
        有些文章的标题可能不适合直接作为txt文件名,我们可以忽略这些文章
        :param url:
        :return:
        """
        global article_count    #使用全局变量,需要在函数中进行标识
        title = get_title(url)
        body = get_body(url)
    
        #获取当前目录文件,截取目录后,并自动创建文件
        FILE_PATH = os.getcwd()[:-0]+author
        if not os.path.exists(FILE_PATH):
            os.makedirs(FILE_PATH)
    
        options = {
            'page-size':'Letter',
            'encoding':"UTF-8",
            'custom-header':[('Accept-Encoding','gzip')]
        }
    
        try:
            filename = title + '.pdf'
    
            # 由于wkhtmltopdf软件的版本问题,只能手动设置软件目录,不然无法调用该软件。
            config = pdfkit.configuration(wkhtmltopdf=r"D:learning pythonwkhtmltopdfinwkhtmltopdf.exe")
            #输出PDF文件
            pdfkit.from_string(body, 'D:learning pythoncoding_python3.6cnblog\Andrew\'+filename, options=options, configuration=config)
    
            article_count += 1  # 计数变量加1,统计总的下载文件数
            print(filename + "  file have saved...")     #提示文章下载完毕
    
        except:
            pass

    但是需要注意的是:如果以上步骤有缺失,可能碰到的问题是:

    1.关于no such file or directory:b'' 这种错误在python中出现时,意味着有.exe文件需要被调用,

    而该.exe文件没有被安装或者在控制面板的环境变量中没有添加该.exe的路径。另外,有时候需要改pdfkit代码为下列两句,才可消除错误:

            # 由于wkhtmltopdf软件的版本问题,只能手动设置软件目录,不然无法调用该软件。
            config = pdfkit.configuration(wkhtmltopdf=r"D:learning pythonwkhtmltopdfinwkhtmltopdf.exe")
            #输出PDF文件
            pdfkit.from_string(body, 'D:learning pythoncoding_python3.6cnblog\Andrew\'+filename, options=options, configuration=config)

    运行结果:

    项目完整代码:我的码云

    参考资料:

    项目启发:http://www.cnblogs.com/xingzhui/p/7887212.html

    pdfkit安装:https://blog.csdn.net/appleyuchi/article/details/70947138

  • 相关阅读:
    PKI的签密体制学习(含信息安全基础)
    Linux软件安装
    Linux基础
    JSP EL表达式入门1
    Tomcat 错误: 代理抛出异常错误: java.rmi.server.ExportException: Port already in use: 1099 解决方法
    JSP JSTL入门
    JSP组件
    JSP动作
    实现序列化的java类中的serialVersionUID的作用
    [Noip2016]蚯蚓
  • 原文地址:https://www.cnblogs.com/qsyll0916/p/8678924.html
Copyright © 2011-2022 走看看