封装(包含cookie)(from tuozhan_all import session)

from urllib import request, parse
from urllib.error import HTTPError, URLError
from http import cookiejar

# 创建session类,调用前实例化
class session(object):
    def __init__(self):
        # 通过对象保存cookie
        cookie_object = cookiejar.CookieJar()
        # 创建handler,handler对应一个操作
        handler = request.HTTPCookieProcessor(cookie_object)
        # 创建opener,调用handler内部函数,存储到cookie_object
        self.opener = request.build_opener(handler)

    def get(self,url, headers=None):
        return get(url, headers,self.opener)

    def post(self,url, form, headers=None):
        return post(url, form, headers,self.opener)

def get(url, headers=None,opener = None):
    return urlrequests(url, headers=headers,opener=opener)

def post(url, form, headers=None,opener = None):
    return urlrequests(url, form, headers=headers,opener=opener)

#b. post(url, form, headers=None)
#1. 传入url
#2. user_agent
#3. headers
#4. 定义Request
#5. urlopen
#6. 返回byte数组
def urlrequests(url, form=None, headers=None,opener=None):
    user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
    # 如果用户需要自行传入headers, 则覆盖之前的headers
    if headers == None:
        headers = {
            'User-Agent': user_agent
        }
    # 创建一个空的html_bytes,如try出错后,return html_bytes,程序不会崩溃
    html_bytes = b''
    try:
        if form:
            # POST
            # 2.1 转换成str
            form_str = parse.urlencode(form)
            #print(form_str)
            # 2.2 转换成bytes
            form_bytes = form_str.encode('utf-8')
            # 构建请求对象头
            req = request.Request(url, data=form_bytes, headers=headers)
            # 简写
            # req = request.Request(url,data=bytes(data_str,encoding='utf-8'))
        else:
            # GET
            # 构建请求对象头
            req = request.Request(url, headers=headers)
        # 如果有cookie,构建请求对象头用opener.open
        if opener:
            response=opener.open(req)
        else:
            # 反之用request
            response = request.urlopen(req)
        html_bytes = response.read()
    # 服务器错误连接失败
    except HTTPError as e:
        print(e)
    # 连接超时
    except URLError as e:
        print(e)

    return html_bytes

# 测试代码,如果此文件被掉包执行则以下代码不被执行
if __name__ == '__main__':
    url = 'http://fanyi.baidu.com/sug'
    while True:
        ke = input('请输入要翻译的词语:')
        form = {
            'kw': ke
        }
        html_bytes = post(url, form=form)
        print(html_bytes)

    # url = 'http://www.baidu.com'
    # html_byte = get(url)
    # print(html_byte)

猜你喜欢

转载自blog.csdn.net/q810935819/article/details/81676143