qrpa 1.1.36__py3-none-any.whl → 1.1.37__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.
Potentially problematic release.
This version of qrpa might be problematic. Click here for more details.
- qrpa/mysql_module/new_product_analysis_model.py +39 -6
- qrpa/mysql_module/shein_store_model.py +3 -2
- qrpa/shein_lib.py +24 -17
- {qrpa-1.1.36.dist-info → qrpa-1.1.37.dist-info}/METADATA +1 -1
- {qrpa-1.1.36.dist-info → qrpa-1.1.37.dist-info}/RECORD +7 -7
- {qrpa-1.1.36.dist-info → qrpa-1.1.37.dist-info}/WHEEL +0 -0
- {qrpa-1.1.36.dist-info → qrpa-1.1.37.dist-info}/top_level.txt +0 -0
|
@@ -42,6 +42,7 @@ class SheinNewProductAnalysis(Base):
|
|
|
42
42
|
# 状态标识
|
|
43
43
|
onsale_flag = Column(Integer, nullable=True, default=0, comment='在售标识(0-否,1-是)')
|
|
44
44
|
sale_flag = Column(Integer, nullable=True, default=0, comment='上架标识(0-否,1-是)')
|
|
45
|
+
new_goods_tag = Column(Integer, nullable=True, comment='新品标签(1-新品爆款,2-新品畅销,3-潜力新品,4-新品)')
|
|
45
46
|
|
|
46
47
|
# 销售数据
|
|
47
48
|
sale_cnt = Column(Integer, nullable=True, default=0, comment='销量')
|
|
@@ -85,6 +86,35 @@ class SheinNewProductAnalysis(Base):
|
|
|
85
86
|
def __repr__(self):
|
|
86
87
|
return f"<SheinNewProductAnalysis(id={self.id}, store_username='{self.store_username}', skc='{self.skc}', stat_date={self.stat_date})>"
|
|
87
88
|
|
|
89
|
+
@property
|
|
90
|
+
def new_goods_tag_name(self):
|
|
91
|
+
"""
|
|
92
|
+
获取新品标签的文本描述
|
|
93
|
+
|
|
94
|
+
Returns:
|
|
95
|
+
str: 新品标签文本描述
|
|
96
|
+
"""
|
|
97
|
+
return self.get_new_goods_tag_name(self.new_goods_tag)
|
|
98
|
+
|
|
99
|
+
@staticmethod
|
|
100
|
+
def get_new_goods_tag_name(tag):
|
|
101
|
+
"""
|
|
102
|
+
将新品标签代码转换为文本描述
|
|
103
|
+
|
|
104
|
+
Args:
|
|
105
|
+
tag (str): 新品标签代码
|
|
106
|
+
|
|
107
|
+
Returns:
|
|
108
|
+
str: 新品标签文本描述
|
|
109
|
+
"""
|
|
110
|
+
tag_map = {
|
|
111
|
+
'1': '新品爆款',
|
|
112
|
+
'2': '新品畅销',
|
|
113
|
+
'3': '潜力新品',
|
|
114
|
+
'4': '新品'
|
|
115
|
+
}
|
|
116
|
+
return tag_map.get(str(tag), '') if tag else ''
|
|
117
|
+
|
|
88
118
|
class NewProductAnalysisManager:
|
|
89
119
|
"""
|
|
90
120
|
新品分析数据管理器
|
|
@@ -313,6 +343,7 @@ class NewProductAnalysisManager:
|
|
|
313
343
|
'img_url' : item.get('imgUrl'),
|
|
314
344
|
'onsale_flag' : int(item.get('onsaleFlag', 0)),
|
|
315
345
|
'sale_flag' : int(item.get('saleFlag', 0)),
|
|
346
|
+
'new_goods_tag' : item.get('newGoodsTag'),
|
|
316
347
|
'sale_cnt' : item.get('saleCnt', 0),
|
|
317
348
|
'pay_order_cnt' : item.get('payOrderCnt', 0),
|
|
318
349
|
'goods_uv' : item.get('goodsUv', 0),
|
|
@@ -470,22 +501,24 @@ def update_front_price(stat_date, skc, front_price):
|
|
|
470
501
|
|
|
471
502
|
|
|
472
503
|
if __name__ == '__main__':
|
|
504
|
+
database_url = "mysql+pymysql://root:123wyk@127.0.0.1:3306/lz"
|
|
505
|
+
|
|
473
506
|
# 测试代码
|
|
474
|
-
manager = NewProductAnalysisManager()
|
|
507
|
+
manager = NewProductAnalysisManager(database_url)
|
|
475
508
|
|
|
476
509
|
# 创建表
|
|
477
510
|
manager.create_table()
|
|
478
511
|
|
|
479
512
|
# 读取JSON文件
|
|
480
|
-
with open('../../docs/skc_model_GS9740414_2025-10-
|
|
513
|
+
with open('../../docs/skc_model_GS9740414_2025-10-22.json', 'r', encoding='utf-8') as f:
|
|
481
514
|
json_data = json.load(f)
|
|
482
515
|
count = manager.import_from_json(json_data)
|
|
483
516
|
print(f"成功导入 {count} 条记录")
|
|
484
517
|
|
|
485
|
-
with open('../../docs/skc_model_S19118100_2025-10-15.json', 'r', encoding='utf-8') as f:
|
|
486
|
-
|
|
487
|
-
count = manager.import_from_json(json_data)
|
|
488
|
-
print(f"成功导入 {count} 条记录")
|
|
518
|
+
# with open('../../docs/skc_model_S19118100_2025-10-15.json', 'r', encoding='utf-8') as f:
|
|
519
|
+
# json_data = json.load(f)
|
|
520
|
+
# count = manager.import_from_json(json_data)
|
|
521
|
+
# print(f"成功导入 {count} 条记录")
|
|
489
522
|
|
|
490
523
|
# 更新前台价格(手动设置,后续导入不会覆盖)
|
|
491
524
|
# manager.update_front_price('2025-10-15', 'si2409238815318914', 19.99)
|
|
@@ -558,8 +558,9 @@ def restore_store(database_url, user_name):
|
|
|
558
558
|
if __name__ == '__main__':
|
|
559
559
|
# 测试代码
|
|
560
560
|
# 注意:需要提供数据库连接URL
|
|
561
|
-
database_url = "mysql+pymysql://root:123wyk@127.0.0.1:3306/lz"
|
|
562
|
-
|
|
561
|
+
#database_url = "mysql+pymysql://root:123wyk@127.0.0.1:3306/lz"
|
|
562
|
+
database_url = "mysql+pymysql://root:123wyk@47.83.212.3:3306/lz"
|
|
563
|
+
|
|
563
564
|
manager = SheinStoreManager(database_url)
|
|
564
565
|
|
|
565
566
|
# 创建表
|
qrpa/shein_lib.py
CHANGED
|
@@ -1174,8 +1174,8 @@ class SheinLib:
|
|
|
1174
1174
|
detail_file = f'{self.config.auto_dir}/shein/product/product_detail_file.json'
|
|
1175
1175
|
write_dict_to_file_ex(detail_file, {self.store_username: dict_product_detail}, [self.store_username])
|
|
1176
1176
|
|
|
1177
|
-
def get_skc_diagnose_list(self, shelf_date_begin, shelf_date_end):
|
|
1178
|
-
log(f'获取商品分析列表(
|
|
1177
|
+
def get_skc_diagnose_list(self, shelf_date_begin="", shelf_date_end=""):
|
|
1178
|
+
log(f'获取商品分析列表(最近上架的或在售的) {shelf_date_begin} {shelf_date_end} {self.store_name} {self.store_username}')
|
|
1179
1179
|
|
|
1180
1180
|
dt_goods = self.get_dt_time_goods()
|
|
1181
1181
|
if not TimeUtils.is_yesterday_date(dt_goods, "%Y%m%d"):
|
|
@@ -1188,17 +1188,18 @@ class SheinLib:
|
|
|
1188
1188
|
page_num = 1
|
|
1189
1189
|
page_size = 100
|
|
1190
1190
|
payload = {
|
|
1191
|
-
"areaCd"
|
|
1192
|
-
"dt"
|
|
1193
|
-
"countrySite"
|
|
1191
|
+
"areaCd" : "cn",
|
|
1192
|
+
"dt" : dt_goods,
|
|
1193
|
+
"countrySite": [
|
|
1194
1194
|
"shein-all"
|
|
1195
1195
|
],
|
|
1196
|
-
"startDate"
|
|
1197
|
-
"endDate"
|
|
1198
|
-
"pageNum"
|
|
1199
|
-
"pageSize"
|
|
1200
|
-
"
|
|
1201
|
-
"
|
|
1196
|
+
"startDate" : yesterday,
|
|
1197
|
+
"endDate" : yesterday,
|
|
1198
|
+
"pageNum" : page_num,
|
|
1199
|
+
"pageSize" : page_size,
|
|
1200
|
+
"onsaleFlag" : 1,
|
|
1201
|
+
# "localFrstSaleBeginDate": shelf_date_begin,
|
|
1202
|
+
# "localFrstSaleEndDate" : shelf_date_end,
|
|
1202
1203
|
}
|
|
1203
1204
|
response_text = fetch(self.web_page, url, payload)
|
|
1204
1205
|
error_code = response_text.get('code')
|
|
@@ -1224,6 +1225,12 @@ class SheinLib:
|
|
|
1224
1225
|
|
|
1225
1226
|
# 活动信息
|
|
1226
1227
|
# AB实验数据
|
|
1228
|
+
|
|
1229
|
+
# 预先过滤掉不需要的商品状态
|
|
1230
|
+
log(f'过滤前商品数量: {len(spu_list)}')
|
|
1231
|
+
exclude_levels = ['退供款', '自主停产', '自主下架']
|
|
1232
|
+
spu_list = [item for item in spu_list if item['layerNm'] not in exclude_levels]
|
|
1233
|
+
log(f'过滤后剩余商品数量: {len(spu_list)}')
|
|
1227
1234
|
|
|
1228
1235
|
for skc_item in spu_list:
|
|
1229
1236
|
skc = skc_item['skc']
|
|
@@ -1262,8 +1269,8 @@ class SheinLib:
|
|
|
1262
1269
|
return spu_list
|
|
1263
1270
|
|
|
1264
1271
|
# 获取备货信息列表 最近35天上架的
|
|
1265
|
-
def get_latest_shelf_list(self, shelf_date_begin, shelf_date_end):
|
|
1266
|
-
log(f'获取备货信息列表(
|
|
1272
|
+
def get_latest_shelf_list(self, shelf_date_begin="", shelf_date_end=""):
|
|
1273
|
+
log(f'获取备货信息列表(最近上架的或已上架的) {shelf_date_begin} {shelf_date_end} {self.store_name} {self.store_username}')
|
|
1267
1274
|
|
|
1268
1275
|
dict_skc_shelf_date = {}
|
|
1269
1276
|
|
|
@@ -1280,7 +1287,7 @@ class SheinLib:
|
|
|
1280
1287
|
"c7dSaleCntEnd" : "",
|
|
1281
1288
|
"goodsLevelIdList" : [],
|
|
1282
1289
|
"supplyStatus" : "",
|
|
1283
|
-
"shelfStatus" :
|
|
1290
|
+
"shelfStatus" : 1, # 已上架
|
|
1284
1291
|
"categoryIdList" : [],
|
|
1285
1292
|
"skcStockBegin" : "",
|
|
1286
1293
|
"skcStockEnd" : "",
|
|
@@ -1336,9 +1343,9 @@ class SheinLib:
|
|
|
1336
1343
|
|
|
1337
1344
|
time.sleep(0.3)
|
|
1338
1345
|
|
|
1339
|
-
key = f'{self.store_username}'
|
|
1340
|
-
cache_file = f'{self.config.auto_dir}/shein/cache/bak_info_list_{key}_{shelf_date_begin}_{shelf_date_end}.json'
|
|
1341
|
-
write_dict_to_file_ex(cache_file, {key: spu_list}, [key])
|
|
1346
|
+
# key = f'{self.store_username}'
|
|
1347
|
+
# cache_file = f'{self.config.auto_dir}/shein/cache/bak_info_list_{key}_{shelf_date_begin}_{shelf_date_end}.json'
|
|
1348
|
+
# write_dict_to_file_ex(cache_file, {key: spu_list}, [key])
|
|
1342
1349
|
|
|
1343
1350
|
for skc_item in spu_list:
|
|
1344
1351
|
skc = skc_item['skc']
|
|
@@ -11,7 +11,7 @@ qrpa/fun_web.py,sha256=9YuVy_wps9Ty_FBZ91W2R0iKgC2IViaJjHbyuUgngGs,11599
|
|
|
11
11
|
qrpa/fun_win.py,sha256=vMdVh00dsnVz8Wey4Bq7J3RPZAY8B_bI_IKphOX1cE8,7836
|
|
12
12
|
qrpa/shein_daily_report_model.py,sha256=O8s9qM45WZRoAgxUFRngvmBrc29v7Uf2ye7K8_bcSRg,12214
|
|
13
13
|
qrpa/shein_excel.py,sha256=-5fNetkVMixPQPw00K9F4OeJn8LSknaoyRXNqsQw1EA,158107
|
|
14
|
-
qrpa/shein_lib.py,sha256=
|
|
14
|
+
qrpa/shein_lib.py,sha256=aJnhaWPZHWKUaAvTy4I3Xrk3sE_mZIslempxLo9mbFI,191182
|
|
15
15
|
qrpa/shein_mysql.py,sha256=MxbiRSH0gaTtW4ET7lVWRNY4NLOrMLGXO_4STptE1pU,4562
|
|
16
16
|
qrpa/shein_sqlite.py,sha256=i4xwNf60eoG6wbWM1R2i5pDdVW1ZMy6uy9nB-c2WKzk,5554
|
|
17
17
|
qrpa/shein_ziniao.py,sha256=YN7g6m84-vyDyePssfR41lqwaROz-km0-rJ8qY-jhy0,21416
|
|
@@ -22,12 +22,12 @@ qrpa/time_utils.py,sha256=bOTSi_ewXPCxwgG_ndFGf8dl7S4fvSGT9sQ-90LESuo,31458
|
|
|
22
22
|
qrpa/time_utils_example.py,sha256=80zzunKw7F1S8MOwNFmmiCnI8MOYoh4PH-25UrEGuF0,7810
|
|
23
23
|
qrpa/wxwork.py,sha256=Vy8PGEtlTWt4-1laVhuqpJUGCFH2JymgbjvH00aaBog,10946
|
|
24
24
|
qrpa/mysql_module/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
25
|
-
qrpa/mysql_module/new_product_analysis_model.py,sha256=
|
|
25
|
+
qrpa/mysql_module/new_product_analysis_model.py,sha256=z7-T9CtSp8Zn6cy7BydcEVIXjt73FhfYRxrqO43zFeg,19656
|
|
26
26
|
qrpa/mysql_module/shein_ledger_model.py,sha256=KGKfGyzS00rbBZhiZhAzypwYPGs7OdfRLnH2ea36Vm8,18161
|
|
27
27
|
qrpa/mysql_module/shein_product_model.py,sha256=KiXMjPT93XkANCM53cCFaISja0sTmAWsionFrRy8DQ4,18773
|
|
28
28
|
qrpa/mysql_module/shein_return_order_model.py,sha256=8xvKhOzpcJS5FHfyA33UednaqRNCyXo3qeXBzwTXeN8,25993
|
|
29
|
-
qrpa/mysql_module/shein_store_model.py,sha256=
|
|
30
|
-
qrpa-1.1.
|
|
31
|
-
qrpa-1.1.
|
|
32
|
-
qrpa-1.1.
|
|
33
|
-
qrpa-1.1.
|
|
29
|
+
qrpa/mysql_module/shein_store_model.py,sha256=RTj9cqexewHglHm1JNTe8iU0vJueHBLltdap-gvGxaY,20536
|
|
30
|
+
qrpa-1.1.37.dist-info/METADATA,sha256=33v1nk64G12K_qyWkZFjg2T6j3EySRhSjFrwZXF9vEE,231
|
|
31
|
+
qrpa-1.1.37.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
32
|
+
qrpa-1.1.37.dist-info/top_level.txt,sha256=F6T5igi0fhXDucPPUbmmSC0qFCDEsH5eVijfVF48OFU,5
|
|
33
|
+
qrpa-1.1.37.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|