思路:
將平時用的多的get和post請求封裝,提高代碼重用率。
其中Session類可以通過實例化,保存cookie信息,可以在程序結束前多次通過保存的cookie信息保持登錄狀態的訪問。
那么為什么不將所有的方法都封裝到類里呢?
(因為……累……)
不將所有方法都封裝到類里是因為有時發送請求時不需要攜帶cookie,那么就可以直接通過get,post函數發送請求即可。
而且,不使用cookie時就不需要實例化對象,減少資源的消耗。
最重要的一點是,可以少寫一行代碼😂……你想啊,調用一次就少寫一行,10次就是10行……四舍五入就是一萬行( ̄y▽ ̄)╭ Ohohoho.....
額……咳咳……好了,不扯了,下邊上代碼
源代碼:
1 # 導入請求包request和將字典轉換成bytes的包parse 2 from urllib import request, parse 3 # 導入請求失敗時報錯的包 4 from urllib.error import HTTPError, URLError 5 # 導入http中管理cookie的包 6 from http import cookiejar 7 8 9 # 將需要保存cookie的請求封裝成類 10 class Session(object): 11 def __init__(self): 12 # 創建cookie容器對象,cookie_object 13 cookie_object = cookiejar.CookieJar() 14 # 創建cookie管理器,handler 15 handler = request.HTTPCookieProcessor(cookie_object) 16 # 新建一個帶有cookie管理器的opener,替換原有的request.urlopen() 17 # opener 遇到有cookie的response的時候,調用handler內部的一個函數, 存儲到cookie object 18 self.opener = request.build_opener(handler) 19 20 # get請求 21 def get(self, url, headers=None): 22 return get(url, headers, self.opener) 23 24 # post請求 25 def post(self, url, form, headers=None): 26 return post(url, form, headers, self.opener) 27 28 29 # 封裝get請求 30 def get(url, headers=None, opener=None): 31 return urlrequest(url, headers=headers, opener=opener) 32 33 34 # 封裝post請求 35 def post(url, form, headers=None, opener=None): 36 return urlrequest(url, form, headers=headers, opener=opener) 37 38 39 # 發送請求函數 40 def urlrequest(url, form=None, headers=None, opener=None): 41 ''' 42 :param url: 訪問地址 43 :param form: post請求時發送的表單信息 44 :param headers: 頭信息 45 :param opener: 帶有cookie管理器的一個發送請求的東西 46 :return: 返回響應信息的讀取內容,response.read() 47 ''' 48 49 # 如果沒有傳入headers,則使用下邊默認headers 50 if headers == None: 51 headers = { 52 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36' 53 } 54 # 當發生異常時返回空的二進制類型的html_bytes 55 html_bytes = b'' 56 try: 57 if form: # POST請求 58 # 轉換成str 59 form_str = parse.urlencode(form) 60 # 轉換成bytes 61 form_bytes = form_str.encode('utf-8') 62 # 傳入post請求參數,form表單數據 63 req = request.Request(url, data=form_bytes, headers=headers) 64 else: # GET請求 65 req = request.Request(url, headers=headers) 66 # 發送請求,獲取響應 67 if opener: # 通過實例化Session類時,通過opener發送請求 68 response = opener.open(req) 69 else: # 直接通過urlopen發送請求 70 response = request.urlopen(req) 71 # 讀取響應數據 72 html_bytes = response.read() 73 except HTTPError as e: 74 print(e) 75 except URLError as e: 76 print(e) 77 # 返回二進制響應結果 78 return html_bytes 79 80 81 if __name__ == '__main__': 82 # 百度測試get請求 83 url = 'http://www.baidu.com' 84 html_byte = get(url) 85 print(html_byte) 86 print('-'*50) 87 # 百度翻譯測試post請求 88 url = 'http://fanyi.baidu.com/sug' 89 form = { 90 'kw': '呵呵' 91 } 92 html_bytes = post(url, form=form) 93 print(html_bytes)