原文地址及源码下载: xiaoxu​​​​​​​

在浏览知乎问题过程中,为了通过关键字快速定位到自己想要的回答,写了这个爬虫程序。可以根据问题ID和关键词组合,保存所有含有关键词的回答。

其中,必须含有的关键词以空格间隔,或含有的关键词以+间隔,例如,查找知乎ID为23437659的问题:“国内你最喜欢的城市(除家乡外生活过的城市)是哪里?为什么?”,要求回答中含有杭州,同时含有南京或武汉,则输入关键词为“杭州 南京+武汉”。其中,问题ID从问题链接中即可得到,如上述问题链接为https://www.zhihu.com/question/23437659,问题ID即为链接后面的数字。

请输入问题编号:23437659
请输入关键字(同时含有以空格间隔,或含有用+间隔):杭州 南京+武汉

符合条件的回答保存在csv文件和txt文件中,其中,csv文件只含有所有符合条件的回答的链接。

#!/user/bin/python
#-*-coding:utf-8-*-
#author:luoxiaoxu
#blog:xiaoxu.online
#Filename: ZhihuAnswerDowload.py
#Function: 爬取知乎问题中含有特定关键词的回答from bs4 import BeautifulSoup
import requests
import os
import re
import time
import csv
import jsondef GetAnswer(*Question_ID):if len(Question_ID)==0:Question_ID=input("请输入问题编号:")keyword=input('请输入关键字(同时含有以空格间隔,或含有用+间隔):')  # 例如,必须含有杭州,同时含有武汉或南京,输入“杭州 武汉+南京”keywords=keyword.split()                                            #下载全部答案,直接enterif keyword=='':keyword='无'headers = {'User-Agent':"Mozilla/5.0 (Windows NT 10.0; Win64; x64)"\" AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"}limit=10  #每次显示的答案个数offset=0  #下一次显示的回答偏移量total_num=10  #答案个数,初始设为limitbrowse_num=0  #已经遍历的回答个数record_num=0  #含关键字的回答个数title=''if not os.path.exists('知乎下载/'):os.makedirs('知乎下载/')print('\n正在爬取……\n')while browse_num<total_num:url = "https://www.zhihu.com/api/v4/questions/{Question_ID}/answers?include=content&limit="\"{limit}&offset={offset}&platform=desktop&sort_by=default"\.format(Question_ID=str(Question_ID),limit=str(limit),offset=str(offset))res=requests.get(url,headers=headers)try:res=json.loads(res.content)except:print('问题编号输入错误!\n')return Nonetotal_num=res['paging']['totals']cons=res['data']if cons is not None:if total_num<=0:print('该问题暂时无答案!')breakif title=='':title=cons[0]['question']['title']path_csv,path_txt=CreativeFile(title,keyword)  #创建csv和txt文件,csv文件为保存所有含有关键词回答的链接列表for con in cons:browse_num+=1Re=re.compile(r'<[^>]+>',re.S)answer_detail=Re.sub('',con['content'])   #获取具体回答内容flag=Trueif len(keywords)>0:flag=HasKeywords(answer_detail,keyword)  #查询是否有关键词if flag:record_num+=1author_name=con['author']['name']author_url='https://www.zhihu.com/people/'+con['author']['url_token'] if not author_name=='匿名用户' else ' 'answer_url='https://www.zhihu.com/question/'+str(Question_ID)+'/answer/'+str(con['id'])Save2File_csv(path_csv,[str(record_num)+'.',author_name,answer_url,author_url])answer_txt=[str(record_num)+'.',author_name+'   主页:'+author_url]answer_txt.append('\n\n链接:'+answer_url+'\n')answer_txt.append('\n'+answer_detail+\'\n-------------------------------------------------------------------------------\n')Save2File_txt(path_txt,answer_txt)print('已保存第%d个回答\n'%record_num)offset+=len(cons)if len(cons)<limit:  #已爬取到最后一页breakif len(keywords)==0:print('爬取完成,已保存全部%d个回答!\n'%record_num)elif record_num>0:print('爬取完成,已保存%d个与关键词有关的回答!\n'%record_num)else:os.remove(path_csv)os.remove(path_txt)print('未找到与关键词有关的答案\n')def Save2File_csv(path,content):f=open(path,'a+')writer=csv.writer(f)writer.writerow(content)f.close()def Save2File_txt(path,contents):f=open(path,'a+',encoding='utf-8')for content in contents:f.writelines(content)f.writelines('\n')def HasKeywords(answer_detail,keyword):   #判断是否含有所有关键词flag=Truefor key in keyword.split():    flag2=Falsefor sub_key in key.split('+'):flag2=flag2 or answer_detail.find(sub_key)>0if flag2:breakflag=flag and flag2if not flag:return Falsereturn Truedef CreativeFile(title,keyword):path_csv='知乎下载/'+title+'.csv'path_txt='知乎下载/'+title+'.txt'if os.path.exists(path_csv):   #若文件存在,清空f=open(path_csv,'w')f.seek(0)f.truncate()f.close()if os.path.exists(path_txt):f=open(path_txt,'w')f.seek(0)f.truncate()f.close()Save2File_csv(path_csv,[title])Save2File_csv(path_csv,['关键字:'+keyword])Save2File_csv(path_csv,['序号','作者昵称','回答链接','主页链接'])Save2File_txt(path_txt,[title,'关键字:'+keyword+'\n'])return path_csv,path_txtif __name__=='__main__':GetAnswer()

