获取知乎回答内容及答主信息
爱写bug(ID:iCodeBugs)
前言:
围观几个知乎话题:
(https://www.zhihu.com/question/328457531):https://www.zhihu.com/question/328457531
(https://www.zhihu.com/question/297715922):https://www.zhihu.com/question/297715922
(https://www.zhihu.com/question/313825759):https://www.zhihu.com/question/313825759
点开一个问题看一下答主的回答.
点开一个话题,进入开发者工具,刷新页面,在xhr栏目下,会发现很多请求,左上角过滤一下,只有以 answers?
开头的才是回答内容,分析一下请求头:
知乎的请求结构出奇的简单,很意外。关键信息已在图片标明。基础URL是:https://www.zhihu.com/api/v4/questions/313825759/answers?include=
后面全都是根据 Query String Parameters
构造出来的。
然后我们分析一下答主的回答内容:
这里回答内容有可能是引用其他话题 拥有一双大长腿是怎样的体验?
的图片,也就是说,我们只要再把这个引用的话题地址获取下来,再根据新获取的地址构造请求URL, 得到该话题的请求地址,这样就可以顺着一条回答把所有引用的相似问题其他答主的图片全部下载下来。。。
点击引用的其他话题,切换知乎话题 拥有一双大长腿是怎样的体验?
。
同样看一下该话题的 Query String Parameters
只有 limit 、offset两个属性会变,而limit 为限制当页显示的回答数量,offset 为偏移量,就是本页从第几条回答开始显示,其他属性全是相同的(知乎页面限制显示回答数最大20)。这意味着不管知乎哪个问题都可由该问题的地址以相同的方法构造请求URL:
param = { 'include': '',#太长了,不展示了 'limit': '20', # 限制当页显示的回答数,知乎最大20 'offset': offset, # 偏移量 'platform': 'desktop', 'sort_by': 'default', } base_URL = 'https://www.zhihu.com/api/v4/questions/297715922/answers?include=' # 基础 url 用来构造请求url url = base_URL + urllib.parse.urlencode(param) # 构造请求地址
再点击 preview 看返回的 json 格式的信息:
有个totals,是该话题下总回答数,可以根据这个计算多少次可以遍历全部回答,考虑到后面回答内容质量就跟不上了,我们只获取前800条回答。
展开一条回答:
所有的信息包括答主信息和回答的信息都在了,content内容就是回答内容,复制下来,格式化发现这是css渲染的内容,也能理解,知乎回答必须要用富文本方式编辑,返回的内容必然是这种格式。看一下回答内容:
这个层次很明了,a 节点的 href 属性就是引用的相关问题的地址。figure 节点 下 noscript 节点下 img节点的 src 属性就是图片地址。用 pyquery 解析:
for answer in json['data']: answer_info = {} # 获取作者信息 author_info = answer['author'] author = {} author['follower_count'] = author_info['follower_count'] # 作者被关注数量 author['headline'] = author_info['headline'] # 个性签名 author['name'] = author_info['name'] # 昵称 author['index_url'] = author_info['url'] # 主页地址 # 获取回答信息 voteup_count = answer['voteup_count'] # 赞同数 comment_count = answer['comment_count'] # 评论数 # 解析回答内容 content = pq(answer['content']) # content 内容为 xml 格式的网页,用pyquery解析 imgs_url = [] imgs = content('figure noscript img').items() for img_url in imgs: imgs_url.append(img_url.attr('src')) # 获取每个图片地址 # 获取回答内容引用的其他相似问题 question_info = content('a').items() ......太多不全部展示了,有兴趣可以看一下文末完整源代码
饮水思源保存文件以答主昵称命名,以示尊敬:
def save_to_img(imgs_url, author_name, base_path): path = base_path + author_name if not os.path.exists(path): # 判断路径文件夹是否已存在 os.mkdir(path) for url in imgs_url: try: response = requests.get(url) if response.status_code == 200: img_path = '{0}/{1}.{2}'.format(path, md5(response.content).hexdigest(), 'jpg') # 以图片的md5字符串命名防止重复图片 if not os.path.exists(img_path): with open(img_path, 'wb') as jpg: jpg.write(response.content) else: print('图片已存在,跳过该图片') except requests.ConnectionError: print('图片链接失效,下载失败,跳过该图片') print('已保存答主:' + author_name + ' 回答内容的所有图片')
以图片内容的 md5 编码命名可以防止重复图片,如果图片被其他人下载之后加水印再上传,图片内容是不同的,所以可能有重复照片。
如果有需要可以把这些数据存到数据库,这里我以mongoDB为例:
#存储在mongoDB client = MongoClient(host='localhost') print(client) db = client['zhihu'] collection = db['zhihu'] def save_to_mongodb(answer_info): if collection.insert(answer_info): print('已存储一条回答到MongoDB')
图中存储了答主引用的其他话题标题及地址,可以把这个地址传回去循环获取,直到所有类似话题图片全部下载。
结语:
大家可根据情况加些判断函数,例如图片中间大概位置的像素点是否相同,来真正的把重复图片去掉。加些人体身材特征值对比,去掉男士的图片和表情图。这个太慢了,有时间的朋友自行发挥
源码地址:https://github.com/zhangzhe532/icodebugs/tree/master/DataAnalysis/zhihu_get_pic

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Python3入门(七)函数
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数 一、定义一个函数 定义一个由自己想要功能的函数,以下是简单的规则 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 () 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明 函数内容以冒号起始,并且缩进 return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None格式如下: def 函数名(参数列表): 函数体 实例: def hello(): print("hello def")
- 下一篇
SSM框架———初识MyBatis
SSM框架———初识MyBatis一.什么是MyBatis?MyBatis源自Apache的iBatis开源项目, 从iBatis3.x开始正式更名为MyBatis。它是一个优秀的持久层框架。二.为什么使用MyBatis?为了和数据库进行交互,通常的做法是将SQL语句写在Java代码中,SQL语句和Java代码耦合在一起不利于后期维护修改,而MyBatis能够帮助我们将SQL语句和Java代码分离,方便了后期因需求变动而对SQL语句进行修改。(联系properties文件的作用)三. 如何使用MyBatisa、下载MyBatis相应jar包:https://github.com/mybatis/mybatis-3/releasesb、创建Java工程,导入MyBatis jar包(mybatis-3.4.4.jar)和数据库驱动包c、创建user_info表并添加数据(此处使用MySQL) create table user_info( id char(36) primary key, user_name varchar(15) unique, password varchar(15)...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Windows10,CentOS7,CentOS8安装Nodejs环境
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS关闭SELinux安全模块
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2全家桶,快速入门学习开发网站教程
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2配置默认Tomcat设置,开启更多高级功能