小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

[python學(xué)習(xí)] 模仿瀏覽器下載CSDN源文并實現(xiàn)PDF格式備份

 書*金 2017-03-01

最近突然想給自己的博客備份下,看了兩個軟件:一個是CSDN博客導(dǎo)出軟件,好像現(xiàn)在不能使用了;一個是豆約翰博客備份專家,感覺都太慢,而且不靈活,想單獨下一篇文章就比較費時。而且我的畢業(yè)論文是基于Python自然語言相關(guān)的,所以想結(jié)合前面的文章用Python實現(xiàn)簡單的功能:

1.通過網(wǎng)絡(luò)下載本體的博客,包括圖片;

2.在通過Python把HTML轉(zhuǎn)換成PDF格式;

3.如果可能,后面可能會寫文章對代碼采用特定的方式進行處理。

言歸正傳,直接上代碼通過兩個方面進行講解。

一. 設(shè)置消息頭下載CSDN文章內(nèi)容

獲取一篇文章Python的代碼如下,如韓寒的新浪博客:(文章最后的總結(jié)有我以前關(guān)于Python爬蟲博文鏈接介紹)

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

但是很多網(wǎng)站都防止這種獲取方式,如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>

此時通過設(shè)置消息頭或模仿登錄,可以偽裝成瀏覽器實現(xiàn)下載。代碼如下:

#coding:utf-8
import urllib
import urllib2
import cookielib
import string
import time
import re
import sys

#定義類實現(xiàn)模擬登陸下載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)

    #定義函數(shù)模擬登陸
    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

#調(diào)用該類獲取HTML
print unicode('調(diào)用模擬登陸函數(shù)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學(xué)習(xí)] 簡單網(wǎng)絡(luò)爬蟲抓取博客文章及思想介紹”,兩種方法效果一樣,其中本體兩個文件geturl.html和openurl.html。該方法運行Python定義類、函數(shù)、urllib2和cookielib相關(guān)知識。

相關(guān)類似的優(yōu)秀文章推薦三篇,其中POST方法類似:
[Python]一起來寫一個Python爬蟲工具類whyspider——汪海
用python 寫爬蟲,去爬csdn的內(nèi)容,完美解決 403 Forbidden
urllib2.HTTPError: HTTP Error 403: Forbidden

二. 實現(xiàn)HTML轉(zhuǎn)PDF格式備份文章

首先聲明:這部分代碼實現(xiàn)最終以失敗告終,以后可能還會繼續(xù)研究,一方面由于最近太忙;一方面對Linux的欠缺和對Python的掌握不夠,但還是想把這部分寫出來,感覺還是有些東西的,可能對你也有所幫助!感覺好遺憾啊~

1.轉(zhuǎn)PDF解決方法

通過網(wǎng)上查閱資料,發(fā)現(xiàn)最常見的兩種調(diào)用Python庫轉(zhuǎn)PDF的方法:

方法一:調(diào)用PDF報表類庫Reportlab,它是在線網(wǎng)站轉(zhuǎn)PDF該庫不屬于Python的標準類庫,所以必須手動下載類庫包并安裝;同時由于涉及到把圖片轉(zhuǎn)換為PDF,所以還需要Python imaging library(PIL)類庫。

參考文章:python實現(xiàn)抓取HTML,取出數(shù)據(jù),分析,繪出PDF版圖形

方法二:通過調(diào)用xhtml2pdf和pisa庫實現(xiàn)HTML轉(zhuǎn)PDF

該方法可以實現(xiàn)將靜態(tài)的HTML轉(zhuǎn)換成PDF格式,其中核心代碼如下,將本地的"1.html"靜態(tài)界面轉(zhuǎn)換為"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轉(zhuǎn)成PDF的實現(xiàn)代碼(包含中文)

方法三:調(diào)用第三方wkhtmltopdf軟件實現(xiàn)

該方法并不像Python調(diào)用第三方那樣有詳細代碼,很多文章都是基于輸入命令實現(xiàn)。下面三篇文章都是關(guān)于wkhtmltopdf的實現(xiàn)。

參考文章:HTML轉(zhuǎn)換成PDF工具:wkhtmltopdf 

[php]將html批量轉(zhuǎn)pdf文件的解決方案,研究有感
wkhtmltopdf 生成帶封面、頁眉、頁腳、目錄的pdf

2.安裝PIP及介紹

此時準備介紹通過xhtml2pdf和pisa庫實現(xiàn)HTML轉(zhuǎn)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軟件

可以在官網(wǎng)http://pypi./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軟件

當(dāng)提示"pip and virtualenvinstalled"表示安裝成功,那怎么測試PIP安裝成功呢?

第三步:配置環(huán)境變量

此時在cmd中輸入pip指令會提示錯誤“不是內(nèi)部或外部命令”,所以需要添加path環(huán)境變量。PIP安裝完成后,會在Python安裝目錄下添加python\Scripts目錄,即在python安裝目錄的Scripts目錄下,將此目錄加入環(huán)境變量中即可!過程如下:

第四步:使用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                        當(dāng)前幫助.

General Options:
  -h, --help                  顯示幫助.
  -v, --verbose               更多的輸出,最多可以使用3次
  -V, --version               現(xiàn)實版本信息然后退出.
  -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>    默認活動當(dāng)一個路徑總是存在: (s)witch, (i)gnore, (w)ipe, (b)ackup.
  --cert <path>               證書.

3.安裝xhtml2pdf和pisa軟件

通過PIP命令安裝xhtml2pdf和pisa庫。下載地址:
xhtml2pdf 0.0.6:https://pypi./pypi/xhtml2pdf/
pisa 3.0.33:https://pypi./pypi/pisa/
然后通過下面命令安裝:
pip install xhtml2pdf
pip install pisa

參考:
安裝html5轉(zhuǎn)化為pdf的python庫pisa 安裝matplotlab數(shù)據(jù)轉(zhuǎn)為圖形的python庫

4.失敗原因

最初沒有安裝Pisa庫時運行那段HTML轉(zhuǎn)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

在安裝完成后不會提示導(dǎo)入庫名不存在,但此時HTML轉(zhuǎn)PDF的代碼會報錯:

**************************
IMPORT ERROR!
Reportlab Version 2.1+ is needed!
**************************

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

Optional packages:
- pyPDF <http:///pyPdf/>
- PIL <http://www./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!

其原因是導(dǎo)入"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")

