各位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模块进行时间循环。