基于Python-实现JD数坊自动化计算(仅供学习)

各位ISV的打工人们,你们还在为了数据需求,拼死拼活手动圈数吗?不同类目、不同标签,by男女还是byday的数据,加班圈数?本人会点python,只要会一点书写的逻辑就能实现数坊的自动化取数,只为工作提效提效提效,尤其是如今的数坊已经变成了实时计算的天下!!!

接下来,我们就此开始→


1、主要使用模块——request库

使用request告诉数坊,你要干什么,但前提是,你得告诉他你是谁?所以,我们得定义url、请求头,如下:

import request

url = 'https://4a.jd.com/datamill/api/audienceManagement/predictAudienceSize'
def get_headers(cookie):
    headers = {
        "user-agent" : 'Mozilla/5.0',
        "content-type": 'application/json',
        "cookie" : str(cookie)
    }
    return headers

当我们打包好数据逻辑的json主体后,就可以传给数坊,数坊会反馈给你一个结果;

res = requests.post(url, headers=headers,data=json.dumps(body, cls=ComplexEncoder)).json()['result']

2、模块json解析

需要告诉数坊的body主体,其实在日常的手动圈数过程中能够看到,可以提前打开开发者工具,会看到一个名称为 PredictAudienceSize 的请求将其响应全选复制,粘贴到json.cn中可以看到类似如下的内容:

{
    "audienceDefinition":{
        "type":"intersection",
        "children":[
                {
                    "type":"union",
                    "children":[模块1,模块2]
                },
                模块3
        ]
    }
}

其中,"type"的值为交并差的逻辑,而与其并列的"children"的值为所需要圈选的数据模块。当模块大于2个及以上时,需要重新进行打包封装好,这也是为什么数坊在圈选逻辑时,能够进行加括号的处理,而TM的数据银行(DB)及策略中心(SC)的逻辑只能按顺序进行圈选。

例如:

(逻辑)【模块1,模块2】进行第一次打包处理;

(逻辑)【(逻辑)【模块1,模块2】,模块3】进行第二次打包处理;

以此类推……

根据上述解析,定义打包类型的函数:

#模块打包
def get_inbody(op,ls):
    res = {
        "type":str(op),"children": ls
    }
    return res

#整合body
def get_body_ls(inter_body):
    body={}
    body["audienceDefinition"] = inter_body
    body["crowdDataType"] = "all"
    return body

3、模块标签内容

例如浏览行为-店铺内商品模块内容为:


#【浏览行为 店铺内商品】 
def get_browAll_dp_jd(st,ed):     #开始时间,结束时间
    res ={
        "cardType":"view",
        "cardTitle":"浏览行为",
        "cardCode":"300658",
        "categoryPath":"用户行为>核心行为>浏览行为",
        "type":"behaviorV2",
        "key":"view",
        "screen":"all",
        "dimension":4, #浏览维度
        "shopName":"*****店铺名",
        "shopCode":*******,#店铺代码
        "isRelativeTime":False,
        "startDate": str(st),
        "endDate": str(ed),
        "frequency":{"operator":"nolimit"},
        "modelFlag":"all",
        "price":{"operator":"nolimit"},
        "displayDef":"1",
        "cardIndex":0
    }
    return res

res中,"shopname"、"shopcode"为固定圈选的店铺名及代码,"startDate"、"endDate"为浏览行为的起止时间;

此外,标签值是可以根据个人需求进行更改,例如圈选全平台类目时,可以重新定义传入的类目id等等

4、按数据需求书写循环逻辑等等,利用request的响应进行打印。

例如,数据需求是:

  • 2023年3月9日到27日每一天
  • 交男女
  • 购买(口红类目)

那么,数据量为19*2=38个数据,可以在5分钟内写完循环代码,后台运行输出。

for g in ["男","女"]:
    for i in range(9,28):
        ls_1 = []
        ls_1.append(get_buy_leimu_jd(st = "2023-3-"+str(i),ed ="2023-3-"+str(i),card_ls = "1316_1387_1425",p_min=200,p_max=500))
        ls_1.append(get_gender_jd(g))
# #     ls_1.append(get_browClass_jd(st = "2022-3-"+str(i),ed =  "2022-3-"+str(i),cate_id = y))
        inbody_1 = get_inbody(op = "intersection",ls = ls_1)

        body = get_body_ls(inbody_1)
#         body = get_leimu_body_ls(st = "2023-3-9",ed ="2023-3-20",gender =None)
        res = requests.post(url, headers=headers,data=json.dumps(body, cls=ComplexEncoder)).json()['result']
        print("口红"+"2023-3-"+str(i)+str(g)+" : "+str(res['audienceSize']))

PS:该部分时间循环可以用datetime模块进行时间循环。

如果有圈数需求或完整代码的同学,可以私信我。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值