思路:
将平时用的多的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)