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
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)
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
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
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
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
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)