get post 请求封装(含cookiejar)

from urllib import request,parse
# 导入urllib.error包中 HTTPError,URLError 模块   异常捕获
from urllib.error import HTTPError,URLError
# 导入 cookiejar 保存cookie
from http import cookiejar

class session(object):
    def __init__(self):
        # 通过对象保存cookie
        cookie_object = cookiejar.CookieJar()
        # handler 对应着一个操作
        handler = request.HTTPCookieProcessor(cookie_object)
        # opener 遇到有cookie的response的时候
        # 调用handler内部的一个函数,存储到cookie object
        self.opener = request.build_opener(handler)
    # 重新构建get请求调用下面def get的函数
    def get(self,url,headers=None):
        return get(url,headers,self.opener)

    # 重新构建post请求调用下面def post的函数
    def post(self,url,form,headers=None,):
        return post(url,form,headers,self.opener)


# 再次封装 如果是get请求直接调用 get(url,headers=None) ###headers可不写
# a.get(url,headers=None)
def get(url,headers=None,opener =None):
    return urlrequests(url,headers=headers,opener=opener)
# 再次封装 如果是post请求直接调用 post(url,form,headers=None) ### headers可不写
def post(url,form,headers=None,opener =None):
    return urlrequests(url,form,headers=headers,opener=opener)

#1. 传入url
#2. user_agent
#3. headers
#4. 定义Request
#5. urlopen
#6. 返回byte数组
def urlrequests(url,form=None,headers=None,opener=None):
    # 判断headers是否存在,如果不存在使用自定义headers
    if headers==None:
        headers = {
            'User-Agent': ' Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
        }
    html_bytes = b''#倒成二进制bytes格式
    try:
        # 如果form存在,为post请求执行if内程序
        if form:
            # POST
            # 2.1转换成str
            form_str=parse.urlencode(form)
            # 2.2转换成bytes
            from_bytes=form_str.encode('utf-8')
            req=request.Request(url,data=from_bytes,headers=headers)
        # 如果form不存在,为get请求执行else内程序
        else:
            # get
            req=request.Request(url,headers=headers)
        # 判断是否所有opener(cookie)
        # 如果有将直接执行opener.open()
        if opener:
            response = opener.open(req)#第二个参数设置为timeout 如果请求超时会报出except URLError错误
        # 如果没有opener(cookie)
        # 将按正常请求执行
        else:
            response = request.urlopen(req)
        html_bytes=response.read()
    except HTTPError as a:
        print(a)
    except URLError as e:
        print (e)
    except Exception as s:
        print(s)
    return html_bytes


if __name__ == '__main__':
    # url = 'http://fanyi.baidu.com/sug'
    # form = {
    #     'kw': '呵呵'
    # }
    # html_bytes = post(url, form=form)
    # print(html_bytes)

    url='http://www.xicidaili.com'#写入想要爬取的网站地址
    html_bytes =get(url)
    print(html_bytes.decode('utf-8'))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值