1. 程式人生 > >Python3網路爬蟲(一):利用urllib進行簡單的網頁抓取

Python3網路爬蟲(一):利用urllib進行簡單的網頁抓取

執行平臺:Windows
Python版本:Python3.x
IDE:Sublime text3

    一直想學習Python爬蟲的知識,在網上搜索了一下,大部分都是基於Python2.x的。因此打算寫一個Python3.x的爬蟲筆記,以便後續回顧,歡迎一起交流、共同進步。

一、預備知識

1.Python3.x基礎知識學習:

    可以在通過如下方式進行學習:

    (1)廖雪峰Python3教程(文件):

    (2)菜鳥教程Python3教程(文件):

    (3)魚C工作室Python教程(視訊):

    小甲魚老師很厲害,講課風格幽默詼諧,如果時間充裕可以考慮看視訊。

2.開發環境搭建:

    Sublime text3搭建Pyhthon IDE可以檢視部落格:

二、網路爬蟲的定義

    網路爬蟲,也叫網路蜘蛛(Web Spider),如果把網際網路比喻成一個蜘蛛網,Spider就是一隻在網上爬來爬去的蜘蛛。網路爬蟲就是根據網頁的地址來尋找網頁的,也就是URL。舉一個簡單的例子,我們在瀏覽器的位址列中輸入的字串就是URL,例如:https://www.baidu.com/

    URL就是同意資源定位符(Uniform Resource Locator),它的一般格式如下(帶方括號[]的為可選項):

    protocol :// hostname[:port] / path / [;parameters][?query]#fragment

    URL的格式由三部分組成:

    (1)protocol:第一部分就是協議,例如百度使用的就是https協議;

    (2)hostname[:port]:第二部分就是主機名(還有埠號為可選引數),一般網站預設的埠號為80,例如百度的主機名就是www.baidu.com,這個就是伺服器的地址;

    (3)path:第三部分就是主機資源的具體地址,如目錄和檔名等。

    網路爬蟲就是根據這個URL來獲取網頁資訊的。

三、簡單爬蟲例項

    在Python3.x中,我們可以使用urlib這個元件抓取網頁,urllib是一個URL處理包,這個包中集合了一些處理URL的模組,如下:

picture1

1.urllib.request模組是用來開啟和讀取URLs的;

2.urllib.error模組包含一些有urllib.request產生的錯誤,可以使用try進行捕捉處理;

3.urllib.parse模組包含了一些解析URLs的方法;

4.urllib.robotparser模組用來解析robots.txt文字檔案.它提供了一個單獨的RobotFileParser類,通過該類提供的can_fetch()方法測試爬蟲是否可以下載一個頁面。

    我們使用urllib.request.urlopen()這個介面函式就可以很輕鬆的開啟一個網站,讀取並列印資訊。

picture2

    urlopen有一些可選引數,具體資訊可以查閱Python自帶的documentation。

    瞭解到這些,我們就可以寫一個最簡單的程式,檔名為urllib_test01.py,感受一個urllib庫的魅力:

# -*- coding: UTF-8 -*-
from urllib import request

if __name__ == "__main__":
    response = request.urlopen("http://fanyi.baidu.com")
    html = response.read()
    print(html)

    urllib使用使用request.urlopen()開啟和讀取URLs資訊,返回的物件response如同一個文字物件,我們可以呼叫read(),進行讀取。再通過print(),將讀到的資訊打印出來。

    執行程式ctrl+b,可以在Sublime中檢視執行結果,如下:

picture3

    也可以在cmd(控制檯)中輸入指令:

python urllib_test01.py

    執行py檔案,輸出資訊是一樣的,如下:

picture5

    其實這就是瀏覽器接收到的資訊,只不過我們在使用瀏覽器的時候,瀏覽器已經將這些資訊轉化成了介面資訊供我們瀏覽。當然這些程式碼我們也可以從瀏覽器中檢視到。例如,使用谷歌瀏覽器,在任意介面單擊右鍵選擇檢查,也就是審查元素(不是所有頁面都可以審查元素的,例如起點中文網付費章節就不行.),以百度介面為例,截圖如下:

picture6

    可以看到,右邊就是我們的審查結果。我們可以在本地,也就是瀏覽器(客戶端)更改元素,但是這個不會上傳到伺服器端。例如我可以修改自己的支付寶餘額裝一裝,比如這樣:

picture7

    我實際有這些錢嗎?顯然苦逼的我,是不會有這些錢的,我只不過是修改了下審查元素的資訊而已。

    有些跑偏,不過說的道理就是,瀏覽器就是作為客戶端從伺服器端獲取資訊,然後將資訊解析,再展示給我們的。

    迴歸正題,雖然我們已經成功獲取了資訊,但是顯然他們都是二進位制的亂碼,看起來很不方便。我們怎麼辦呢?

    我們可以通過簡單的decode()命令將網頁的資訊進行解碼,並顯示出來,我們新建立一個檔案,命名為urllib_test02.py,編寫如下程式碼(還是以百度翻譯網站fanyi.baidu.com為例):

# -*- coding: UTF-8 -*-
from urllib import request

if __name__ == "__main__":
    response = request.urlopen("http://www.fanyi.baidu.com/")
    html = response.read()
    html = html.decode("utf-8")
    print(html)

    這樣我們就可以得到這樣的結果,顯然解碼後的資訊看起來工整和舒服多了:

picture8

    當然這個前提是我們已經知道了這個網頁是使用utf-8編碼的,怎麼檢視網頁的編碼方式呢?需要人為操作,且非常簡單的方法是使用使用瀏覽器審查元素,只需要找到head標籤開始位置的chareset,就知道網頁是採用何種編碼的了。如下:

picture9

    這樣我們就知道了這個網站的編碼方式,但是這需要我們每次都開啟瀏覽器,並找下編碼方式,顯然有些費事,使用幾行程式碼解決更加省事並且顯得酷一些。

四、自動獲取網頁編碼方式的方法

    獲取網頁編碼的方式有很多,個人更喜歡用第三方庫的方式。

    首先我們需要安裝第三方庫chardet,它是用來判斷編碼的模組,安裝方法如下圖所示,只需要輸入指令:

pip install chardet

picture10

    安裝好後,我們就可以使用chardet.detect()方法,判斷網頁的編碼方式了。至此,我們就可以編寫一個小程式判斷網頁的編碼方式了,新建檔名為chardet_test01.py:

# -*- coding: UTF-8 -*-
from urllib import request
import chardet

if __name__ == "__main__":
    response = request.urlopen("http://fanyi.baidu.com/")
    html = response.read()
    charset = chardet.detect(html)
    print(charset)

    執行程式,檢視輸出結果如下:

picture11

    瞧,返回的是一個字典,這樣我們就知道網頁的編碼方式了,通過獲得的資訊,採用不同的解碼方式即可。

PS:關於編碼方式的內容,可以自行百度,或者看下這篇部落格: