原做者及原文連接: Jack-Cui,blog.csdn.net/c406495762/…html
運行平臺:Windows Python版本:Python3.x IDE:Sublime text3python
一直想學習Python爬蟲的知識,在網上搜索了一下,大部分都是基於Python2.x的。所以打算寫一個Python3.x的爬蟲筆記,以便後續回顧,歡迎一塊兒交流、共同進步。小程序
網絡爬蟲,也叫網絡蜘蛛(Web Spider),若是把互聯網比喻成一個蜘蛛網,Spider就是一隻在網上爬來爬去的蜘蛛。網絡爬蟲就是根據網頁的地址來尋找網頁的,也就是URL。舉一個簡單的例子,咱們在瀏覽器的地址欄中輸入的字符串就是URL,例如:www.baidu.com/。瀏覽器
URL就是贊成資源定位符(Uniform Resource Locator),它的通常格式以下(帶方括號[]的爲可選項):bash
protocol :// hostname[:port] / path / [;parameters][?query]#fragment服務器
URL的格式由三部分組成:網絡
(1)protocol:第一部分就是協議,例如百度使用的就是https協議;ide
(2)hostname[:port]:第二部分就是主機名(還有端口號爲可選參數),通常網站默認的端口號爲80,例如百度的主機名就是www.baidu.com,這個就是服務器的地址;函數
(3)path:第三部分就是主機資源的具體地址,如目錄和文件名等。學習
網絡爬蟲就是根據這個URL來獲取網頁信息的。
在Python3.x中,咱們可使用urlib這個組件抓取網頁,urllib是一個URL處理包,這個包中集合了一些處理URL的模塊,以下:
urllib.request模塊是用來打開和讀取URLs的;
urllib.error模塊包含一些有urllib.request產生的錯誤,可使用try進行捕捉處理;
urllib.parse模塊包含了一些解析URLs的方法;
urllib.robotparser模塊用來解析robots.txt文本文件.它提供了一個單獨的RobotFileParser類,經過該類提供的can_fetch()方法測試爬蟲是否能夠下載一個頁面。
咱們使用urllib.request.urlopen()這個接口函數就能夠很輕鬆的打開一個網站,讀取並打印信息。
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中查看運行結果,以下:
也能夠在cmd(控制檯)中輸入指令:
python urllib_test01.py
複製代碼
運行py文件,輸出信息是同樣的,以下:
其實這就是瀏覽器接收到的信息,只不過咱們在使用瀏覽器的時候,瀏覽器已經將這些信息轉化成了界面信息供咱們瀏覽。固然這些代碼咱們也能夠從瀏覽器中查看到。例如,使用谷歌瀏覽器,在任意界面單擊右鍵選擇檢查,也就是審查元素(不是全部頁面均可以審查元素的,例如起點中文網付費章節就不行.),以百度界面爲例,截圖以下:
能夠看到,右邊就是咱們的審查結果。咱們能夠在本地,也就是瀏覽器(客戶端)更改元素,可是這個不會上傳到服務器端。例如我能夠修改本身的支付寶餘額裝一裝,好比這樣:
我實際有這些錢嗎?顯然苦逼的我,是不會有這些錢的,我只不過是修改了下審查元素的信息而已。
有些跑偏,不過說的道理就是,瀏覽器就是做爲客戶端從服務器端獲取信息,而後將信息解析,再展現給咱們的。
迴歸正題,雖然咱們已經成功獲取了信息,可是顯然他們都是二進制的亂碼,看起來很不方便。咱們怎麼辦呢?
咱們能夠經過簡單的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)
複製代碼
這樣咱們就能夠獲得這樣的結果,顯然解碼後的信息看起來工整和舒服多了:
固然這個前提是咱們已經知道了這個網頁是使用utf-8編碼的,怎麼查看網頁的編碼方式呢?須要人爲操做,且很是簡單的方法是使用使用瀏覽器審查元素,只須要找到head標籤開始位置的chareset,就知道網頁是採用何種編碼的了。以下:
這樣咱們就知道了這個網站的編碼方式,可是這須要咱們每次都打開瀏覽器,並找下編碼方式,顯然有些費事,使用幾行代碼解決更加省事而且顯得酷一些。
獲取網頁編碼的方式有不少,我的更喜歡用第三方庫的方式。
首先咱們須要安裝第三方庫chardet,它是用來判斷編碼的模塊,安裝方法以下圖所示,只須要輸入指令:
pip install chardet
複製代碼
安裝好後,咱們就可使用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)
複製代碼
運行程序,查看輸出結果以下:
瞧,返回的是一個字典,這樣咱們就知道網頁的編碼方式了,經過得到的信息,採用不一樣的解碼方式便可。
PS:關於編碼方式的內容,能夠自行百度
圓方圓學院聚集 Python + AI 名師,打造精品的 Python + AI 技術課程。 在各大平臺都長期有優質免費公開課,歡迎報名收看。 公開課地址: ke.qq.com/course/3627…
加入python學習討論羣 78486745 ,獲取資料,和廣大羣友一塊兒學習。