From 420c9b872ae30ce77a6303fe896ce126acbceb46 Mon Sep 17 00:00:00 2001 From: mzl Date: Sat, 10 Jan 2026 22:09:31 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E6=9E=90=E8=B4=A6=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/server.py | 33 +++++++++------------------------ xhs_crawler_core.py | 20 ++++++++++++++++---- 2 files changed, 25 insertions(+), 28 deletions(-) diff --git a/app/server.py b/app/server.py index e98cbae..fba40ab 100644 --- a/app/server.py +++ b/app/server.py @@ -544,30 +544,15 @@ def resolve_profile(payload: Dict[str, Any], token: Optional[str] = None): slow_mo = int(payload.get("slow_mo", 0)) try: - # 判断是否为小红书号(纯字母数字,不含空格和特殊字符) - import re - is_xhs_id = bool(re.match(r'^[A-Za-z0-9]+$', keyword)) - - if is_xhs_id: - # 对于小红书号,使用直接访问方式避免搜索跳转问题 - loghub.emit(f"[解析] 检测到小红书号格式,使用直接访问方式:{keyword}") - profile = resolve_profile_by_direct_url( - xhs_id=keyword, - storage_state_path=storage_path, - headless=headless, - slow_mo=slow_mo, - log=loghub.emit, - ) - else: - # 对于昵称或其他关键词,使用搜索方式 - loghub.emit(f"[解析] 使用搜索方式解析:{keyword}") - profile = resolve_profile_by_search( - keyword=keyword, - storage_state_path=storage_path, - headless=headless, - slow_mo=slow_mo, - log=loghub.emit, - ) + # 统一使用搜索方式解析(按您的需求:搜索框输入 → 用户标签 → 获取URL) + loghub.emit(f"[解析] 开始搜索解析:{keyword}") + profile = resolve_profile_by_search( + keyword=keyword, + storage_state_path=storage_path, + headless=headless, + slow_mo=slow_mo, + log=loghub.emit, + ) except Exception as e: loghub.emit(f"[解析][错误] {e}") raise HTTPException(status_code=400, detail=str(e)) diff --git a/xhs_crawler_core.py b/xhs_crawler_core.py index b676680..cf714cc 100644 --- a/xhs_crawler_core.py +++ b/xhs_crawler_core.py @@ -618,23 +618,35 @@ def resolve_profile_by_search( continue score = 0 + score_reasons = [] + # 精确匹配小红书号:最高优先级 if xhs_no and xhs_no.lower() == kw.lower(): score += 1000 + score_reasons.append("小红书号精确匹配") + # 精确匹配昵称:高优先级 - elif nickname and nickname.lower() == kw.lower(): + if nickname and nickname.lower() == kw.lower(): score += 500 - # 昵称包含关键词:中优先级 - elif nickname and kw.lower() in nickname.lower(): + score_reasons.append("昵称精确匹配") + + # 昵称包含关键词:中优先级(不使用 elif,允许累加) + if nickname and kw.lower() in nickname.lower() and nickname.lower() != kw.lower(): score += 50 + score_reasons.append("昵称包含关键词") + # URL 中包含关键词:低优先级 if kw.lower() in href.lower(): score += 20 + score_reasons.append("URL包含关键词") + # 有有效的 profile ID:基础分 if _extract_profile_id_from_href(href): score += 5 + score_reasons.append("有效Profile ID") - _log(log, f"[账号] - 昵称: {nickname[:30] if len(nickname) > 30 else nickname}, 账号: {xhs_no}, 得分: {score}") + reasons_str = ", ".join(score_reasons) if score_reasons else "无匹配" + _log(log, f"[账号] - 昵称: {nickname[:30] if len(nickname) > 30 else nickname}, 账号: {xhs_no}, 得分: {score} ({reasons_str})") if score > best_score: best_score = score