当前位置: 当前位置:首页 > 探索 > 抓取知乎答案的脚本正文

抓取知乎答案的脚本

作者:时尚 来源:娱乐 浏览: 【大 中 小】 发布时间:2026-10-17 06:21:15 评论数:
知乎反爬这几年越来越狠。抓取知乎去年我写了个抓取回答的答案的脚小脚本,纯Python,抓取知乎requests加BeautifulSoup,答案的脚没上Selenium,抓取知乎也没用Playwright。答案的脚跑通的抓取知乎那一刻,我盯着终端里滚动的答案的脚答案文本,突然觉得知乎的抓取知乎验证码系统也没那么可怕。 代码核心逻辑其实就三步。答案的脚第一步,抓取知乎伪造headers,答案的脚User-Agent要挑一个不太新的抓取知乎Chrome版本,太新的答案的脚反而容易被识别。第二步,抓取知乎带上cookies,这个得手动从浏览器复制,知乎对未登录的匿名请求限制很死,基本只能看到两三条回答。第三步,解析HTML,找到`
`这个节点,里面的文本就是回答正文。 但真正让我头疼的是翻页。知乎的回答列表是动态加载的,直接请求第二页URL返回的是空壳。我抓包看了下,发现它走的是`/api/v4/questions/{ question_id}/answers`这个接口,参数里有个`offset`字段,每次加20就行。接口返回的是JSON,比解析HTML省事多了——用`json.loads()`转成字典,然后遍历`data`字段,每个元素里的`content`键就是渲染后的HTML片段。 这里有个坑。接口返回的`content`字段里全是`

`标签和`
`,直接存进数据库会带着一堆标签。我用正则`re.sub(r'<[^>]+>', '', content)`粗暴地剥掉所有标签,再把`"`这类实体转回正常字符。效果还行,就是偶尔会漏掉代码块里的换行符,导致代码挤成一坨。 限制频率这步我做得比较粗暴——每个请求之间`sleep(2)`,加上随机抖动。知乎的限流策略挺迷的,有时候连续请求几十次都没事,有时候刚发三次就弹验证码。后来我干脆加了个重试机制,检测到返回的页面里有`验证码`就停十分钟再继续。 抓下来的数据质量参差不齐。有些高赞回答写得跟小作文似的,动辄几千字,但真正有价值的干货可能就中间两段。有些匿名回答反而很实在,直戳要害。我做了个简单的关键词过滤,把带“谢邀”“利益相关”的段落单独标记出来,方便后期人工筛选。 这脚本跑了一晚上,抓了大概两千条回答。第二天看日志,中途断了四次,都是被验证码拦的。但好在断点续传做得还行,每次重启都会先查数据库里已有的回答ID,跳过已抓取的。 说到底,这种脚本也就自己用用。真要大规模爬知乎,得换分布式方案,还得处理登录态、IP池这些麻烦事。我写这个纯粹是为了分析某个话题下的舆论倾向,抓完数据就删了。知乎的反爬像猫捉老鼠的游戏,但只要你需求简单,一只普通的老鼠夹子就够了。