使用python封装get+post请求

思路:

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

 

转载于:https://www.cnblogs.com/zhxd-python/p/9471500.html

你可能感兴趣的:(使用python封装get+post请求)