fetch-wx-sogou.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. #!/usr/bin/env python3
  2. """搜狗微信搜索抓取文章摘要与正文缓存"""
  3. import re, subprocess
  4. url = "https://weixin.sogou.com/weixin?type=2&query=Harness+%E5%B7%A5%E7%A8%8B+%E8%87%AA%E6%88%91%E6%94%B9%E8%BF%9B%E4%B8%8D%E4%BB%8E%E6%A8%A1%E5%9E%8B%E5%BC%80%E5%A7%8B"
  5. r = subprocess.run(["curl", "-sL", url,
  6. "-H", "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
  7. "--max-time", "25", "-o", "/tmp/sogou.html"], capture_output=True, timeout=40)
  8. raw = open("/tmp/sogou.html", encoding="utf-8", errors="ignore").read()
  9. print("len:", len(raw))
  10. items = re.findall(r"<h3>(.*?)</h3>", raw, re.S)
  11. for it in items[:3]:
  12. txt = re.sub(r"<[^>]+>", "", it).strip()
  13. print("·", txt[:80])
  14. # 摘要
  15. sps = re.findall(r'class="txt-info"[^>]*>(.*?)</p>', raw, re.S)
  16. for s in sps[:3]:
  17. t = re.sub(r"<[^>]+>", "", s).strip()
  18. print("摘要:", t[:220])
  19. # 找目标文章的跳转链接(搜狗转链)
  20. links = re.findall(r'href="(/link\?url=[^"]+)"', raw)
  21. print("links:", len(links))
  22. if links:
  23. # 抓第一个link(通常就是最新相关文章) 跟踪跳转拿正文
  24. follow = "https://weixin.sogou.com" + links[0].replace("&amp;", "&")
  25. r2 = subprocess.run(["curl", "-sL", "-v", follow,
  26. "-H", "User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) MicroMessenger/8.0.49",
  27. "-H", "Referer: https://weixin.sogou.com/",
  28. "--max-time", "25", "-o", "/tmp/sogou-art.html"], capture_output=True, timeout=40, text=True)
  29. import os
  30. if not os.path.exists("/tmp/sogou-art.html"):
  31. print("抓取失败, curl stderr尾部:", (r2.stderr or "")[-300:])
  32. else:
  33. art = open("/tmp/sogou-art.html", encoding="utf-8", errors="ignore").read()
  34. print("art len:", len(art))
  35. print("含js_content:", "js_content" in art, "| 含环境异常:", "环境异常" in art)
  36. m = re.search(r'id="js_content"[^>]*>(.*)$', art, re.S)
  37. if m:
  38. seg = m.group(1)
  39. text = re.sub(r"<style[^>]*>.*?</style>", "", seg, flags=re.S)
  40. text = re.sub(r"<[^>]+>", "\n", text)
  41. text = re.sub(r"\n\s*\n+", "\n", text).strip()
  42. print("正文长度:", len(text))
  43. open("/tmp/wx-article.txt", "w", encoding="utf-8").write(text)
  44. print(text[:1000])