在python2里邊,用urllib庫和urllib2庫來實現請求的發送,但是在python3種在也不用那么麻煩了,因為只有一個庫了:Urllib.
urllib庫是python的標准庫,簡而言之就是不用自己安裝,使用時只需要import一下就好。
urllib庫包含4個模塊:
request: 最基本的HTTP請求模塊,用來發起請求,就和人們在瀏覽器上輸入網址來訪問網頁一樣。
error: 異常處理模塊,如果在請求時出現錯誤,用這個模塊來抓住異常,保證程序不會因為拋出異常而掛掉。
parse: 一個工具模塊,提供了許多URL處理方法,比如URL的拆分、合並等等。
robotparser:主要用來識別目標網站的robot.txt文件(基本用不上)
使用request模塊可以發送請求,主要有兩個方法: urlopen() Request()
urlopen()
首先來舉個栗子:我們來使用urlopen方法來請求“筆趣閣”網站
這是urllib()的API:
urllib.request.urlopen(url, data=None, [timeout,]*, cafile=None, capath=None, cadefault=False, context=None)
from urllib import request target_url = 'http://www.biquge9.com/' result = request.urlopen(target_url) # 返回的response是類文件對象 print(result.read().decode('utf-8'))
部分結果截圖(整個網頁內容太多放不下,我僅僅把網頁的頭部截了下來):
是不是很強大?幾行代碼就可以扒下想要網頁源代碼,只要源碼在手,里邊的內容還不是想怎么拿怎么拿
urllib庫的request模塊提供了最基本的用來構造HTTP請求的方法,整個請求過程已經完全封裝好了,我們只需要調用固定的方法,傳給相應的參數就可以發起請求了。
下邊我們來分析一下剛剛那幾行代碼:
from urllib import request # 用來導入urllib庫的request模塊
result = request.urlopen(target_url) # 使用urlopen方法來請求網頁
我們打印一下result的格式:
<class 'http.client.HTTPResponse'> 這是一個HTTPOResponse類型的對象。這個對象我們是無法直接獲取網頁內容的,但是或者對象包含了許多方法與屬性:如 read() readinto() getheader(name) getheaders() fileno() geturl() info() getcode() 等方法和msg version status reason debuglevel closed等屬性,通過調用這些方法和屬性,我們就可以獲取到關於html頁面的信息。
方法:
(1)read() 調用read()方法就可以查看到網頁的源代碼了。但是得到的是bytes字節的類型。
所以我們要用decode()將bytes進行解碼得到最終的html源代碼
(2)getheaders() 獲取返回的rsponse Headers,是一個列表:
這是我在瀏覽器種輸入網址 再按下F12,在控制台種看到的rsponse Header:
(3)getheader('Server') 獲取rsponse Headers中的某一個參數
(4)geturl() 獲取請求的目標頁面的url:
(5)fileno() 以整數的形式返回文件描述符
(6)info() 也是返回rsponse Headers種的內容,但並不是以列表的形式。
(7)getcode() 獲取請求的響應碼,如200, 403, 404等待。
屬性:
status 這個屬性的作用和哪個getcode()方法一樣,都是返回響應碼
msg 這個屬性用來判斷請求成不成功,成功的話會返回 “OK”
reason 這個和那個msg一樣,也是在判定請求是否成功
data參數
可選參數,當你在發起請求時想要傳遞數據,就可用它,
但是數據需要使用bytes()方法將參數轉化為字節流編碼,且當傳遞參數后,請求方式就由get變成post了
timeout參數
用於設置超時時間,單位是秒,如果請求超出了設置時間還沒有響應,就會拋出異常,如果不指定參數,就是用全局默認時間,它支持HTTP、HTTPS、FTP請求。
其他參數:
還有其他參數,如context參數, 他必須是ssl。SSLContext類型, 用來指定SSL設置。
cafile和capath參數 用來指定CA證書和他的路徑。
Request()
雖然urllib可以發起請求,但是幾個簡單的參數並不能構建一個完整的請求,比如它就無法加入headers信息,所以才有的Request()
我們同樣是使用urlopen()來發起請求,但是並不是直接請求url,而是請求一個Request對象,這樣可以將一個請求獨立封裝為一個對象,而且可以在這個請求對象中配置參數。
這是Request()的構造方法:
class urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
除了第一個url參數必傳,其他都是選傳參數
第二個data參數,和urlopen()請求中的data參數一樣,必須穿bytes()類型,如果它是字典,就得先用urllib.parse模塊中的urlencode()編碼。
第三個headers是一個字典,他就是請求頭,我們用來來傳入請求頭,可以在參數中直接傳,也可以利用add_header()方法進行添加。而請求頭中最重要的就是User-Agent和Cookies 這個咱們以后再說。
第四個參數origin_req_host指的是請求方的HOST莫名稱或者IP地址。
第五個unverifiable表示這個請求是否無法被驗證,默認為False
第六個參數method表示請求方式, 如GET、POST、PUT等
好了,urllib庫的第一節就先到這兒,不然篇幅太長了。