但仍然不能解決該問題,這就導(dǎo)致了我無法驗證該代碼并實現(xiàn)后面的HTML轉(zhuǎn)換為PDF的功能。參看了很多國外的資料:
xhtml2pdf ImportError - Django 來自stackoverflow
https://github.com/stephenmcd/cartridge/issues/174
https://groups.google.com/forum/#!topic/xhtml2pdf/mihS51DtZkU
http://linux./xhtml2pdf-generating-error-under-1404

三. 總結(jié)

最后簡單總結(jié)下吧!文章主要想實現(xiàn)從CSDN下載HTML靜態(tài)網(wǎng)頁形式的文章,再通過Python第三方庫實現(xiàn)轉(zhuǎn)換成PDF格式的備份文章功能,但由于Pisa無法導(dǎo)入最終失敗。你可能非常失望,我也很遺憾。但仍然能從文章中學(xué)到一些東西,包括:

1.如何通過Python獲取403禁止的內(nèi)容,寫消息頭模仿登錄,采用geturl和openurl兩種方法實現(xiàn);

2.如何配置PIP,它能讓我們更方便的安裝第三方庫,讓你了解些配置過程;

3.讓你了解了HTML轉(zhuǎn)PDF的一些思想。

最后推薦下我以前關(guān)于Python的爬蟲文章,可能會給你提供些想法,雖然比那些開源的軟件差很多,但這方面的文章和資源還是比較少的,哪怕給你一點靈感就好。
[Python學(xué)習(xí)] 專題一.函數(shù)的基礎(chǔ)知識
[Python學(xué)習(xí)] 專題二.條件語句和循環(huán)語句的基礎(chǔ)知識
[Python學(xué)習(xí)] 專題三.字符串的基礎(chǔ)知識
[Python學(xué)習(xí)] 簡單網(wǎng)絡(luò)爬蟲抓取博客文章及思想介紹
[python學(xué)習(xí)] 簡單爬取維基百科程序語言消息盒
[python學(xué)習(xí)] 簡單爬取圖片網(wǎng)站圖庫中圖片
[python知識] 爬蟲知識之BeautifulSoup庫安裝及簡單介紹
[python+nltk] 自然語言處理簡單介紹和NLTK壞境配置及入門知識(一)

如果你有“Reportlab Version 2.1+ is needed!”好的解決方案可告知我,小弟我感激不盡。潛心學(xué)習(xí),研究這方面的功能,最好不是調(diào)用第三方庫,為自己加油。

最后希望文章對你有所幫助,如果有不足之處或錯誤的地方,還請海涵~
(By:Eastmount 2015-5-17 凌晨3點 http://blog.csdn.net/eastmount/

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多