1. 程式人生 > >4.1 urllib--通過URL打開任意資源--2

4.1 urllib--通過URL打開任意資源--2

exp nco 代碼 text -type sina 首頁 expires 出現問題

此時,我們已經成功實現了一個網頁的爬取,如何將獲得的網頁以網頁的形式保存到本地呢?

思路如下:
1 首先爬取到一個網頁並將爬取到的內容讀取出來賦值給一個變量
2 以寫的方式打開一個本地文件,命名為*.html等網頁格式
3 將1 中變量的值寫入該文件中。
4 關閉該文件

所以我們剛才已經成功獲取到了百度首頁的內容並讀取賦給了變量data,接著可以通過
一下代碼實現將爬取到的網頁保存到本地。

fhandle=open("E:/1.html","w")
fhandle.write(data)
fhandle.close()

執行完該操作後,即可以將對應文件保存在E盤中的根目錄中,我們首先通過open()函數
打開了該文件,並以"w"二進制寫入的方式打開,打開後將句柄賦給變量fhandle,然後
使用write()方法寫入了對應的數據data,接著在通過close()方法關閉該文件,有始有終。

從根目錄中可以查找到1.html文件。
然後利用瀏覽器打開這個文件後,我們發覺進入了百度首頁的頁面,不過就是缺少圖片
,我也不知道為什麽就缺少圖片,

除了這種方法之外,在python中,還可以使用urllib.request裏面的urlretrieve()函數
直接將對應信息寫入本地文件,格式為:“urllib.request.urlretrieve(url,filename=本地文件地址)”。
比如,我們可以直接使用該方式將網頁寫入本地文件,輸入:

filename = urllib.request.urlretrieve("http://edu.51cto.com",filename="D:/2.html")

執行後,成功將“http://edu.51cto.com”保存到了本地,打開後若進入了首頁則爬取成功。

#記住,是在python3中執行。



如果希望返回與當前環境有關的信息,我們可以使用info()返回,比如可以執行:
print file.info()

結果為:
Date: Fri, 01 Sep 2017 08:35:19 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: Close
Vary: Accept-Encoding
Set-Cookie: BAIDUID=24942564BED35EC70DF96034AB71D9A3:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BIDUPSID=24942564BED35EC70DF96034AB71D9A3; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: PSTM=1504254919; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BDSVRTM=0; path=/
Set-Cookie: BD_HOME=0; path=/
Set-Cookie: H_PS_PSSID=1439_21104_17001_20928; path=/; domain=.baidu.com
P3P: CP=" OTI DSP COR IVA OUR IND COM "
Cache-Control: private
Cxy_all: baidu+71a6cd1e799e7f19eaadfd7f1425610a
Expires: Fri, 01 Sep 2017 08:35:14 GMT
X-Powered-By: HPHP
Server: BWS/1.1
X-UA-Compatible: IE=Edge,chrome=1
BDPAGETYPE: 1
BDQID: 0xd8add75f0004af5a
BDUSERID: 0
可以看到,輸出了對應的info,調用格式則為:“爬取的網頁.info()”,我們之前爬取到的網頁賦給了變量file,所以此時通過file調用。


如果希望獲取當前爬取網頁的狀態碼,我們可以使用getcode(),若返回200為正確,
返回其他則不正確,調用格式則為:“爬取的網頁.getcode()”。在該例中,我們可以執行:

print file.getcode()
200

可以看到,此時返回了狀態碼200,說明此時響應正確。

如果想要獲取當前所爬取的URL地址,我們可以使用geturl()來實現,調用格式則為:“爬取的網頁.geturl()”,本例中,
可以通過如下代碼獲取:

print file.geturl()
http://www.baidu.com

可以看到,此時輸出了爬取的源網頁地址為‘http://www.baidu.com‘。

一般來說,URL標準中只會雲去一部分ASCII字符比如,數字、字母、部分符號等,而其他的
一些字符、比如漢字等,是不符合URL標準的。所以如果我們在URL中使用一些其他不符合
標準的字符就會出現問題,此時需要進行URL編碼方可解決。比如在URL中輸入中文問或者
":"或者"&"等不符合標準的字符時,需要編碼。

如果要進行編碼,我們可以使用urllib.quote()進行,比如,我們要對網址”http://www.sina.com.cn“
進行編碼,可以使用如下代碼:

print urllib.quote("http://www.sina.com.cn")

結果如下:
http%3A//www.sina.com.cn

那麽相應的,有編碼就有解碼,可以通過urllib.unquote()進行實現,就對我們剛才的編碼網址
進行解碼

print urllib.unquote("http%3A//www.sina.com.cn")
結果如下;
http://www.sina.com.cn

4.1 urllib--通過URL打開任意資源--2