如有疑问,欢迎进入个人Blog:小序的时光机  进行交流!

画船听雨眠……

知乎zhihu:Python爬取某个问题下所有含有给定关键词的回答相关推荐

  1. python爬虫知网实例-python爬取知网

    广告关闭 腾讯云双11爆品提前享,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高满返5000元! https:github.comgnemougdistribute_crawler ...

  2. 利用Python爬取百度指数中需求图谱的关键词

    文章目录 需求背景 0.获取cookies 一.使用datetime计算查询的日期 二.爬取需求图谱关键词 三.扔进csv里 总结 已更新!!! 之前有小伙伴在评论里反应代码有点问题,今天看了下,报错 ...

  3. 利用python爬取知乎评论_一个简单的python爬虫,爬取知乎

    一个简单的python爬虫,爬取知乎 主要实现 爬取一个收藏夹 里 所有问题答案下的 图片 文字信息暂未收录,可自行实现,比图片更简单 具体代码里有详细注释,请自行阅读 项目源码: 1 # -*- c ...

  4. python爬取知乎热榜了解时事

    python爬取知乎热榜了解时事 需求 ​ 知乎热榜是我们了解时事的一个重要途径,但是如果我们每天没有那么多时间来刷知乎,但是还是想要了解知乎热榜的话,我们该怎么办呢?在这里,我想到了通过知乎爬虫的手 ...

  5. python爬取知乎回答并进行舆情分析:爬取数据部分

    python爬取知乎回答并进行舆情分析:爬取数据部分 背景 Ajax原理介绍 Request URL分析 json报文结构分析 代码 参考链接 背景 近期导师让我从社交媒体平台(包括微博.知乎.贴吧等 ...

  6. Python爬取知乎指定问题

    Python爬取知乎指定问题回答 记得上周写了个帖子,里面有想对知乎指定问题进行爬取,但知乎的反爬措施还是做得比较好的,想通过正常网页解析的手段去拿到数据是实现不了了,因为人家压根就不给你数据,最后呢 ...

  7. 如何用python爬取数据_如何使用python爬取知乎数据并做简单分析

    原标题:如何使用python爬取知乎数据并做简单分析 一.使用的技术栈: 爬虫:python27 +requests+json+bs4+time 分析工具: ELK套件 开发工具:pycharm 数据 ...

  8. Python爬虫入门教程 26-100 知乎文章图片爬取器之二

    1. 知乎文章图片爬取器之二博客背景 昨天写了知乎文章图片爬取器的一部分代码,针对知乎问题的答案json进行了数据抓取,博客中出现了部分写死的内容,今天把那部分信息调整完毕,并且将图片下载完善到代码中 ...

  9. python爬虫知乎图片_Python爬虫入门教程 25-100 知乎文章图片爬取器之一

    1. 知乎文章图片爬取器之一写在前面 今天开始尝试爬取一下知乎,看一下这个网站都有什么好玩的内容可以爬取到,可能断断续续会写几篇文章,今天首先爬取最简单的,单一文章的所有回答,爬取这个没有什么难度. ...

最新文章

  1. Java项目:学生信息管理系统(java+SSM+JSP+layui+maven+mysql)
  2. 2018.08.27 lucky(模拟)
  3. 数据库系统概论:第八章 数据库编程
  4. ffmpeg与x264有什么区别?
  5. Markdown用法
  6. 神还原女神照片!GAN为百年旧照上色
  7. h.264 去块滤波
  8. 阿里云获全球第一张云安全国际认证金牌
  9. centos 6.5 rsync+inotify 实时同步
  10. windows下bat批处理实现守护进程
  11. EnterpriseLibrary 介绍
  12. IntelliJ IDEA 快捷键 Windows
  13. docker安装DM8
  14. RemoteView流程
  15. 计算机病毒按危害程度分类可分为,计算机病毒按其危害程度可分为
  16. nodeJS Express 删除 x-powered-by
  17. 稀物(原加密空间)联合国内多家知名数藏平台,开启空投狂欢节!
  18. gvim 模板(ab命令快速生成常用Verilog模板)
  19. 关于兴业银行接口对接 注意事项
  20. linux rz命令安装,Linux下手动安装上传rz和下载sz命令

热门文章

  1. 京东图书详情页定价获取
  2. 读《楚汉传奇》中历史故事悟项目管理
  3. 基于DNN-ML的3D全息交互
  4. 基于单片机的温湿度监测系统设计(程序)
  5. 共建计算产业,共创数智未来
  6. c代码实现 ifft运算_二维FFT,IFFT,c语言实现 | 学步园
  7. linux ln命令
  8. android 连接电脑,安卓手机怎么连接电脑详细介绍【图文教程】
  9. 条件求和:SUMIF、SUMIFS函数
  10. 乱码html文档怎么恢复,乱码word文档怎么恢复