当前位置: 首页 > news >正文

【python爬虫】设计自己的爬虫 1. request封装

通过requests.session().request 封装request方法
考虑到请求HTTP/2.0
同时封装httpx 来处理HTTP/2.0的请求

封装requests

# 遇到请求失败的情况时 重新请求,请求5次等待2s
@retry(stop_max_attempt_number=5, retry_on_result=lambda re_data: re_data is None, wait_fixed=2000)
    def requests_request(self, method, url, params=None, data=None, json=None, headers=None, files=None, verify=False,
                         cert=None, timeout=None, proxies=None, proxy=None, **kwargs):

        # 对异常进行捕获
        try:
            """
                封装request请求,将请求方法、请求地址,请求参数、请求头等信息入参。
                注 :verify: True/False,默认为True,认证SSL证书开关;cert: 本地SSL证书。如果不需要ssl认证,可将这两个入参去掉
            
                使用session管理器
                requests.session(): 维持会话,跨请求的时候保存参数   
            """

            # 处理代理
            proxies = None
            if proxy:
                proxies = {
                    'http://': 'http://' + proxy,
                    'https://': 'https://' + proxy,
                }
            #  使用requests.session().request 请求
            re_data = requests.session().request(method, url, params=params, data=data, json=json, headers=headers,
                                                 files=files, cert=cert, timeout=timeout, verify=verify,
                                                 proxies=proxies, **kwargs)
        # 异常处理 报错显示具体信息
        except Exception as e:
            re_data = None
            # 打印异常
            print("请求失败:{0}".format(e))
            logger.error("Error occurred: %s", str(e), exc_info=True)
            # 重新抛出异常,触发 retry 机制
            raise e
        # 返回响应结果
        return re_data

封装httpx

@retry(stop_max_attempt_number=5, retry_on_result=lambda re_data: re_data is None, wait_fixed=2000)
    def httpx_request(self, method, url, is_http2=False, content=None, data=None, files=None, json=None, params=None,
                      headers=None, cookies=None, timeout=None, extensions=None, proxy=None, **kwargs):

        # 对异常进行捕获
        try:
            """
                使用client  
                method.upper() 请求方法都转为大写
            """
            # 处理代理
            proxies = None
            if proxy:
                proxies = {
                    'http://': 'http://' + proxy,
                    'https://': 'https://' + proxy,
                }

            re_data = httpx.Client(http2=is_http2, proxies=proxies).request(method.upper(), url, content=content,
                                                                            data=data, files=files, json=json,
                                                                            params=params, headers=headers,
                                                                            cookies=cookies, timeout=timeout,
                                                                            extensions=extensions, **kwargs)
        # 异常处理 报错显示具体信息
        except Exception as e:
            re_data = None
            # 打印异常
            print("请求失败:{0}".format(e))
            logger.error("Error occurred: %s", str(e), exc_info=True)
            # 重新抛出异常,触发 retry 机制
            raise e
        # 返回响应结果
        return re_data

将两个请求封装在一个方法里

@retry(stop_max_attempt_number=5, retry_on_result=lambda re_data: re_data is None, wait_fixed=2000)
    def request(self, method, url, is_http2=False, params=None, data=None, json=None, headers=None, files=None,
                verify=False, cert=None, timeout=None, proxies=None, content=None, cookies=None, extensions=None,
                **kwargs):

        try:
            if is_http2:
                re_data = self.httpx_request(method=method.upper(), url=url, is_http2=is_http2, content=content,
                                             data=data, files=files, json=json, params=params, headers=headers,
                                             cookies=cookies, timeout=timeout, extensions=extensions, **kwargs)
            else:
                re_data = self.requests_request(method=method, url=url, params=params, data=data, json=json,
                                                headers=headers, files=files, cert=cert, timeout=timeout, verify=verify,
                                                proxies=proxies, **kwargs)

        # 异常处理 报错显示具体信息
        except Exception as e:
            re_data = None
            # 打印异常
            print("请求失败:{0}".format(e))
            logger.error("Error occurred: %s", str(e), exc_info=True)
            # 重新抛出异常,触发 retry 机制
            raise e
        # 返回响应结果
        return re_data

通过is_http2来区分

测试代码如下

if __name__ == '__main__':

    # request_requests 使用requests请求
    request_data = request_main.requests_request("get", 'https://spa16.scrape.center/')
    if request_data:
        print(request_data.text)
        print(request_data.status_code)

    # httpx 请求HTTP/2.0
    # response = re.httpx_request('GET', 'https://spa16.scrape.center/', True)
    # httpx 一般请求
    # headers = {'User-Agent': 'my-app/0.0.1'}
    # response = re.httpx_request('get', 'https://www.httpbin.org/get',params={'name': 'germey'})
    # print(response.text)
    # print(response.status_code)

    print(datetime.datetime.now())

相关文章:

  • 不一样的网络协议-------KCP协议
  • 实体店做商城小程序如何
  • vue2+antd——实现动态菜单路由功能——基础积累
  • 通过zookeeper浅谈一致性算法
  • Angular-03:组件模板
  • 使用Python批量修改PPT字体和提取全部文字到word
  • SMART PLC梯形速度曲线轨迹规划(追剪从轴控制)
  • [读论文] On Joint Learning for Solving Placement and Routing in Chip Design
  • 枚举类型 表示不同的 HTTP 状态码和相应的错误消息
  • 如何做好高校后勤管理?有什么好用的高校后勤管理软件?
  • Python Flask
  • leetCode 169. 多数元素 + 摩尔投票法
  • C# 图解教程 第5版 —— 第13章 数组
  • HTTPS协议:保障网络安全的加密通信协议
  • vue 路由懒加载,图片懒加载,组件懒加载
  • Steger算法实现结构光光条中心提取(python版本)
  • 2023.10.28 关于 synchronized 原理
  • Ubuntu编译 PCL 1.13.1 详细流程
  • 嵌入式系统>嵌入式硬件知识
  • OpenText 安全取证软件——降低成本和风险的同时,简化电子取证流程
  • 广告制作培训/网站seo优化检测
  • 京东云擎 wordpress/宁波seo在线优化方案
  • 温州做网站费用/东莞做网站优化
  • 安卓从网站获取视频怎么做/临沂百度公司地址
  • wap网站 开发/房产网站建设
  • 专业制作网站有哪些/百度知道官网