Skip to content

Fetch

封装requests,会话控制与接口交互管理


API说明

写python大家都会用requests发起请求,但是对于复杂的情况,直接用requests就会显得很复杂,比如:内网环境使用系统pac代理、保持会话、请求失败再次尝试、请求代理等,这些都是数据采集开发中常常遇到的问题,使用PYSunday的Fetch API来开发网页接口数据请求可以不用考虑这些问题

class sunday.core.Fetch(pacWifi=None, pacUrl=None, pacWifiName=None, proxy=None)

对requests进行封装,实现内网环境使用系统pac代理、保持会话、请求失败再次尝试、请求代理、返回结果安全json化等 Args: session: 会话变量 jsonErrorNumber: json错误编号 jsonErrorMessage: json错误提示文本 Usages: >>> from sunday.core.fetch import Fetch >>> fetch = Fetch() >>> fetch.get('https://www.baidu.com') <Response [200]> Args: pacWifi(str): wifi名称,如果当前网络连入的wifi相同则使用pac代理 pacUrl(str): url地址,尝试请求该url,如果能请求到则使用pac代理,一般为内网链接 proxy(str): 让请求使用代理,传入如:127.0.0.1:8888或者https://127.0.0.1:5555/getProxy Return: fetch

add_header(self, headers)

设置全局请求头 Args: headers(dict): 添加到请求头的字典

get(self, *args, **kwargs)

发起get请求并对返回结果调用json方法,调用方式与requests.get一致 Args: timeout_time(int): 超时尝试次数,默认为3次

post(self, *args, **kwargs)

发起post请求并对返回结果调用json方法,调用方式与requests.post一致 Args: timeout_time(int): 超时尝试次数,默认为3次

get_json(self, *args, **kwargs)

发起get请求并对返回结果调用json方法,调用方式与requests.get一致,由于对json方法做了安全处理建议在预期返回json数据的接口使用 Args: timeout_time(int): 超时尝试次数,默认为3次

post_json(self, *args, **kwargs)

发起post请求并对返回结果调用json方法,调用方式与requests.post一致,由于对json方法做了安全处理建议在预期返回json数据的接口使用 Args: timeout_time(int): 超时尝试次数,默认为3次

getCookiesDict(self)

将cookie转化为字典并返回 Return: dict

setCookie(self, name, value, domain, rest={}, **argvs)

增加新的cookie, 入参参考cookielib.Cookie中的定义 Args: name(str): cookie键名 value(str): cookie键值 domain(str): 主机名

setJsonError(self, jsonErrorMessage='服务器异常请稍后重试!', jsonErrorNumber=99999)

设置get_json与post_json方法中执行json化失败的报错配置,若配置后返回非json数据则直接报错 Args: jsonErrorMessage(str): 报错提示信息, 默认服务器异常请稍后重试! jsonErrorNumber(int): 报错code编码, 默认99999 Usages: >>> from sunday.core.fetch import Fetch >>> fetch = Fetch() >>> fetch.get('https://www.baidu.com') {'sunday_error': True, 'msg': '返回结果非JSON', 'url': 'https://www.baidu.com', 'text': ''} >>> fetch.setJsonError() >>> fetch.get('https://www.baidu.com') CustomError: '99999 服务器异常请稍后重试!'

提示

每个Fetch实例都是一个会话,如果同网站涉及cookie的请求请使用同一个Fetch实例

示例

1. 模拟多个客户端发起请求

通过设置代理和请求头的User-Agent值模拟不同的客户端,如下:

from sunday.core.fetch import Fetch

client = Fetch(proxy='101.102.103.104:8888')
client.add_header({
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:21.0) Gecko/20100101 Firefox/21.0',
  })
print(client.get_json('http://httpbin.org/get'))
"""
{
  'args': {},
  'headers': {
    'Accept': '*/*',
    'Accept-Encoding': 'gzip, deflate, br',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Cache-Control': 'no-cache',
    'Host': 'httpbin.org',
    'Pragma': 'no-cache',
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:21.0) Gecko/20100101 Firefox/21.0',
    'X-Amzn-Trace-Id': 'Root=1-63db4b51-2de83d893867d9636863e056'
  },
  'origin': '101.102.103.104',
  'url': 'http://httpbin.org/get',
}
"""

2. 设置超时时间及重试次数

from sunday.core.fetch import Fetch

fetch = Fetch()
fetch.get('http://www.baidu.com', timeout=60, timeout_time=10)