Ejemplo n.º 1
0
    def do_request(self, url, method, params, payloads):
        """重写这部分"""
        retry = scf.retry
        html = 'null_html'
        response = None
        status_code = 400
        while retry > 0:
            try:
                # 选择执行的方式
                if method == 'GET':
                    # 请求前判断是否有参数,有的话添加到session里,请求后则删除
                    self.update_params(params)
                    response = self.GET_request(url)
                    self.discard_params()

                elif method == 'POST':
                    response = self.POST_request(url, payloads)

            except Exception as e:
                # 输出log, 这里的错误都是网络上的错误
                # logger.info('请求出错, 错误原因:', exc_info=True, extra=filter_dict)
                logger.info('请求出错, 错误原因:\t{0}'.format(e), extra=filter_dict)
                retry -= 1

            # 要重新判断status
            # 拿到response后,处理
            if response is not None:
                status_code = response.status_code
                html = response.content.decode('utf8')
                break
            retry -= 1
        return html, status_code
Ejemplo n.º 2
0
    def update_cookie_with_response(self, cookie):
        """通过response这个对象去更新cookie

        **这里一个强制性的要求就是,请求后,更新cookie**

        这里需要关注,当请求的response是无效的
        更新cookie时候会报错,这里需要一个错误提示
        """
        try:
            self.s.cookies.update(cookie)
        except:
            # TODO 这里做一个日志输出
            logger.info("response更新cookie数据失败,可能请求失败", extra=filter_dict)
Ejemplo n.º 3
0
 def update_cookie_with_outer(self, outer_cookie):
     """通过外部加载去更新cookie
     通常使用场景
     1. 带cookie绕过服务器验证
     2. 带cookie模仿用户去请求数据
     """
     try:
         check_params(outer_cookie)
     except Exception as e:
         # TODO 这里做一个日志输出
         logger.info("session更新外部cookie数据失败,可能请求失败\t{0}".format(e), extra=filter_dict)
     
     # cookie验证通过后,再更新cookie        
     self.s.cookies.update(outer_cookie)
     return
Ejemplo n.º 4
0
    def deal_status_code(self, status_code):
        """这个方法的意义在于服务器相应后,针对相应内容做处理

        2xx: 200是正常, 203正常响应,但是返回别的东西
        3xx: 重定向,在请求中已经规避了这部分
        4xx: 客户端错误
        5xx: 服务器错误
        """
        result = True
        if status_code >= 300 or status_code == 203:
            result = False
            # TODO: 添加logging
            logger.info('请求出现状态码异常:\t{0}'.format(status_code),
                        extra=filter_dict)
        return result
Ejemplo n.º 5
0
    def update_headers(self, params):
        """通过外部传入headers更新自身的headers

        可以是更新headers里的某一个字段
        也可以是更新headers里的全部

        执行之前应该先把其session.headers.clear()
        """
        try:
            check_params(params)
        except Exception as e:
            # TODO 这里做一个日志输出
            logger.info("session更新headers数据失败,可能请求失败\t{0}".format(e), extra=filter_dict)
        
        self.s.headers.clear()
        self.s.headers.update(params)
        return
Ejemplo n.º 6
0
    def do_request(self, url, method, params, payloads):
        """根据指定的请求方式去请求"""
        retry = scf.retry
        # 有的网页直接反空,不建议用空,不好去分析原因,
        html = 'null_html'
        while retry > 0:
            response = None
            is_go_on = False
            try:
                # 选择执行的方式
                if method == 'GET':
                    # 请求前判断是否有参数,有的话添加到session里,请求后则删除
                    self.update_params(params)
                    response = self.GET_request(url)
                    self.discard_params()

                elif method == 'POST':
                    response = self.POST_request(url, payloads)

            except Exception as e:
                # 输出log, 这里的错误都是网络上的错误
                # logger.info('请求出错, 错误原因:', exc_info=True, extra=filter_dict)
                logger.info('请求出错, 错误原因:\t{0}'.format(e), extra=filter_dict)
                time.sleep(error_sleep)

            else:
                # 拿到response后,处理
                status_code = response.status_code
                is_go_on = self.deal_status_code(status_code)
                """
                # 2018-09-25 多此一举,不需要
                # 更新cookie
                self.update_cookie_with_response(response.cookies)
                """
                if is_go_on:
                    # 返回html

                    try:
                        html = response.content.decode(scf.ec_u)
                    except:
                        html = response.text
                    break
            retry -= 1
            time.sleep(r_sleep)
        return html
Ejemplo n.º 7
0
    def update_cookie_with_response(self, cookie):
        """通过response这个对象去更新cookie

        **这里一个强制性的要求就是,请求后,更新cookie**

        这里需要关注,当请求的response是无效的
        更新cookie时候会报错,这里需要一个错误提示
        """

        # date: 2018-09-25 这是个没用的funs,session会自动更新其cookie,然而一开始指定的字段不会改变
        try:
            check_params(cookie)
        except Exception as e:
            # TODO 这里做一个日志输出
            logger.info("response更新cookie数据失败,可能请求失败\t{0}".format(e), extra=filter_dict)
        
        # cookie验证通过后,再更新cookie
        self.s.cookies.update(cookie)