xiaohongshu_search_recommendations.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. #!/usr/bin/env python3
  2. """
  3. 小红书搜索推荐词接口
  4. 获取小红书平台搜索框中的推荐词
  5. """
  6. import requests
  7. import json
  8. import os
  9. import argparse
  10. import time
  11. import ast
  12. from datetime import datetime
  13. from typing import Dict, Any
  14. class XiaohongshuSearchRecommendations:
  15. """小红书搜索推荐词API封装类"""
  16. BASE_URL = "http://47.84.182.56:8001"
  17. TOOL_NAME = "Xiaohongshu_Search_Recommendations"
  18. PLATFORM = "xiaohongshu" # 平台名称
  19. def __init__(self, results_dir: str = None):
  20. """
  21. 初始化API客户端
  22. Args:
  23. results_dir: 结果输出目录,默认为脚本所在目录下的 results 文件夹
  24. """
  25. self.api_url = f"{self.BASE_URL}/tools/call/{self.TOOL_NAME}"
  26. # 设置结果输出目录
  27. if results_dir:
  28. self.results_base_dir = results_dir
  29. else:
  30. # 默认使用项目根目录的 data/search_recommendations 文件夹
  31. script_dir = os.path.dirname(os.path.abspath(__file__))
  32. project_root = os.path.dirname(os.path.dirname(script_dir))
  33. self.results_base_dir = os.path.join(project_root, "data", "search_recommendations")
  34. def get_recommendations(self, keyword: str, timeout: int = 300, max_retries: int = 10, retry_delay: int = 2) -> Dict[str, Any]:
  35. """
  36. 获取小红书搜索推荐词
  37. Args:
  38. keyword: 搜索关键词,例如:'长沙'、'美妆'等
  39. timeout: 请求超时时间(秒),默认300秒
  40. max_retries: 最大重试次数,默认10次
  41. retry_delay: 重试间隔时间(秒),默认2秒
  42. Returns:
  43. API响应的JSON数据
  44. Raises:
  45. requests.exceptions.RequestException: 请求失败时抛出异常
  46. """
  47. payload = {"keyword": keyword}
  48. last_error = None
  49. for attempt in range(max_retries + 1):
  50. try:
  51. response = requests.post(
  52. self.api_url,
  53. json=payload,
  54. timeout=timeout,
  55. headers={"Content-Type": "application/json"}
  56. )
  57. response.raise_for_status()
  58. res = response.json()
  59. # 使用 ast.literal_eval 解析 Python 字典字符串(不是标准 JSON)
  60. result = ast.literal_eval(res['result'])
  61. # 成功:code == 0
  62. if result.get('code') == 0:
  63. return result['data']['data']
  64. # 失败:code != 0
  65. last_error = f"code={result.get('code')}"
  66. except Exception as e:
  67. from traceback import print_exc
  68. print(f"发生异常: {e}")
  69. print_exc()
  70. last_error = str(e)
  71. # 统一处理重试逻辑
  72. if attempt < max_retries:
  73. print(f"请求失败 ({last_error}), 第{attempt + 1}次重试,等待{retry_delay}秒...")
  74. time.sleep(retry_delay)
  75. else:
  76. print(f"达到最大重试次数({max_retries}),最后错误: {last_error}")
  77. return []
  78. def save_result(self, keyword: str, result: Dict[str, Any]) -> str:
  79. """
  80. 保存结果到文件
  81. 目录结构: results/平台/关键词/时间戳.json
  82. Args:
  83. keyword: 搜索关键词
  84. result: API返回的结果
  85. Returns:
  86. 保存的文件路径
  87. """
  88. # 创建目录结构: results/平台/关键词/
  89. result_dir = os.path.join(self.results_base_dir, self.PLATFORM, keyword)
  90. os.makedirs(result_dir, exist_ok=True)
  91. # 文件名使用时间戳
  92. timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
  93. filename = f"{timestamp}.json"
  94. filepath = os.path.join(result_dir, filename)
  95. # 保存结果
  96. with open(filepath, 'w', encoding='utf-8') as f:
  97. json.dump(result, f, ensure_ascii=False, indent=2)
  98. return filepath
  99. def main():
  100. """示例使用"""
  101. # 解析命令行参数
  102. parser = argparse.ArgumentParser(description='小红书搜索推荐词接口')
  103. parser.add_argument(
  104. '--results-dir',
  105. type=str,
  106. default='data/search_recommendations',
  107. help='结果输出目录 (默认: data/search_recommendations)'
  108. )
  109. parser.add_argument(
  110. '--keyword',
  111. type=str,
  112. required=True,
  113. help='搜索关键词 (必填)'
  114. )
  115. args = parser.parse_args()
  116. # 创建API客户端实例
  117. client = XiaohongshuSearchRecommendations(results_dir=args.results_dir)
  118. # 获取推荐词并保存
  119. try:
  120. result = client.get_recommendations(args.keyword)
  121. filepath = client.save_result(args.keyword, result)
  122. print(f"Output: {filepath}")
  123. except Exception as e:
  124. print(f"Error: {e}", file=__import__('sys').stderr)
  125. if __name__ == "__main__":
  126. main()