Parcourir la source

fix(zj_new_daily_spider): 修正新版接口数据解析与入库逻辑

- 调整 get_request_one_page 返回结构,支持 code、msg、data 外层包裹
- 新增对 AES-CBC 解密逻辑,成功时解密 data 字段内容
- 修改 parse_data,兼容新版字段缺失与分项评分不返回场景
- SQL 语句改用 INSERT IGNORE 防止重复插入报错
- loop_rating_no 根据 code 字段判断状态并更新任务表状态
- 增加日志提示,区分不存在(code=400)和其他异常状态
charley il y a 2 semaines
Parent
commit
6210c50198
1 fichiers modifiés avec 21 ajouts et 13 suppressions
  1. 21 13
      zhongjian_spider/zj_new_daily_spider.py

+ 21 - 13
zhongjian_spider/zj_new_daily_spider.py

@@ -91,8 +91,10 @@ def get_request_one_page(log, rating_no) -> dict:
     """
     获取单页数据
     :param log: logger
-    :param rating_no: 证书编号
-    :return: dict
+    :param rating_no: 证书编号(即 tag_no)
+    :return: dict, 外层结构 {'code':..., 'msg':..., 'data':...}。
+             code==200 时 data 为解密后的业务字典(含 obj_order_rating_goods);
+             code==400 表示该评级单不存在;其他为异常。
     """
     sign, dt_str = make_sign()
 
@@ -120,11 +122,12 @@ def get_request_one_page(log, rating_no) -> dict:
     response.raise_for_status()
     result = response.json()
     # print(result)
-    if result["code"] == 200 and result.get("iv"):
-        decrypted = decrypt_response(result["data"], result["iv"])
-        return decrypted
-    else:
-        return result
+    # 新版 webDetail:成功(code==200 且带 iv)时对 data 做 AES-CBC 解密,
+    # 把解密后的业务数据(含 obj_order_rating_goods)回填到 result['data'],
+    # code 始终保留在外层,供上层 loop_rating_no 判断状态(不存在时 code==400)。
+    if result.get("code") == 200 and result.get("iv"):
+        result["data"] = decrypt_response(result["data"], result["iv"])
+    return result
 
 
 def parse_data(resp_json, sql_pool):
@@ -140,7 +143,9 @@ def parse_data(resp_json, sql_pool):
     images = resp_json.get('obj_order_rating_goods', {}).get('images')
     card_create_time = resp_json.get('obj_order_rating_goods', {}).get('create_time')
     card_update_time = resp_json.get('obj_order_rating_goods', {}).get('update_time')
-    score = resp_json.get('obj_order_rating_goods', {}).get('score')  # 中检评分
+    score = resp_json.get('obj_order_rating_goods', {}).get('score')  # 中检评分(总分)
+    # 注意:2026/09 起 webDetail 不再返回以下分项评分(四角/边缘/表面/居中/颜色/修复),
+    #      obj_detail 仅保留 spxl/spmc/fxnf/yy/spbh,故下列字段现均为 None,入库即 NULL。
     corners = resp_json.get('obj_order_rating_goods', {}).get('obj_detail', {}).get('corners')  # 四角
     eoges = resp_json.get('obj_order_rating_goods', {}).get('obj_detail', {}).get('eoges')  # 边缘
     surface = resp_json.get('obj_order_rating_goods', {}).get('obj_detail', {}).get('surface')  # 表面
@@ -168,7 +173,7 @@ def parse_data(resp_json, sql_pool):
         obj_detail_spbh)
     # print(info)
     sql = """
-    INSERT INTO zhongjian_record (card_id, order_no, tag_no, images, card_create_time, card_update_time, score, corners, eoges, surface, centering, colour, repair, rating_no, obj_brand_title, obj_detail_spxl, obj_detail_spmc, obj_detail_fxnf, obj_detail_yy, obj_detail_spbh)
+    INSERT IGNORE INTO zhongjian_record (card_id, order_no, tag_no, images, card_create_time, card_update_time, score, corners, eoges, surface, centering, colour, repair, rating_no, obj_brand_title, obj_detail_spxl, obj_detail_spmc, obj_detail_fxnf, obj_detail_yy, obj_detail_spbh)
     VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
     """
     sql_pool.insert_one(sql, info)
@@ -187,16 +192,19 @@ def loop_rating_no(log, sql_pool, sql_ra_no_list):
         log.info(f"{rating_no_} is start ......................................")
         try:
             resp_json = get_request_one_page(log, rating_no_)
+            code = resp_json.get('code') if isinstance(resp_json, dict) else None
+            # 新版 webDetail:成功时 code==200 且 data 内含 obj_order_rating_goods;不存在时 code==400
+            biz = resp_json.get('data') if isinstance(resp_json, dict) else None
 
-            if resp_json and resp_json.get('code') == 200:
+            if code == 200 and isinstance(biz, dict) and biz.get('obj_order_rating_goods'):
                 # print(resp_json)
-                parse_data(resp_json, sql_pool)
+                parse_data(biz, sql_pool)
                 sql_pool.update_one('update zhongjian_task set state = 1 where tag_no = %s', (rating_no_,))
-            elif resp_json and resp_json.get('code') == 400:
+            elif code == 400:
                 log.warning(f"{rating_no_} is not exist ......................................")
                 sql_pool.update_one('update zhongjian_task set state = 2 where tag_no = %s', (rating_no_,))
             else:
-                log.warning(f"other warning, please check ......................................")
+                log.warning(f"{rating_no_} other warning code={code}, please check ......")
                 sql_pool.update_one('update zhongjian_task set state = 3 where tag_no = %s', (rating_no_,))
         except Exception as e:
             log.warning(f"{sys._getframe().f_code.co_name} error: {e}")