[python学习] 模仿浏览器下载CSDN源文并实现PDF格式备份

简介:
        最近突然想给自己的博客备份下,看了两个软件:一个是CSDN博客导出软件,好像现在不能使用了;一个是豆约翰博客备份专家,感觉都太慢,而且不灵活,想单独下一篇文章就比较费时。而且我的毕业论文是基于Python自然语言相关的,所以想结合前面的文章用Python实现简单的功能:
        1.通过网络下载本体的博客,包括图片;
        2.在通过Python把HTML转换成PDF格式;
        3.如果可能,后面可能会写文章对代码采用特定的方式进行处理。

        言归正传,直接上代码通过两个方面进行讲解。

一. 设置消息头下载CSDN文章内容

        获取一篇文章Python的代码如下,如韩寒的新浪博客:(文章最后的总结有我以前关于Python爬虫博文链接介绍)

import urllib
content = urllib.urlopen("http://blog.sina.com.cn/s/blog_4701280b0102eo83.html").read()
open('blog.html','w+').write(content)

        但是很多网站都防止这种获取方式,如CSDN会返回如下html代码:“403 Forbidden错误”:

<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx</center>
</body>
</html>
        此时通过设置消息头或模仿登录,可以伪装成浏览器实现下载。代码如下:
#coding:utf-8
import urllib
import urllib2
import cookielib
import string
import time
import re
import sys

#定义类实现模拟登陆下载HTML
class GetInfoByBrowser:

    #初始化操作
    #常见错误:AttributeError: .. instance has no attribute 'opener' 是双下划线
    def __init__(self):
       socket.setdefaulttimeout(20)
       self.headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:28.0) Gecko/20100101 Firefox/28.0'}
       self.cookie_support = urllib2.HTTPCookieProcessor(cookielib.CookieJar())
       self.opener = urllib2.build_opener(self.cookie_support,urllib2.HTTPHandler)

    #定义函数模拟登陆
    def openurl(self,url):
        urllib2.install_opener(self.opener)
        self.opener.addheaders = [("User-agent",self.headers),("Accept","*/*"),('Referer','http://www.google.com')]
        try:
            result = self.opener.open(url)
            content = result.read()
            open('openurl.html','w+').write(content)
            print content
            print 'Open Succeed!!!'
        except Exception,e:
            print "Exception: ",e
        else:
            return result

    #定义Get请求 添加请求消息头,伪装成浏览器
    def geturl(self,get_url):
        result = ""
        try:
            req = urllib2.Request(url = get_url, headers = self.headers)   
            result = urllib2.urlopen(req).read()
            open('geturl.html','w+').write(result)
            type = sys.getfilesystemencoding()      
            print result.decode("UTF-8").encode(type)  #防止中文乱码
            print 'Get Succeed!!!'
        except Exception,e:
            print "Exception: ",e
        else:
            return result

#调用该类获取HTML
print unicode('调用模拟登陆函数openurl:','utf-8')
print unicode('第一种方法 openurl:','utf-8')
getHtml = GetInfoByBrowser()
getHtml.openurl("http://blog.csdn.net/eastmount/article/details/39770543")

print unicode('第二种方法 geturl:','utf-8')
getHtml.geturl("http://blog.csdn.net/eastmount/article/details/39770543")
        运行效果是下载我的文章“[Python学习] 简单网络爬虫抓取博客文章及思想介绍”,两种方法效果一样,其中本体两个文件geturl.html和openurl.html。该方法运行Python定义类、函数、urllib2和cookielib相关知识。



        相关类似的优秀文章推荐三篇,其中POST方法类似:
        [Python]一起来写一个Python爬虫工具类whyspider——汪海
        用python 写爬虫,去爬csdn的内容,完美解决 403 Forbidden
        urllib2.HTTPError: HTTP Error 403: Forbidden

二. 实现HTML转PDF格式备份文章

         首先声明:这部分代码实现最终以失败告终,以后可能还会继续研究,一方面由于最近太忙;一方面对Linux的欠缺和对Python的掌握不够,但还是想把这部分写出来,感觉还是有些东西的,可能对你也有所帮助!感觉好遗憾啊~

