mdbq 3.7.2__py3-none-any.whl → 3.7.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mdbq/aggregation/query_data.py +139 -1
- mdbq/log/spider_logging.py +8 -1
- mdbq/other/download_sku_picture.py +1 -1
- mdbq/spider/aikucun.py +73 -3
- {mdbq-3.7.2.dist-info → mdbq-3.7.4.dist-info}/METADATA +1 -1
- {mdbq-3.7.2.dist-info → mdbq-3.7.4.dist-info}/RECORD +8 -8
- {mdbq-3.7.2.dist-info → mdbq-3.7.4.dist-info}/WHEEL +0 -0
- {mdbq-3.7.2.dist-info → mdbq-3.7.4.dist-info}/top_level.txt +0 -0
mdbq/aggregation/query_data.py
CHANGED
@@ -456,6 +456,117 @@ class MysqlDatasQuery:
|
|
456
456
|
)
|
457
457
|
return True
|
458
458
|
|
459
|
+
def _sj_wxt(self, db_name='聚合数据', table_name='圣积天猫店_主体报表', is_maximize=True):
|
460
|
+
start_date, end_date = self.months_data(num=self.months)
|
461
|
+
projection = {
|
462
|
+
'日期': 1,
|
463
|
+
'场景名字': 1,
|
464
|
+
'主体id': 1,
|
465
|
+
'花费': 1,
|
466
|
+
'展现量': 1,
|
467
|
+
'点击量': 1,
|
468
|
+
'总购物车数': 1,
|
469
|
+
'总成交笔数': 1,
|
470
|
+
'总成交金额': 1,
|
471
|
+
'自然流量曝光量': 1,
|
472
|
+
'直接成交笔数': 1,
|
473
|
+
'直接成交金额': 1,
|
474
|
+
'店铺名称': 1,
|
475
|
+
}
|
476
|
+
__res = []
|
477
|
+
for year in range(2024, datetime.datetime.today().year+1):
|
478
|
+
df = self.download.data_to_df(
|
479
|
+
db_name='推广数据_圣积天猫店',
|
480
|
+
table_name=f'主体报表_{year}',
|
481
|
+
start_date=start_date,
|
482
|
+
end_date=end_date,
|
483
|
+
projection=projection,
|
484
|
+
)
|
485
|
+
__res.append(df)
|
486
|
+
df = pd.concat(__res, ignore_index=True)
|
487
|
+
df.rename(columns={
|
488
|
+
'场景名字': '营销场景',
|
489
|
+
'主体id': '商品id',
|
490
|
+
'总购物车数': '加购量',
|
491
|
+
'总成交笔数': '成交笔数',
|
492
|
+
'总成交金额': '成交金额'
|
493
|
+
}, inplace=True)
|
494
|
+
df = df.astype({
|
495
|
+
'商品id': str,
|
496
|
+
'花费': 'float64',
|
497
|
+
'展现量': 'int64',
|
498
|
+
'点击量': 'int64',
|
499
|
+
'加购量': 'int64',
|
500
|
+
'成交笔数': 'int64',
|
501
|
+
'成交金额': 'float64',
|
502
|
+
'自然流量曝光量': 'int64',
|
503
|
+
'直接成交笔数': 'int64',
|
504
|
+
'直接成交金额': 'float64',
|
505
|
+
}, errors='raise')
|
506
|
+
df = df[df['花费'] > 0]
|
507
|
+
if is_maximize:
|
508
|
+
df = df.groupby(['日期', '店铺名称', '营销场景', '商品id', '花费', '点击量'], as_index=False).agg(
|
509
|
+
**{
|
510
|
+
'展现量': ('展现量', np.max),
|
511
|
+
'加购量': ('加购量', np.max),
|
512
|
+
'成交笔数': ('成交笔数', np.max),
|
513
|
+
'成交金额': ('成交金额', np.max),
|
514
|
+
'自然流量曝光量': ('自然流量曝光量', np.max),
|
515
|
+
'直接成交笔数': ('直接成交笔数', np.max),
|
516
|
+
'直接成交金额': ('直接成交金额', np.max)
|
517
|
+
}
|
518
|
+
)
|
519
|
+
else:
|
520
|
+
df = df.groupby(['日期', '店铺名称', '营销场景', '商品id', '花费', '点击量'], as_index=False).agg(
|
521
|
+
**{
|
522
|
+
'展现量': ('展现量', np.min),
|
523
|
+
'加购量': ('加购量', np.min),
|
524
|
+
'成交笔数': ('成交笔数', np.min),
|
525
|
+
'成交金额': ('成交金额', np.min),
|
526
|
+
'自然流量曝光量': ('自然流量曝光量', np.min),
|
527
|
+
'直接成交笔数': ('直接成交笔数', np.max),
|
528
|
+
'直接成交金额': ('直接成交金额', np.max)
|
529
|
+
}
|
530
|
+
)
|
531
|
+
df.insert(loc=1, column='推广渠道', value='万相台无界版') # df中插入新列
|
532
|
+
set_typ = {
|
533
|
+
'日期': 'date',
|
534
|
+
'推广渠道': 'varchar(100)',
|
535
|
+
'店铺名称': 'varchar(100)',
|
536
|
+
'营销场景': 'varchar(100)',
|
537
|
+
'商品id': 'bigint',
|
538
|
+
'花费': 'decimal(12,2)',
|
539
|
+
'展现量': 'int',
|
540
|
+
'点击量': 'int',
|
541
|
+
'加购量': 'int',
|
542
|
+
'成交笔数': 'int',
|
543
|
+
'成交金额': 'decimal(12,2)',
|
544
|
+
'自然流量曝光量': 'int',
|
545
|
+
'直接成交笔数': 'int',
|
546
|
+
'直接成交金额': 'decimal(12,2)',
|
547
|
+
}
|
548
|
+
|
549
|
+
if not self.update_service:
|
550
|
+
return
|
551
|
+
min_date = df['日期'].min()
|
552
|
+
max_date = df['日期'].max()
|
553
|
+
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
554
|
+
logger.info(f'{now} 正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
|
555
|
+
m_engine.df_to_mysql(
|
556
|
+
df=df,
|
557
|
+
db_name=db_name,
|
558
|
+
table_name=table_name,
|
559
|
+
# icm_update=['日期', '推广渠道', '营销场景', '商品id', '花费'], # 增量更新, 在聚合数据中使用,其他不要用
|
560
|
+
move_insert=True, # 先删除,再插入
|
561
|
+
df_sql=False, # 值为 True 时使用 df.to_sql 函数上传整个表, 不会排重
|
562
|
+
drop_duplicates=False, # 值为 True 时检查重复数据再插入,反之直接上传,会比较慢
|
563
|
+
count=None,
|
564
|
+
filename=None, # 用来追踪处理进度
|
565
|
+
reset_id=True, # 是否重置自增列
|
566
|
+
set_typ=set_typ,
|
567
|
+
)
|
568
|
+
return True
|
569
|
+
|
459
570
|
@try_except
|
460
571
|
def syj(self, db_name='聚合数据', table_name='生意经_宝贝指标'):
|
461
572
|
start_date, end_date = self.months_data(num=self.months)
|
@@ -2366,6 +2477,32 @@ class MysqlDatasQuery:
|
|
2366
2477
|
'成交金额': ('总成交金额', np.max)
|
2367
2478
|
}
|
2368
2479
|
)
|
2480
|
+
# sj圣积
|
2481
|
+
__res = []
|
2482
|
+
for year in range(2024, datetime.datetime.today().year + 1):
|
2483
|
+
df_sj = self.download.data_to_df(
|
2484
|
+
db_name='推广数据_圣积天猫店',
|
2485
|
+
table_name=f'营销场景报表_{year}',
|
2486
|
+
start_date=start_date,
|
2487
|
+
end_date=end_date,
|
2488
|
+
projection=projection,
|
2489
|
+
)
|
2490
|
+
__res.append(df_sj)
|
2491
|
+
df_sj = pd.concat(__res, ignore_index=True)
|
2492
|
+
if len(df_sj) > 0:
|
2493
|
+
df_sj.rename(columns={'场景名字': '营销场景'}, inplace=True)
|
2494
|
+
df_sj['店铺名称'] = df_sj['店铺名称'].apply(lambda x: 'saintJack旗舰店' if x == 'SAINTJACK旗舰店' else x)
|
2495
|
+
df_sj = df_sj.groupby(
|
2496
|
+
['日期', '店铺名称', '场景id', '营销场景', '花费', '展现量'],
|
2497
|
+
as_index=False).agg(
|
2498
|
+
**{
|
2499
|
+
# '展现量': ('展现量', np.max),
|
2500
|
+
'点击量': ('点击量', np.max),
|
2501
|
+
'加购量': ('总购物车数', np.max),
|
2502
|
+
'成交笔数': ('总成交笔数', np.max),
|
2503
|
+
'成交金额': ('总成交金额', np.max)
|
2504
|
+
}
|
2505
|
+
)
|
2369
2506
|
# 淘宝店
|
2370
2507
|
__res = []
|
2371
2508
|
for year in range(2024, datetime.datetime.today().year + 1):
|
@@ -2600,7 +2737,7 @@ class MysqlDatasQuery:
|
|
2600
2737
|
df_jd_qzyx = df_jd_qzyx[['日期', '店铺名称', '营销场景', '花费', '展现量', '点击量', '成交笔数', '成交金额']]
|
2601
2738
|
df_jd_qzyx = df_jd_qzyx[df_jd_qzyx['花费'] > 0]
|
2602
2739
|
|
2603
|
-
_datas = [item for item in [df_tm, df_tb, df_tb_qzt, df_al, df_tm_pxb, df_tm_living, df_jd, df_jd_qzyx] if len(item) > 0] # 阻止空的 dataframe
|
2740
|
+
_datas = [item for item in [df_tm, df_tb, df_tb_qzt, df_al, df_sj, df_tm_pxb, df_tm_living, df_jd, df_jd_qzyx] if len(item) > 0] # 阻止空的 dataframe
|
2604
2741
|
df = pd.concat(_datas, axis=0, ignore_index=True)
|
2605
2742
|
df['日期'] = pd.to_datetime(df['日期'], format='%Y-%m-%d', errors='ignore') # 转换日期列
|
2606
2743
|
df = df.groupby(
|
@@ -3604,6 +3741,7 @@ def query1(months=1, less_dict=[]):
|
|
3604
3741
|
sdq.update_service = True # 调试时加,true: 将数据写入 mysql 服务器
|
3605
3742
|
|
3606
3743
|
sdq._ald_wxt(db_name='聚合数据', table_name='奥莱店_主体报表')
|
3744
|
+
sdq._sj_wxt(db_name='聚合数据', table_name='圣积天猫店_主体报表')
|
3607
3745
|
sdq._tb_wxt(db_name='聚合数据', table_name='淘宝_主体报表')
|
3608
3746
|
sdq.tg_wxt(db_name='聚合数据', table_name='天猫_主体报表')
|
3609
3747
|
sdq.syj(db_name='聚合数据', table_name='生意经_宝贝指标')
|
mdbq/log/spider_logging.py
CHANGED
@@ -5,7 +5,10 @@ import os
|
|
5
5
|
import getpass
|
6
6
|
|
7
7
|
|
8
|
-
def setup_logging():
|
8
|
+
def setup_logging(reMoveOldHandler=True):
|
9
|
+
"""
|
10
|
+
reMoveOldHandler: 替换根日志记录器的所有现有处理器
|
11
|
+
"""
|
9
12
|
if platform.system() == 'Windows':
|
10
13
|
from mdbq.pbix import refresh_all
|
11
14
|
D_PATH = os.path.join(f'C:\\Users\\{getpass.getuser()}\\Downloads')
|
@@ -38,6 +41,10 @@ def setup_logging():
|
|
38
41
|
|
39
42
|
# 获取根日志记录器并添加Handler
|
40
43
|
logger = logging.getLogger()
|
44
|
+
if reMoveOldHandler:
|
45
|
+
# 移除根日志记录器的所有现有处理器
|
46
|
+
for handler in logger.handlers[:]: # 使用[:]来创建handlers列表的一个副本,因为我们在迭代时修改列表
|
47
|
+
logger.removeHandler(handler)
|
41
48
|
logger.addHandler(file_handler)
|
42
49
|
logger.addHandler(stream_handler)
|
43
50
|
logger.setLevel(logging.INFO) # 设置根日志级别
|
mdbq/spider/aikucun.py
CHANGED
@@ -19,7 +19,8 @@ from mdbq.config import set_support
|
|
19
19
|
from selenium.webdriver.common.keys import Keys
|
20
20
|
from mdbq.other import ua_sj
|
21
21
|
from mdbq.mysql import mysql
|
22
|
-
from mdbq.
|
22
|
+
from mdbq.mysql import s_query
|
23
|
+
from mdbq.config import default
|
23
24
|
import socket
|
24
25
|
|
25
26
|
warnings.filterwarnings('ignore')
|
@@ -37,6 +38,9 @@ else:
|
|
37
38
|
upload_path = os.path.join(D_PATH, '数据上传中心', '爱库存') # 此目录位于下载文件夹
|
38
39
|
|
39
40
|
m_engine, username, password, host, port = default.get_mysql_engine(platform='Windows', hostname='xigua_lx', sql='mysql', local='remoto', config_file=None)
|
41
|
+
print(username, password, host, port)
|
42
|
+
# 实例化一个数据查询类,用来获取 cookies 表数据
|
43
|
+
download = s_query.QueryDatas(username=username, password=password, host=host, port=port)
|
40
44
|
|
41
45
|
|
42
46
|
def get_cookie_aikucun():
|
@@ -118,6 +122,40 @@ def get_cookie_aikucun():
|
|
118
122
|
continue
|
119
123
|
else:
|
120
124
|
new_cookies_list.append(cookie)
|
125
|
+
|
126
|
+
######### 新增 写入 mysql #########
|
127
|
+
set_typ = {
|
128
|
+
'日期': 'date',
|
129
|
+
'domain': 'varchar(100)',
|
130
|
+
'expiry': 'int',
|
131
|
+
'httpOnly': 'varchar(20)',
|
132
|
+
'name': 'varchar(50)',
|
133
|
+
'path': 'varchar(50)',
|
134
|
+
'sameSite': 'varchar(50)',
|
135
|
+
'secure': 'varchar(50)',
|
136
|
+
'value': 'text',
|
137
|
+
'更新时间': 'timestamp'
|
138
|
+
}
|
139
|
+
_cookies_list = []
|
140
|
+
for item in cookies_list:
|
141
|
+
new_dict = {'日期': datetime.datetime.today().strftime('%Y-%m-%d'), }
|
142
|
+
for k, v in item.items():
|
143
|
+
if v is None:
|
144
|
+
v = 'None'
|
145
|
+
new_dict.update({k: v})
|
146
|
+
if 'expiry' not in new_dict:
|
147
|
+
new_dict.update({'expiry': 0})
|
148
|
+
new_dict.update({'更新时间': datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')})
|
149
|
+
_cookies_list.append(new_dict)
|
150
|
+
m_engine.insert_many_dict(
|
151
|
+
db_name='cookie文件',
|
152
|
+
table_name='main_aikucun',
|
153
|
+
dict_data_list=_cookies_list,
|
154
|
+
set_typ=set_typ,
|
155
|
+
allow_not_null=True, # 允许插入空值
|
156
|
+
)
|
157
|
+
#############################################
|
158
|
+
|
121
159
|
json_file = os.path.join(cookie_path, filename_aikucun)
|
122
160
|
with open(json_file, 'w', encoding='utf-8') as f:
|
123
161
|
json.dump(new_cookies_list, f, ensure_ascii=False, sort_keys=True, indent=4)
|
@@ -219,6 +257,38 @@ class AikuCun:
|
|
219
257
|
cookies_list = json.load(f) # 使用json读取cookies 注意读取的是文件 所以用load而不是loads
|
220
258
|
for cookie in cookies_list:
|
221
259
|
_driver.add_cookie(cookie) # 添加cookies信息
|
260
|
+
# print(cookie)
|
261
|
+
db_name = 'cookie文件'
|
262
|
+
table_name = f'main_{shop_name}'
|
263
|
+
df = download.data_to_df(
|
264
|
+
db_name=db_name,
|
265
|
+
table_name=table_name,
|
266
|
+
start_date='2025-01-01',
|
267
|
+
end_date='2030-12-11',
|
268
|
+
projection={
|
269
|
+
'domain': 1,
|
270
|
+
'expiry': 1,
|
271
|
+
'httpOnly': 1,
|
272
|
+
'name': 1,
|
273
|
+
'path': 1,
|
274
|
+
'sameSite': 1,
|
275
|
+
'secure': 1,
|
276
|
+
'value': 1,
|
277
|
+
'更新时间': 1
|
278
|
+
},
|
279
|
+
)
|
280
|
+
# 仅保留最新日期的数据
|
281
|
+
idx = df.groupby('name')['更新时间'].idxmax()
|
282
|
+
df = df.loc[idx]
|
283
|
+
df.pop('更新时间')
|
284
|
+
for item in df.to_dict('records'):
|
285
|
+
new_dict = {}
|
286
|
+
for k, v in item.items():
|
287
|
+
if v == 'False':
|
288
|
+
v = False
|
289
|
+
new_dict.update({k: v})
|
290
|
+
# _driver.add_cookie(new_dict) # 添加cookies信息
|
291
|
+
|
222
292
|
_driver.refresh()
|
223
293
|
time.sleep(3)
|
224
294
|
return _driver
|
@@ -417,8 +487,8 @@ class AikuCunNew:
|
|
417
487
|
|
418
488
|
|
419
489
|
if __name__ == '__main__':
|
420
|
-
get_cookie_aikucun() # 登录并获取 cookies
|
421
|
-
akucun(date_num=
|
490
|
+
# get_cookie_aikucun() # 登录并获取 cookies
|
491
|
+
akucun(date_num=30, headless=True) # 下载数据
|
422
492
|
|
423
493
|
# a = AikuCunNew(shop_name='aikucun')
|
424
494
|
# a.akc()
|
@@ -4,7 +4,7 @@ mdbq/aggregation/__init__.py,sha256=EeDqX2Aml6SPx8363J-v1lz0EcZtgwIBYyCJV6CcEDU,
|
|
4
4
|
mdbq/aggregation/aggregation_bak.py,sha256=-yzApnlqSN2L0E1YMu5ml-W827qpKQvWPCOI7jj2kzY,80264
|
5
5
|
mdbq/aggregation/datashow_bak.py,sha256=1AYSIDkdUx-4as1Ax2rPj0cExM9d-qFMrFYLAaPHNuk,54962
|
6
6
|
mdbq/aggregation/optimize_data.py,sha256=foZGLDGJRhM2qOr2mTvB3InDFId7r4KBXrJfB3-xq1k,2639
|
7
|
-
mdbq/aggregation/query_data.py,sha256=
|
7
|
+
mdbq/aggregation/query_data.py,sha256=wYsBTRx6vmZ-dKQRdl_pnOPcI2djyIIb92MOUy097E0,174930
|
8
8
|
mdbq/bdup/__init__.py,sha256=AkhsGk81SkG1c8FqDH5tRq-8MZmFobVbN60DTyukYTY,28
|
9
9
|
mdbq/bdup/bdup.py,sha256=hJs815hGFwm_X5bP2i9XugG2w2ZY_F0n3-Q0hVpIPPw,4892
|
10
10
|
mdbq/config/__init__.py,sha256=jso1oHcy6cJEfa7udS_9uO5X6kZLoPBF8l3wCYmr5dM,18
|
@@ -16,7 +16,7 @@ mdbq/dataframe/__init__.py,sha256=2HtCN8AdRj53teXDqzysC1h8aPL-mMFy561ESmhehGQ,22
|
|
16
16
|
mdbq/dataframe/converter.py,sha256=lETYhT7KXlWzWwqguqhk6vI6kj4rnOBEW1lhqKy2Abc,5035
|
17
17
|
mdbq/log/__init__.py,sha256=Mpbrav0s0ifLL7lVDAuePEi1hJKiSHhxcv1byBKDl5E,15
|
18
18
|
mdbq/log/mylogger.py,sha256=oaT7Bp-Hb9jZt52seP3ISUuxVcI19s4UiqTeouScBO0,3258
|
19
|
-
mdbq/log/spider_logging.py,sha256=
|
19
|
+
mdbq/log/spider_logging.py,sha256=CzQIflfbMSBSBjHSO3fEhcG9Oiyj6cR-YU0tObMMyxM,1975
|
20
20
|
mdbq/mongo/__init__.py,sha256=SILt7xMtQIQl_m-ik9WLtJSXIVf424iYgCfE_tnQFbw,13
|
21
21
|
mdbq/mongo/mongo.py,sha256=M9DUeUCMPDngkwn9-ui0uTiFrvfNU1kLs22s5SmoNm0,31899
|
22
22
|
mdbq/mysql/__init__.py,sha256=A_DPJyAoEvTSFojiI2e94zP0FKtCkkwKP1kYUCSyQzo,11
|
@@ -24,7 +24,7 @@ mdbq/mysql/mysql.py,sha256=YgmSLkwjIUpjiGH3S-bTiaJCKe8As0WvHDOS6_ePyYs,98591
|
|
24
24
|
mdbq/mysql/s_query.py,sha256=pj5ioJfUT81Su9S-km9G49gF5F2MmXXfw_oAIUzhN28,8794
|
25
25
|
mdbq/mysql/year_month_day.py,sha256=VgewoE2pJxK7ErjfviL_SMTN77ki8GVbTUcao3vFUCE,1523
|
26
26
|
mdbq/other/__init__.py,sha256=jso1oHcy6cJEfa7udS_9uO5X6kZLoPBF8l3wCYmr5dM,18
|
27
|
-
mdbq/other/download_sku_picture.py,sha256
|
27
|
+
mdbq/other/download_sku_picture.py,sha256=B5WA2-CQds2l36w4gLs1cgqzWqC1mbQTozqwb3vUQh0,44656
|
28
28
|
mdbq/other/porxy.py,sha256=UHfgEyXugogvXgsG68a7QouUCKaohTKKkI4RN-kYSdQ,4961
|
29
29
|
mdbq/other/pov_city.py,sha256=AEOmCOzOwyjHi9LLZWPKi6DUuSC-_M163664I52u9qw,21050
|
30
30
|
mdbq/other/sku_picture_bak.py,sha256=JwSXYlzamVqcKCD2tRH2VqYVZNr8fM6f--kcGlTVRnM,50026
|
@@ -36,8 +36,8 @@ mdbq/pbix/refresh_all_old.py,sha256=_pq3WSQ728GPtEG5pfsZI2uTJhU8D6ra-htIk1JXYzw,
|
|
36
36
|
mdbq/redis/__init__.py,sha256=YtgBlVSMDphtpwYX248wGge1x-Ex_mMufz4-8W0XRmA,12
|
37
37
|
mdbq/redis/getredis.py,sha256=oyFwE-8c6uErSGYNIO0z2ng93mH0zstRLD86MWqF6M8,25636
|
38
38
|
mdbq/spider/__init__.py,sha256=RBMFXGy_jd1HXZhngB2T2XTvJqki8P_Fr-pBcwijnew,18
|
39
|
-
mdbq/spider/aikucun.py,sha256=
|
40
|
-
mdbq-3.7.
|
41
|
-
mdbq-3.7.
|
42
|
-
mdbq-3.7.
|
43
|
-
mdbq-3.7.
|
39
|
+
mdbq/spider/aikucun.py,sha256=qMU29gb72OK8GLBD-zENo1EmxuojRnuPyEdk5S2KDKw,21767
|
40
|
+
mdbq-3.7.4.dist-info/METADATA,sha256=oviqiqBpDqxScLXtRS6FhvAg-WudJQX_--ykPyP9zlM,243
|
41
|
+
mdbq-3.7.4.dist-info/WHEEL,sha256=eOLhNAGa2EW3wWl_TU484h7q1UNgy0JXjjoqKoxAAQc,92
|
42
|
+
mdbq-3.7.4.dist-info/top_level.txt,sha256=2FQ-uLnCSB-OwFiWntzmwosW3X2Xqsg0ewh1axsaylA,5
|
43
|
+
mdbq-3.7.4.dist-info/RECORD,,
|
File without changes
|
File without changes
|