爬取知乎高赞回答:按点赞数筛选“Python学习干货”,自动保存为Markdown文档

📅 发布时间:2026/7/12 8:30:18 👁️ 浏览次数:
爬取知乎高赞回答:按点赞数筛选“Python学习干货”,自动保存为Markdown文档
这是一个非常典型的爬虫实战需求但也是风控极高的场景。知乎的反爬机制在国内属于第一梯队直接硬爬API极易触发验证码甚至封号。下面为你提供一套“合规优先 工程化兜底”的完整方案。我们不鼓励暴力抓取而是教你如何用技术手段在尊重平台规则的前提下高效获取并结构化保存内容。⚠️风险与合规声明本文代码仅供个人学习研究、知识管理备份使用。请严格遵守《知乎用户协议》及robots.txt控制请求频率禁止商用、批量采集或绕过付费墙。高频爬取可能导致账号受限作者不承担连带责任。一、 技术选型为什么不建议直接调API方案优点缺点推荐度知乎Open API官方接口稳定合规权限极小几乎不开放搜索/高赞筛选⭐requests直连API速度快轻量签名算法频繁更新反爬极强易封号⭐⭐Selenium/Playwright模拟真人过验证容易资源消耗大速度慢⭐⭐⭐Cookie注入 限流API平衡效率与安全复用登录态需手动登录一次仍有频率限制⭐⭐⭐⭐⭐核心思路用浏览器手动登录获取合法Cookie通过Python携带Cookie访问知乎内部Web API非公开但前端使用的接口配合严格限流和内容解析实现“半自动化”采集。二、 完整实现代码1. 环境准备pipinstallrequests markdownify beautifulsoup4 fake-useragent tenacity2. 核心采集模块importrequestsimporttimeimportjsonfromtenacityimportretry,stop_after_attempt,wait_exponentialfromfake_useragentimportUserAgentclassZhihuCrawler:BASE_URLhttps://www.zhihu.com/api/v4def__init__(self,cookie_str:str):self.sessionrequests.Session()self.session.headers.update({User-Agent:UserAgent().chrome,Referer:https://www.zhihu.com/search?typecontentqPython%E5%AD%A6%E4%B9%A0%E5%B9%B2%E8%B4%A7,Cookie:cookie_str})retry(stopstop_after_attempt(3),waitwait_exponential(multiplier2,min10))defsearch_high_vote(self,keywordPython学习干货,min_vote100,limit20): 搜索高赞回答按点赞数排序 注意知乎搜索API的sort_by参数可能随版本变化需抓包确认 urlf{self.BASE_URL}/search_v3params{t:general,q:keyword,correction:1,offset:0,limit:limit,filter_fields:,lc_idx:0,show_all_topics:0,search_source:Filter,time_interval:,sort_by:voteups# 按点赞数排序的关键参数}respself.session.get(url,paramsparams)resp.raise_for_status()dataresp.json()results[]foritemindata.get(data,[]):objitem.get(object,{})voteup_countobj.get(voteup_count,0)# 过滤低赞内容ifvoteup_countmin_vote:continueresults.append({title:obj.get(question,{}).get(title,无标题),content:obj.get(excerpt,),# 摘要full_content:obj.get(content,),# 富文本HTMLvoteup_count:voteup_count,author:obj.get(author,{}).get(name,匿名),url:obj.get(url,).replace(api.zhihu.com/answers,zhihu.com/question/xxx/answer),created_time:obj.get(created_time,0)})returnresultsdefget_answer_detail(self,answer_id:str)-str:获取回答完整HTML内容搜索接口返回的可能是截断版urlf{self.BASE_URL}/answers/{answer_id}respself.session.get(url)resp.raise_for_status()returnresp.json().get(content,)3. Markdown转换与保存模块frommarkdownifyimportmarkdownifyasmdimportosimportredefhtml_to_markdown(html_content:str)-str:将知乎富文本HTML转为干净的Markdownifnothtml_content:return# 知乎特有的数据链接、公式等预处理html_contentre.sub(ra[^]data-draft-node[^]*,,html_content)textmd(html_content,heading_styleATX,bullets-,strip[script,style,noscript],convert[img,a,strong,em,code,pre,blockquote])# 清理多余空行textre.sub(r\n{3,},\n\n,text)returntext.strip()defsave_as_markdown(articles:list,output_dir./zhihu_python_dry_goods):os.makedirs(output_dir,exist_okTrue)fori,articleinenumerate(articles):safe_titlere.sub(r[\\/*?:|],_,article[title])[:80]filenamef{i1:03d}_{safe_title}_{article[voteup_count]}赞.mdfilepathos.path.join(output_dir,filename)content_mdhtml_to_markdown(article.get(full_content)orarticle[content])# 添加YAML Front Matter元数据front_matterf--- title: {article[title]} author: {article[author]} votes:{article[voteup_count]}source: {article[url]} crawled_at: {time.strftime(%Y-%m-%d %H:%M:%S)} tags: [Python, 学习干货] --- withopen(filepath,w,encodingutf-8)asf:f.write(front_mattercontent_md)print(f✅ 已保存:{filename})time.sleep(3)# ⚠️ 写入间隔降低磁盘IO压力也作为二次限流4. 主流程串联if__name____main__:# 从浏览器开发者工具 → Network → 任意请求 → Headers → Cookie 复制COOKIE你的知乎Cookie字符串crawlerZhihuCrawler(COOKIE)# 搜索并筛选 ≥500赞 的回答answerscrawler.search_high_vote(keywordPython学习干货,min_vote500,limit20)print(f 找到{len(answers)}篇高赞回答)# 可选逐篇获取完整内容搜索接口可能截断长文# for ans in answers:# ans[full_content] crawler.get_answer_detail(ans[id])# time.sleep(5) # 详情页请求间隔更长save_as_markdown(answers)三、 关键避坑指南Cookie有效期知乎Cookie通常7-30天有效建议封装Cookie刷新检测逻辑失效时自动提醒手动更新。搜索接口变动知乎API未公开文档sort_byvoteups等参数可能随时调整。务必先用浏览器F12抓包确认当前实际请求参数再写入代码。内容截断问题搜索API返回的content字段常被截断为摘要。若需全文必须用answer_id单独请求详情接口且该接口限流更严。图片防盗链知乎图片有Referer校验。保存到本地Markdown后图片链接可能失效。建议增加图片下载本地替换步骤或使用图床转存。法律红线根据《数据安全法》和《个人信息保护法》爬取内容不得包含用户隐私信息如头像、个人简介中的联系方式保存时务必脱敏处理。四、 更优雅的替代方案如果你的核心需求是个人知识管理而非“爬取”本身强烈建议考虑知乎官方导出部分创作者开放了内容授权可通过私信获取原文。RSS订阅使用RSSHub生成知乎话题/收藏夹的RSS源配合Readwise/Obsidian自动同步零风险、可持续。浏览器插件如「简悦 SimpRead」「MarkDownload」单篇一键转Markdown适合精读场景完全规避反爬。工程师思维提示爬虫只是手段不是目的。当平台提供了合规的数据获取路径时优先选择合规路径。把精力花在内容结构化、知识图谱构建、检索增强上远比和反爬系统斗智斗勇更有长期价值。五、 总结环节最佳实践身份认证Cookie注入 定期刷新检测请求策略严格限流(3-5s/次) 指数退避重试内容解析markdownify 正则清洗知乎特有标签持久化YAML Front Matter 文件名含票数便于排序合规底线仅限个人学习、脱敏处理、尊重robots.txt这套方案在安全性、可维护性、内容质量三者间取得了较好平衡。记住好的爬虫代码首先是不会给目标站点造成负担的代码。