fetch_comments.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. #!/usr/bin/env python3
  2. """fetch_comments.py — 采集评论区(可选, VOC 网关翻页).
  3. 用法:
  4. python3 fetch_comments.py --aweme-id 7677548065384877346 --workdir /tmp/lapian [--max 100]
  5. 产物: workdir/comments.json = [{nickname,text,likes,...}...] (按点赞排序)
  6. """
  7. import argparse
  8. import json
  9. import os
  10. import sys
  11. sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
  12. from common import voc_call # noqa: E402
  13. def main():
  14. ap = argparse.ArgumentParser()
  15. ap.add_argument("--aweme-id", required=True)
  16. ap.add_argument("--workdir", required=True)
  17. ap.add_argument("--max", type=int, default=100)
  18. args = ap.parse_args()
  19. comments, cursor, seen = [], 0, set()
  20. while len(comments) < args.max:
  21. resp = voc_call("douyin/app/v3/fetch_video_comments",
  22. {"aweme_id": args.aweme_id, "cursor": cursor, "count": 20})
  23. if resp.get("error"):
  24. print(f"[comments] 网关错误: {resp['error']}")
  25. break
  26. data = resp.get("data") or {}
  27. batch = data.get("comments") or (data.get("data") or {}).get("comments") or []
  28. if not batch:
  29. break
  30. new = 0
  31. for c in batch:
  32. cid = c.get("cid") or c.get("comment_id") or f"{c.get('user', {}).get('nickname')}|{c.get('create_time')}"
  33. if cid in seen:
  34. continue
  35. seen.add(cid)
  36. comments.append({
  37. "nickname": (c.get("user") or {}).get("nickname") or "",
  38. "text": c.get("text") or "",
  39. "likes": c.get("digg_count") or 0,
  40. "reply_count": c.get("reply_comment_total") or 0,
  41. "time": c.get("create_time") or 0,
  42. "ip_label": c.get("ip_label") or "",
  43. })
  44. new += 1
  45. print(f"[comments] cursor={cursor} +{new} (累计 {len(comments)})")
  46. cursor += len(batch)
  47. if new == 0:
  48. break
  49. comments.sort(key=lambda x: -x["likes"])
  50. out = os.path.join(args.workdir, "comments.json")
  51. os.makedirs(args.workdir, exist_ok=True)
  52. json.dump(comments, open(out, "w", encoding="utf-8"), ensure_ascii=False, indent=2)
  53. print(f"[comments] {len(comments)} 条 → {out}")
  54. if __name__ == "__main__":
  55. main()