hub-gif 0e224c6a6c refactor(pipeline): 移除 jd_competitor_report 中转,统一导入 competitor_report.jd_report
- 删除 backend/pipeline/jd_competitor_report.py;runner/测试与演示改为 from pipeline.competitor_report import jd_report

- 爬虫目录 jd_competitor_report.py 仅调用 jd_report.main;文档与 OpenAPI 同步更新

- 命令行推荐:python -m pipeline.competitor_report.jd_report

Made-with: Cursor
2026-04-17 14:46:21 +08:00

142 lines
4.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""CSV 表头键、运行默认调参与关注词/场景配置(与 ``pipeline.competitor_report.jd_report`` 顶层一致)。"""
from __future__ import annotations
from pipeline.csv_schema import (
COMMENT_CSV_COLUMNS,
JD_SEARCH_CSV_HEADERS,
MERGED_FIELD_TO_CSV_HEADER,
)
_JD_LIST_PRICE_KEY = JD_SEARCH_CSV_HEADERS["price"]
_COUPON_SHOW_PRICE_KEY = JD_SEARCH_CSV_HEADERS["coupon_price"]
_ORIGINAL_LIST_PRICE_KEY = JD_SEARCH_CSV_HEADERS["original_price"]
_SELLING_POINT_KEY = JD_SEARCH_CSV_HEADERS["selling_point"]
_RANK_TAGLINE_KEY = JD_SEARCH_CSV_HEADERS["hot_list_rank"]
# 历史批次 CSV 表头(括号英文);新批次为纯中文,读取时新键优先
_LEGACY_JD_LIST_PRICE_KEY = "标价(jdPrice,jdPriceText,realPrice)"
_LEGACY_COUPON_SHOW_PRICE_KEY = (
"券后到手价(couponPrice,subsidyPrice,finalPrice.estimatedPrice,priceShow)"
)
_LEGACY_SHOP_NAME_KEY = "店铺名(shopName)"
_LEGACY_RANK_TAGLINE_KEY = "榜单类文案(标签/腰带/标题数组中的榜、TOP 等)"
_LEGACY_COMMENT_FUZZ_KEY = "评价量(commentFuzzy)"
_LEGACY_SELLING_POINT_KEY = "卖点(sellingPoint)"
_LIST_BRAND_TITLE_HEADER = "店铺信息标题"
_LEGACY_LIST_BRAND_TITLE_KEY = "店铺信息标题(shopInfoTitle,brandName)"
_DETAIL_PRICE_FINAL_CSV_KEYS: tuple[str, ...] = (
MERGED_FIELD_TO_CSV_HEADER["detail_price_final"],
"detail_price_final",
)
_LIST_PRICE_AND_COUPON_KEYS: tuple[str, ...] = (
*_DETAIL_PRICE_FINAL_CSV_KEYS,
_JD_LIST_PRICE_KEY,
_LEGACY_JD_LIST_PRICE_KEY,
_COUPON_SHOW_PRICE_KEY,
_LEGACY_COUPON_SHOW_PRICE_KEY,
)
# 报告摘录「标价」:列表标价优先,缺省时用商详到手价列兜底
_LIST_SHOW_PRICE_CELL_KEYS: tuple[str, ...] = (
_JD_LIST_PRICE_KEY,
_LEGACY_JD_LIST_PRICE_KEY,
MERGED_FIELD_TO_CSV_HEADER["detail_price_final"],
"detail_price_final",
)
_MERGED_SHOP_CELL_KEYS: tuple[str, ...] = (
MERGED_FIELD_TO_CSV_HEADER["detail_shop_name"],
"detail_shop_name",
JD_SEARCH_CSV_HEADERS["shop_name"],
_LEGACY_SHOP_NAME_KEY,
)
_COMMENT_FUZZ_KEYS: tuple[str, ...] = (
MERGED_FIELD_TO_CSV_HEADER["comment_fuzzy"],
_LEGACY_COMMENT_FUZZ_KEY,
)
_COMMENT_CSV_SKU = COMMENT_CSV_COLUMNS[0]
_COMMENT_CSV_BODY = COMMENT_CSV_COLUMNS[3]
_COMMENT_CSV_SCORE = COMMENT_CSV_COLUMNS[7] # 「评分」→ commentScore
# 评价星级与 §8.2 分桶:先按评分筛正负,再在对应子集内统计口语短语(无评分时回退关键词)
_COMMENT_SCORE_NEG_MAX = 2 # 12 星 → 偏负向
_COMMENT_SCORE_POS_MIN = 4 # 45 星 → 偏正向3 星为中评,归入中性)
_DETAIL_CATEGORY_PATH_KEY = MERGED_FIELD_TO_CSV_HEADER["detail_category_path"]
_K_CAT_COL = JD_SEARCH_CSV_HEADERS["leaf_category"]
_K_PROP_COL = JD_SEARCH_CSV_HEADERS["attributes"]
EXTERNAL_MARKET_TABLE_ROWS: tuple[tuple[str, str, str, str], ...] = ()
COMMENT_FOCUS_WORDS: tuple[str, ...] = (
"口感",
"",
"",
"血糖",
"控糖",
"低糖",
"无糖",
"饱腹",
"升糖",
"GI",
"gi",
"孕妇",
"老人",
"糖尿病",
"价格",
"",
"便宜",
"回购",
"包装",
"物流",
"分量",
"量少",
"克重",
)
COMMENT_SCENARIO_GROUPS: tuple[tuple[str, tuple[str, ...]], ...] = (
("早餐/代餐", ("早餐", "代餐", "早饭", "当早餐", "当早饭", "早上吃", "晨起")),
("零食/加餐/解馋", ("零食", "加餐", "嘴馋", "小零食", "解馋", "垫肚子", "饿了", "肚子饿", "两餐之间", "间食")),
("控糖/血糖相关", ("控糖", "血糖高", "升糖", "糖友", "糖尿病", "孕期控糖", "妊娠糖", "血糖")),
("孕期/育儿", ("孕期", "孕妇", "怀孕", "产妇", "坐月子", "哺乳", "给宝宝", "给娃", "孩子吃", "小孩吃", "宝宝吃")),
("健身/减脂", ("减肥", "减脂", "瘦身", "健身", "卡路里", "热量低", "低脂")),
("长辈/家庭", ("老人", "爸妈", "父母", "长辈", "爷爷奶奶", "给家里")),
("办公/外出", ("办公室", "上班吃", "出门", "外出", "随身带", "包里", "便携")),
("送礼/囤货", ("送礼", "送人", "囤货", "年货")),
("夜宵/熬夜", ("夜宵", "熬夜", "晚上饿")),
)
__all__ = [
"_COMMENT_CSV_BODY",
"_COMMENT_CSV_SCORE",
"_COMMENT_CSV_SKU",
"COMMENT_FOCUS_WORDS",
"COMMENT_SCENARIO_GROUPS",
"EXTERNAL_MARKET_TABLE_ROWS",
"_COMMENT_FUZZ_KEYS",
"_COMMENT_SCORE_NEG_MAX",
"_COMMENT_SCORE_POS_MIN",
"_COUPON_SHOW_PRICE_KEY",
"_DETAIL_CATEGORY_PATH_KEY",
"_DETAIL_PRICE_FINAL_CSV_KEYS",
"_JD_LIST_PRICE_KEY",
"_K_CAT_COL",
"_K_PROP_COL",
"_LEGACY_COUPON_SHOW_PRICE_KEY",
"_LEGACY_JD_LIST_PRICE_KEY",
"_LEGACY_LIST_BRAND_TITLE_KEY",
"_LEGACY_RANK_TAGLINE_KEY",
"_LEGACY_SELLING_POINT_KEY",
"_LEGACY_SHOP_NAME_KEY",
"_LIST_BRAND_TITLE_HEADER",
"_LIST_PRICE_AND_COUPON_KEYS",
"_LIST_SHOW_PRICE_CELL_KEYS",
"_MERGED_SHOP_CELL_KEYS",
"_ORIGINAL_LIST_PRICE_KEY",
"_RANK_TAGLINE_KEY",
"_SELLING_POINT_KEY",
]