1.转PDF解决方法

        通过网上查阅资料,发现最常见的两种调用Python库转PDF的方法:
        方法一:调用PDF报表类库Reportlab,它是在线网站转PDF
        该库不属于Python的标准类库,所以必须手动下载类库包并安装;同时由于涉及到把图片转换为PDF,所以还需要Python imaging library(PIL)类库。
        参考文章:python实现抓取HTML,取出数据,分析,绘出PDF版图形

        方法二:通过调用xhtml2pdf和pisa库实现HTML转PDF
        该方法可以实现将静态的HTML转换成PDF格式,其中核心代码如下,将本地的"1.html"静态界面转换为"test.pdf",下面我尝试采取的方法也是该方法。
# -*- coding: utf-8 -*- 
import sx.pisa3 as pisa 
data= open('1.htm').read()
result = file('test.pdf', 'wb') 
pdf = pisa.CreatePDF(data, result) 
result.close() 
pisa.startViewer('test.pdf') 
        参考文章:python将html转成PDF的实现代码(包含中文)

        方法三:调用第三方wkhtmltopdf软件实现
        该方法并不像Python调用第三方那样有详细代码,很多文章都是基于输入命令实现。下面三篇文章都是关于wkhtmltopdf的实现。
        参考文章:HTML转换成PDF工具:wkhtmltopdf 
                         [php]将html批量转pdf文件的解决方案,研究有感
                         wkhtmltopdf 生成带封面、页眉、页脚、目录的pdf

2.安装PIP及介绍

        此时准备介绍通过xhtml2pdf和pisa库实现HTML转PDF的功能,首先需要安装PIP软件。正如xifeijian大神所说:“作为Python爱好者,如果不知道easy_install或者pip中的任何一个的话,那么......”。
        easy_insall的作用和perl中的cpan,ruby中的gem类似,都提供了在线一键安装模块的傻瓜方便方式,而pip是easy_install的改进版,提供更好的提示信息,删除package等功能。老版本的python中只有easy_install,没有pip。常见的具体用法如下:
easy_install的用法:
1) 安装一个包
 $ easy_install <package_name>
 $ easy_install "<package_name>==<version>"
2) 升级一个包
 $ easy_install -U "<package_name>>=<version>"

pip的用法
1) 安装一个包
 $ pip install <package_name>
 $ pip install <package_name>==<version>
2) 升级一个包 (如果不提供version号,升级到最新版本)
 $ pip install --upgrade <package_name>>=<version>
3)删除一个包
 $ pip uninstall <package_name>
        第一步:下载PIP软件
        可以在官网 http://pypi.python.org/pypi/pip#downloads 下载,同时cd切换到PIP目录,在通过python setup.py install安装。而我采用的是下载pip-Win_1.7.exe进行安装,下载地址如下:
         https://sites.google.com/site/pydatalog/python/pip-for-windows
        第二步:安装PIP软件



        当提示"pip and virtualenv installed"表示安装成功,那怎么测试PIP安装成功呢?
        第三步:配置环境变量
        此时在cmd中输入pip指令会提示错误“不是内部或外部命令”,所以需要添加path环境变量。PIP安装完成后,会在Python安装目录下添加python\Scripts目录,即在python安装目录的Scripts目录下,将此目录加入环境变量中即可!过程如下:



        第四步:使用PIP命令
        下面在CMD中使用PIP命令,“pip list outdate”列举Python安装库的版本信息。

       PIP常用的命令如下所示: (参考pip安装使用详解)
Usage:   
  pip <command> [options]
 
Commands:
  install                     安装软件.
  uninstall                   卸载软件.
  freeze                      按着一定格式输出已安装软件列表
  list                        列出已安装软件.
  show                        显示软件详细信息.
  search                      搜索软件,类似yum里的search.
  wheel                       Build wheels from your requirements.
  zip                         不推荐. Zip individual packages.
  unzip                       不推荐. Unzip individual packages.
  bundle                      不推荐. Create pybundles.
  help                        当前帮助.
 
General Options:
  -h, --help                  显示帮助.
  -v, --verbose               更多的输出,最多可以使用3次
  -V, --version               现实版本信息然后退出.
  -q, --quiet                 最少的输出.
  --log-file <path>           覆盖的方式记录verbose错误日志,默认文件:/root/.pip/pip.log
  --log <path>                不覆盖记录verbose输出的日志.
  --proxy <proxy>             Specify a proxy in the form [user:passwd@]proxy.server:port.
  --timeout <sec>             连接超时时间 (默认15秒).
  --exists-action <action>    默认活动当一个路径总是存在: (s)witch, (i)gnore, (w)ipe, (b)ackup.
  --cert <path>               证书.

