1. 程式人生 > 實用技巧 >Python 爬蟲乾貨之urllib庫

Python 爬蟲乾貨之urllib庫

1. 小試牛刀

怎樣扒網頁呢?

其實就是根據URL來獲取它的網頁資訊,雖然我們在瀏覽器中看到的是一幅幅優美的畫面,但是其實是由瀏覽器解釋才呈現出來的,實質它是一段HTML程式碼,加 JS、CSS,如果把網頁比作一個人,那麼HTML便是他的骨架,JS便是他的肌肉,CSS便是它的衣服。所以最重要的部分是存在於HTML中的,下面我們就寫個例子來扒一個網頁下來

from urllib.request import urlopen

response = urlopen("http://www.baidu.com")
print(response.read().decode())

真正的程式就兩行,執行如下命令檢視執行結果,感受一下

看,這個網頁的原始碼已經被我們扒下來了,是不是很酸爽?

2. 常見到的方法

  • requset.urlopen(url,data,timeout)
    • 第一個引數url即為URL,第二個引數data是訪問URL時要傳送的資料,第三個timeout是設定超時時間。
    • 第二三個引數是可以不傳送的,data預設為空None,timeout預設為 socket._GLOBAL_DEFAULT_TIMEOUT
    • 第一個引數URL是必須要傳送的,在這個例子裡面我們傳送了百度的URL,執行urlopen方法之後,返回一個response物件,返回資訊便儲存在這裡面。
  • response.read()
    • read()方法就是讀取檔案裡的全部內容,返回bytes型別

    • response.getcode()
      • 返回 HTTP的響應碼,成功返回200,4伺服器頁面出錯,5伺服器問題

  • response.geturl()
    • 返回 返回實際資料的實際URL,防止重定向問題

3. Request物件

其實上面的urlopen引數可以傳入一個request請求,它其實就是一個Request類的例項,構造時需要傳入Url,Data等等的內容。比如上面的兩行程式碼,我們可以這麼改寫

from urllib.request import urlopen
from urllib.request import Request

request = Request("http://www.baidu.com")
response = urlopen(requst)
print response.read().decode()

執行結果是完全一樣的,只不過中間多了一個request物件,推薦大家這麼寫,因為在構建請求時還需要加入好多內容,通過構建一個request,伺服器響應請求得到應答,這樣顯得邏輯上清晰明確

4. Get 請求

大部分被傳輸到瀏覽器的html,images,js,css, … 都是通過GET方法發出請求的。它是獲取資料的主要方法

例如:搜尋

Get請求的引數都是在Url中體現的,如果有中文,需要轉碼,這時我們可使用

  • urllib.parse.urlencode()
  • urllib.parse. quote()

5. Post 請求

我們說了Request請求物件的裡有data引數,它就是用在POST裡的,我們要傳送的資料就是這個引數data,data是一個字典,裡面要匹配鍵值對

傳送請求/響應header頭的含義:

名稱 | 含義 ---|--- Accept | 告訴伺服器,客戶端支援的資料型別 Accept-Charset | 告訴伺服器,客戶端採用的編碼 Accept-Encoding | 告訴伺服器,客戶機支援的資料壓縮格式 Accept-Language | 告訴伺服器,客戶機的語言環境 Host | 客戶機通過這個頭告訴伺服器,想訪問的主機名 If-Modified-Since | 客戶機通過這個頭告訴伺服器,資源的快取時間 Referer | 客戶機通過這個頭告訴伺服器,它是從哪個資源來訪問伺服器的。(一般用於防盜鏈) User-Agent | 客戶機通過這個頭告訴伺服器,客戶機的軟體環境 Cookie | 客戶機通過這個頭告訴伺服器,可以向伺服器帶資料 Refresh | 伺服器通過這個頭,告訴瀏覽器隔多長時間重新整理一次 Content-Type | 伺服器通過這個頭,回送資料的型別 Content-Language | 伺服器通過這個頭,告訴伺服器的語言環境 Server | 伺服器通過這個頭,告訴瀏覽器伺服器的型別 Content-Encoding | 伺服器通過這個頭,告訴瀏覽器資料採用的壓縮格式 Content-Length | 伺服器通過這個頭,告訴瀏覽器回送資料的長度

6. 響應的編碼

響應狀態碼

響應狀態程式碼有三位數字組成,第一個數字定義了響應的類別,且有五種可能取值。 常見狀態碼:

號碼 | 含義 -----|--- 100~199 | 表示伺服器成功接收部分請求,要求客戶端繼續提交其餘請求才能完成整個處理過程 200~299 | 表示伺服器成功接收請求並已完成整個處理過程。常用200(OK 請求成功) 300~399 | 為完成請求,客戶需進一步細化請求。例如:請求的資源已經移動一個新地址、常用302(所請求的頁面已經臨時轉移至新的url)、307和304(使用快取資源) 400~499 | 客戶端的請求有錯誤,常用404(伺服器無法找到被請求的頁面)、403(伺服器拒絕訪問,許可權不夠) 500~599 | 伺服器端出現錯誤,常用500(請求未完成。伺服器遇到不可預知的情況)

7. Ajax的請求獲取資料

有些網頁內容使用AJAX載入,而AJAX一般返回的是JSON,直接對AJAX地址進行post或get,就返回JSON資料了

8. 請求 SSL證書驗證

現在隨處可見 https 開頭的網站,urllib可以為 HTTPS 請求驗證SSL證書,就像web瀏覽器一樣,如果網站的SSL證書是經過CA認證的,則能夠正常訪問,如:

如果SSL證書驗證不通過,或者作業系統不信任伺服器的安全證書,比如瀏覽器在訪問12306網站如:的時候,會警告使用者證書不受信任。(據說 12306 網站證書是自己做的,沒有通過CA認證)

# 忽略SSL安全認證
context = ssl._create_unverified_context()
# 新增到context引數裡
response = urllib.request.urlopen(request, context = context)

Python入門基礎教程
http://www.makeru.com.cn/course/details/1804.html?s=143793
快速學習python基礎
http://www.makeru.com.cn/live/5427_1833.html?s=143793
建立python語言世界
http://www.makeru.com.cn/live/5427_1829.html?s=143793