1. 程式人生 > >python3 urllib包與http包的使用

python3 urllib包與http包的使用

urllib包和http包都是面向HTTP協議的。其中urllib主要用於處理 URL,使用urllib操作URL可以像使用和開啟本地檔案一樣地操作。而 http包則實現了對 HTTP協議的封裝,是urllib.request模組的底層。

1.urllib包簡介

2. http 包簡介

1.urllib包簡介

urllib包主要模組有:

1.urllib.request -----用於開啟 URL網址;

2.urllib.error ---------定義了常見的urllib.request會引發的異常;

3.urllib.parse---------用於解析 URL;

具體方法:

urllib.request.urlopen( url,data,proxies )   :用於開啟 url

引數如下:

   url:要進行操作的 URL地址

   data:可選項。向URL 傳遞的資料。

   proxies:可選項。使用的代理地址

import urllib.request

url = 'http://www.baidu.com'         #網頁為百度首頁
respone  = urllib.request.urlopen(url)   #開啟url地址,並返回一個 HTTPRespone例項
html = respone.read().decode('utf-8')   #呼叫例項的 read()方法,並用 utf-8進行解碼處理。就得出完整的百度的HTML檔案
print(html)   
部分列印結果:
<html>
<head>
    
    <meta http-equiv="content-type" content="text/html;charset=utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=Edge">
	<meta content="always" name="referrer">
    <meta name="theme-color" content="#2932e1">
    <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" />
    <link rel="search" type="application/opensearchdescription+xml" href="/content-search.xml" title="百度搜索" /> 
    <link rel="icon" sizes="any" mask href="//www.baidu.com/img/baidu.svg">


urllib.request.urlretrieve(url,filename,reporthook,data)   :用於將 URL的HTML檔案下載並儲存為本地檔案

引數如下:

     url:要下載的網頁

     filename:儲存在主機的路徑,可選項。

     reporthook:一個回撥函式,可選項。

     data:傳送的資料,一般用於 post,可選項。

特別:關於urlretrieve()的回撥函式reporthook:可以用來顯示下載的進度,幾乎已經封裝好

import urllib.request
def callbackfunc(blocknum, blocksize, totalsize):   #這三個引數是由 urlretrieve自動賦值的
    '''回撥函式
    @blocknum: 已經下載的資料塊
    @blocksize: 資料塊的大小
    @totalsize: 遠端檔案的大小
    '''
    percent = 100.0 * blocknum * blocksize / totalsize
    if percent > 100:
        percent = 100
    print( "%.2f%%"% percent)   #保留兩位小數

url = 'http://www.sina.com'

local = 'd:\\sina.html'                             #下載的html檔案儲存在 d盤的sina.html裡
urllib.request.urlretrieve(url,local,callbackfunc)    #沒下載完一個數據塊,就會執行回撥函式一次
執行結果:
//只顯示區域性
0.00%
1.38%
2.76%
4.13%
5.51%
6.89%


2. http包簡介

http包提供了 HTTP協議的一些功能,主要模組有:

http.client   --- 底層的 HTTP 協議的一些功能,可以為 urllib.request 模組所用

http.server   --- 提供了基於 socketserver模組的基本 HTTP伺服器類

http.cookies   --- cookies 的管理工具

http.client  :

HttpClient不是一個瀏覽器。它是一個客戶端的HTTP通訊實現庫。HttpClient的目標是傳送和接收HTTP報文。

兩個主要類(用於客戶端):

HTTPConnection   :基於HTTP協議的客戶端,指定 URL(網址) 後,可以 傳送請求報文 和 接收響應報文 

HTTPRespone       :基於 HTTP 協議的服務端迴應。一旦用 HTTPConnection 成功連線,可以呼叫相關方法返回該例項(HTTPRequest例項)。

(1)HTTPConnection 的方法:

構造方法: HTTPConnection( host,port,[timeout] )  返回一個HTTPConnection 例項

host:表示主機域名或 ip 地址

port:表示埠

timeout:阻塞操作將會在給定時間後超時。可選項

傳送請求報文方法:HTTPConnection.request( method,url,body =None,headers = {} )

method:傳送的操作,一般為 GET 或者 POST

url         :進行操作的 url

body     :所傳送的資料

headers:傳送的 HTTP頭部,是一個字典型別

獲取響應報文方法:HTTPConnection.getrespone(  )

關閉與伺服器的連線: HTTPConne.close()

傳送一個頭部:HTTPConnection.putheader( header,args[ ] )      #頭部以一個字典方式傳送

傳送一個空白行到伺服器,標誌頭部Header的結束:HTTPConnection.endheaders(  )

傳送資料到伺服器:HTTPConnection.send( data )       ,應該在endheaders()之後 和 getrespone()之前呼叫。

(2)HTTPRespone:

HTTPRespone物件:一旦用 HTTPConnection 成功連線,可以呼叫HTTPConnection.getrespone()返回該例項(HTTPRequest例項)。

HTTPRespone.getheader(name)  :返回頭部中的 name 欄位對應的值

HTTPRespone.getheaders( )       :以元組的方式返回整個頭部的資訊

HTTPRespone.read()                  :返回響應報文中的body部分,也即正文部分

HTTPRespone.status   #返回狀態碼

HTTPRespone.version  #返回 HTTP協議版本

http 包應用例項 。

from http.client import HTTPConnection

con = HTTPConnection('www.baidu.com',80)
con.request('GET','/')           #傳送請求報文
res = con.getresponse()          #獲取響應報文物件
print(res.status)   #200   (表示狀態碼)
print(res.reason)   #OK	  (表示狀態碼對應的意義)
print(res.read().decode('utf-8'))   #列印www.baidu.com的html