3.安装xhtml2pdf和pisa软件

        通过PIP命令安装xhtml2pdf和pisa库。下载地址:
        xhtml2pdf 0.0.6:https://pypi.python.org/pypi/xhtml2pdf/
        pisa 3.0.33:https://pypi.python.org/pypi/pisa/
        然后通过下面命令安装:
            pip install xhtml2pdf
            pip install pisa

4.失败原因

        最初没有安装Pisa库时运行那段HTML转PDF的代码会报错:
                >>> 
                Traceback (most recent call last):
                File "G:/software/Program software/Python/python insert/HtmlToPDF.py", line 12, in <module>
                ImportError: No module named sx.pisa3

        在安装完成后不会提示导入库名不存在,但此时HTML转PDF的代码会报错:
****************************************************
IMPORT ERROR!
Reportlab Version 2.1+ is needed!
****************************************************

The following Python packages are required for PISA:
- Reportlab Toolkit >= 2.2 <http://www.reportlab.org/>
- HTML5lib >= 0.11.1 <http://code.google.com/p/html5lib/>

Optional packages:
- pyPDF <http://pybrary.net/pyPdf/>
- PIL <http://www.pythonware.com/products/pil/>

Traceback (most recent call last):
  File "G:\software\Program software\Python\python insert\HtmlToPDF.py", line 5, in <module>
    import sx.pisa3 as pisa
...

raise ImportError("Reportlab Version 2.1+ is needed!")
ImportError: Reportlab Version 2.1+ is needed!

        其原因是导入"import sx.pisa3 as pisa "时就显示Reportlab版本需要大于2.1以上。而通过代码查看版本为3.1.44。

>>> import reportlab
>>> print reportlab.Version
3.1.44
>>> 
        查看了很多资料都没有解决该问题,其中最典型的是将pisa安装目录下,sx\pisa3\pisa_util.py文件中代码修改:

if not (reportlab.Version[0] == "2" and reportlab.Version[2] >= "1"):
    raise ImportError("Reportlab Version 2.1+ is needed!")

REPORTLAB22 = (reportlab.Version[0] == "2" and reportlab.Version[2] >= "2")
        修改后的代码如下:
if not (reportlab.Version[:3] >="2.1"):
    raise ImportError("Reportlab Version 2.1+ is needed!")

REPORTLAB22 = (reportlab.Version[:3] >="2.1")

        但仍然不能解决该问题,这就导致了我无法验证该代码并实现后面的HTML转换为PDF的功能。参看了很多国外的资料:
        xhtml2pdf ImportError - Django 来自stackoverflow
        https://github.com/stephenmcd/cartridge/issues/174
        https://groups.google.com/forum/#!topic/xhtml2pdf/mihS51DtZkU
        http://linux.m2osw.com/xhtml2pdf-generating-error-under-1404

