上一篇講了網頁抓取的基礎,分析html,可是咱們所獲得的html內容必須是經過編程的方式獲取到的。 html
簡單地講,HTTP web 服務是指以編程的方式直接使用 HTTP 操做從遠程服務器發送和接收數據。P python
ython3 帶有兩個庫用於和HTTP web 服務交互: web
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服務還有不少其餘的東西,好比緩存、壓縮等等,留給感興趣的人本身去學習。