[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 contentprint 'Open Succeed!!!'except Exception,e:print "Exception: ",eelse: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: ",eelse: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 ? 參考:
? ? ? ??安裝html5轉化為pdf的python庫pisa 安裝matplotlab數據轉為圖形的python庫
?
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/)
?
總結
以上是生活随笔為你收集整理的[python学习] 模仿浏览器下载CSDN源文并实现PDF格式备份的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java+MyEclipse+Tomca
- 下一篇: [Python爬虫] Selenium自