十Python之Http Web服務(網頁抓取二)

    上一篇講了網頁抓取的基礎,分析html,可是咱們所獲得的html內容必須是經過編程的方式獲取到的。 html

    簡單地講,HTTP web 服務是指以編程的方式直接使用 HTTP 操做從遠程服務器發送和接收數據。P python

ython3 帶有兩個庫用於和HTTP web 服務交互: web

  •     http.client 是實現了RFC 2616, HTTP 協議的底層庫。
  •     urllib.request 創建在http.client之上一個抽象層。 它爲訪問HTTP 和 FTP 服務器提供了一個標準的API,能夠自動跟隨HTTP 重定向, 而且處理了一些常見形式的HTTP 認證。

1. 一個簡單的http 服務請求      ajax

import urllib.request as request

if __name__ == '__main__':
    response = request.urlopen("http://www.baidu.com")
    data = response.read()
    print(type(data))       # <class 'bytes'>
    print(data)             #輸出字節碼內容
    print(str(data,encoding = "utf-8")) #將字節碼轉換成utf-8編碼的字符串

    (1)在Python中操做http web請求很是簡單;urllib.request模塊有一個方便的函數urlopen() ,它接受你所要獲取的頁面地址,而後返回一個類文件對象,您只要調用它的read()方法就能夠得到網頁的所有內容 編程

    (2)urlopen().read()方法老是返回bytes對象,而不是字符串。記住字節僅僅是字節,字符只是一種抽象。 HTTP 服務器不關心抽象的東西。若是你請求一個資源,你獲得字節。 若是你須要一個字符串,你須要肯定字符編碼,並顯式的將其轉化成字符串。  緩存

2. 使用post請求發送數據        服務器

import urllib.request as request
from urllib.parse import urlencode

if __name__ == '__main__':
    param = {'email':'abc@163.com','password':'test','origURL':'http://www.renren.com/Home.do','domain':'renren.com'}
    param = urlencode(param).encode('utf-8') #url編碼後再進行utf-8轉換成bytes
    print(type(param)) # <class 'bytes'>
    print(param)       #b'origURL=http%3A%2F%2Fwww.renren.com%2FHome.do&domain=renren.com&password=test&email=abc%40163.com'
    response = request.urlopen("http://www.renren.com/ajaxLogin/login",param)
    print(str(response.read(),'utf-8')) #會看到結果裏有提示用戶名密碼不匹配

    (1)post請求發送的數據不能跟在url後面,因此咱們能夠將字典類型的數據經過urlencode轉化成字符串的數據格式,再經過encode轉化成字節碼的形式。 dom

    (2)urlopen第二個參數即爲post提交的bytes類型的數據。 函數

    (3)模擬了一我的人的登錄,在返回結果裏面能夠收到服務器的返回「您的用戶名和密碼不匹配」 ,說明咱們的數據已經經過post提交到了服務器(就算此處用正確的用戶名密碼也登錄不進去,由於人人網的密碼是加密傳遞的,須要加密後的密碼才能登錄成功) post

3. httplib2介紹

    httplib2一個第三方的開源庫,它比http.client更完整的實現了HTTP協議,同時比urllib.request提供了更好的抽象。能夠下載python3對應的版本(目前最新版本的名稱:httplib2‐python3‐0.5.0.zip),能夠經過https://httplib2.googlecode.com/files/httplib2-python3-0.5.0.zip 進行下載(有可能被牆,你懂的),下載後解壓進行安裝,個人解壓目錄爲:E:\daokun\python\diveintopython3-cn\httplib2-python3-0.5.0,在CMD窗口裏面cd到解壓目錄,又因個人python安裝在D:\Python32\目錄下,因此個人安裝命令爲:D:\Python32\python.exe setup.py install ,安裝後便可使用httplib2。 

    一個httplib2示例    

import httplib2

if __name__ == '__main__':
    httplib2.debuglevel = 1
    h = httplib2.Http(".cache")
    response,content = h.request("http://www.12306.cn/mormhweb/zxdt/tlxw_tdbtz53.html")
    print(len(content))
    print(response.status)
    print(response.fromcache)
    print(response)

    (1)httplib2.debuglevel = 1 能夠獲取一些隱藏信息,連接、發生的數據、響應及header頭信息等。

    (2)httplib2的主要接口是Http對象。你建立Http對象時老是應該傳入一個目錄名,具體緣由是在此目錄下建立緩存。目錄不須要事先存在,httplib2會在必要的時候建立它。

    (3)一旦你有了Http對象, 獲取數據很是簡單,以你要的數據的地址做爲參數調用request()方法就能夠了。這會對該URL執行一個HTTP GET請求.

    (4)request() 方法返回兩個值。第一個是一個httplib2.Response對象,其中包含了服務器返回的全部HTTP頭。好比, status爲200 表示請求成功。

   (5)content 變量包含了HTTP服務器返回的實際數據。數據以bytes對象返回,不是字符串。 若是你須要一個字符串,你須要肯定字符編碼並本身進行轉換。 

    httplib2的post請求    

import httplib2
from urllib.parse import urlencode

if __name__ == '__main__':
    httplib2.debuglevel = 1
    h = httplib2.Http(".cache")
    param = {'email':'abc@163.com','password':'test','origURL':'http://www.renren.com/Home.do','domain':'renren.com'}
    response3,content3 = h.request("http://www.renren.com/ajaxLogin/login","POST",urlencode(param))
    print(str(content3,'utf-8'))

    (1)h.request第一個參數是url。

    (2)第二個參數是請求的類型,這裏是POST。

    (3)第三個參數是通過url編碼後要發送到服務器的數據。 

    (4)一樣咱們在返回的結果裏面看到服務器的返回有提示說:用戶名或密碼錯誤。  

Http Web服務還有不少其餘的東西,好比緩存、壓縮等等,留給感興趣的人本身去學習。 

相關文章
相關標籤/搜索