三. 总结

        最后简单总结下吧!文章主要想实现从CSDN下载HTML静态网页形式的文章,再通过Python第三方库实现转换成PDF格式的备份文章功能,但由于Pisa无法导入最终失败。你可能非常失望,我也很遗憾。但仍然能从文章中学到一些东西,包括:
        1.如何通过Python获取403禁止的内容,写消息头模仿登录,采用geturl和openurl两种方法实现;
        2.如何配置PIP,它能让我们更方便的安装第三方库,让你了解些配置过程;
        3.让你了解了HTML转PDF的一些思想。

        最后推荐下我以前关于Python的爬虫文章,可能会给你提供些想法,虽然比那些开源的软件差很多,但这方面的文章和资源还是比较少的,哪怕给你一点灵感就好。

        [Python学习] 专题一.函数的基础知识
        [Python学习] 专题二.条件语句和循环语句的基础知识
        [Python学习] 专题三.字符串的基础知识
        [Python学习] 简单网络爬虫抓取博客文章及思想介绍
        [python学习] 简单爬取维基百科程序语言消息盒
        [python学习] 简单爬取图片网站图库中图片
        [python知识] 爬虫知识之BeautifulSoup库安装及简单介绍
        [python+nltk] 自然语言处理简单介绍和NLTK坏境配置及入门知识(一)

        如果你有“Reportlab Version 2.1+ is needed!”好的解决方案可告知我,小弟我感激不尽。潜心学习,研究这方面的功能,最好不是调用第三方库,为自己加油。
        最后希望文章对你有所帮助,如果有不足之处或错误的地方,还请海涵~

        (By:Eastmount 2015-5-17 凌晨3点   http://blog.csdn.net/eastmount/

目录
相关文章
|
23天前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
2月前
|
Java Python
> python知识点100篇系列(19)-使用python下载文件的几种方式
【10月更文挑战第7天】本文介绍了使用Python下载文件的五种方法,包括使用requests、wget、线程池、urllib3和asyncio模块。每种方法适用于不同的场景,如单文件下载、多文件并发下载等,提供了丰富的选择。
|
2月前
|
数据安全/隐私保护 流计算 开发者
python知识点100篇系列(18)-解析m3u8文件的下载视频
【10月更文挑战第6天】m3u8是苹果公司推出的一种视频播放标准,采用UTF-8编码,主要用于记录视频的网络地址。HLS(Http Live Streaming)是苹果公司提出的一种基于HTTP的流媒体传输协议,通过m3u8索引文件按序访问ts文件,实现音视频播放。本文介绍了如何通过浏览器找到m3u8文件,解析m3u8文件获取ts文件地址,下载ts文件并解密(如有必要),最后使用ffmpeg合并ts文件为mp4文件。
|
2月前
|
机器学习/深度学习 人工智能 架构师
Python学习圣经:从0到1,精通Python使用
尼恩架构团队的大模型《LLM大模型学习圣经》是一个系统化的学习系列,初步规划包括以下内容: 1. **《Python学习圣经:从0到1精通Python,打好AI基础》** 2. **《LLM大模型学习圣经:从0到1吃透Transformer技术底座》**
Python学习圣经:从0到1,精通Python使用
|
2月前
|
Python
Python 三方库下载安装
Python 三方库下载安装
28 1
|
2月前
|
机器学习/深度学习 人工智能 架构师
|
2月前
|
机器学习/深度学习 缓存 Linux
python环境学习:pip介绍,pip 和 conda的区别和联系。哪个更好使用?pip创建虚拟环境并解释venv模块,pip的常用命令,conda的常用命令。
本文介绍了Python的包管理工具pip和环境管理器conda的区别与联系。pip主要用于安装和管理Python包,而conda不仅管理Python包,还能管理其他语言的包,并提供强大的环境管理功能。文章还讨论了pip创建虚拟环境的方法,以及pip和conda的常用命令。作者推荐使用conda安装科学计算和数据分析包,而pip则用于安装无法通过conda获取的包。
97 0
|
26天前
|
JSON 移动开发 JavaScript
在浏览器执行js脚本的两种方式
【10月更文挑战第20天】本文介绍了在浏览器中执行HTTP请求的两种方式:`fetch`和`XMLHttpRequest`。`fetch`支持GET和POST请求,返回Promise对象,可以方便地处理异步操作。`XMLHttpRequest`则通过回调函数处理请求结果,适用于需要兼容旧浏览器的场景。文中还提供了具体的代码示例。
在浏览器执行js脚本的两种方式
|
23天前
|
机器学习/深度学习 自然语言处理 前端开发
前端神经网络入门:Brain.js - 详细介绍和对比不同的实现 - CNN、RNN、DNN、FFNN -无需准备环境打开浏览器即可测试运行-支持WebGPU加速
本文介绍了如何使用 JavaScript 神经网络库 **Brain.js** 实现不同类型的神经网络,包括前馈神经网络(FFNN)、深度神经网络(DNN)和循环神经网络(RNN)。通过简单的示例和代码,帮助前端开发者快速入门并理解神经网络的基本概念。文章还对比了各类神经网络的特点和适用场景,并简要介绍了卷积神经网络(CNN)的替代方案。
|
2月前
|
机器学习/深度学习 自然语言处理 前端开发
前端大模型入门:Transformer.js 和 Xenova-引领浏览器端的机器学习变革
除了调用API接口使用Transformer技术,你是否想过在浏览器中运行大模型?Xenova团队推出的Transformer.js,基于JavaScript,让开发者能在浏览器中本地加载和执行预训练模型,无需依赖服务器。该库利用WebAssembly和WebGPU技术,大幅提升性能,尤其适合隐私保护、离线应用和低延迟交互场景。无论是NLP任务还是实时文本生成,Transformer.js都提供了强大支持,成为构建浏览器AI应用的核心工具。
507 1