公众号:爱写bug(ID:iCodeBugs)

前言:

周末了,围观几个知乎福利话题:

女生身材好是什么体验?:https://www.zhihu.com/question/328457531

拥有一双大长腿是怎样的体验?:https://www.zhihu.com/question/297715922

有个身材火辣的女朋友是怎样一种体验?:https://www.zhihu.com/question/313825759

这是真福利吖,点开一个问题看一下答主的回答,,,全都是高质量图片:

图片都是一些个人精品照,质量很高。

可是这每个话题下都有上千条回答,这得看到啥时候,不停的刷新也得很久。。。于是就写了这段代码把这些图片都下载了,考虑到一些数据可能用到,就顺道一起存到数据库了。包括图片地址、答主主页地址、答主昵称、答主、个性签名、答主粉丝、相关问题地址、赞同数等等等。看成果图:

我怀疑你在开车,但是我没有证据

尊重答主的分享,所以 以每一位答主昵称来命名其图片的父目录文件夹。但是最后浏览图片一个一个文件夹太麻烦了,所以我统一整理了一下一共 三个话题下2325张图片放在一个文件夹里,想直接观摩一下的同学公众号后台回复:知乎,压缩包合集发给你(一个月内有效),下面是讲获取的方法,只对图片感兴趣的不用看了,去回复吧。

言归正传:

点开一个话题,进入开发者工具,刷新页面,在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 用来构造请求urlurl = 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_nameif 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')

图中存储了答主引用的其他话题标题及地址,可以把这个地址传回去循环获取,直到所有类似话题图片全部下载。

算了,太多了,营养跟不上。这里就打包开头那三个话题前800条回答的图片共2325张。公众号回复 知乎 获得压缩包。

结语:

后面我大概看了一下里面的图片,里面还是有一点点重复的,而且还有一些什么表情图在里面,这都没什么,忍不了的是里面还有一点男士 秀自己的照片。。。跟预期不一样吖。

大家可根据情况加些判断函数,例如图片中间大概位置的像素点是否相同,来真正的把重复图片去掉。加些人体身材特征值对比,去掉男士的图片和表情图。这个太慢了,有时间的朋友自行发挥,我是要出去玩喽,周末开心。

源码地址:https://github.com/zhangzhe532/icodebugs/tree/master/DataAnalysis/zhihu_get_pic

公众号:爱写bug

转载于:https://www.cnblogs.com/zhangzhe532/p/11148919.html

围观知乎真福利话题,放松一下。相关推荐

  1. 周末了,围观知乎福利话题,放松一下

    公众号:爱写bug(ID:iCodeBugs) 前言: 周末了,围观几个知乎福利话题: 女生身材好是什么体验?:https://www.zhihu.com/question/328457531 拥有一 ...

  2. 知乎热议话题:国内卷了!欧洲为什么能突破内卷?

    点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方有惊喜留言必回,有问必答! 每天 08:15 更新文章,每天进步一点点... ...

  3. 知乎超热门话题:为什么要考985?

    各位上午好,这次给大家分享一个比较沉重的话题. 为什么要考985? 本话题在知乎上有将近千万浏览量: 有许多人并非985 211出身,包括我. 我们真的在瞎操心吗? 恰恰相反,我们更应该多关注,原因你 ...

  4. 知乎热议话题:“35岁即失业”,是危言耸听还是真实存在?

    微信公众号 | 伤心的辣条(主要分享软件测试的学习资源,帮助想转行.进阶.小白成为高级测试工程师-) ​最近一段时间什么最火? <乘风破浪的姐姐>必须榜上有名. 全员姐姐年龄均在30+,女 ...

  5. 知乎上这个话题引起了我的兴趣:在实体经济一片下滑的大环境中,哪些行业还可以?

    最近逛知乎,看到这样一个话题: 在实体经济一片下滑的大环境中,哪些行业还可以? 我们得到高赞答案作者@maomaobear的授权,将他的回答附在本文,供大家参考. 来源:知乎作者:maomaobear ...

  6. 【一学就会】爬取知乎热榜话题下的回答及评论点赞数

    最近印度新冠疫情爆发,连我国都有好几个城市出现了印度的变异病毒.为此,我特意去知乎上逛了逛关于印度疫情的话题 [如何看待全球新冠确诊超 1.5 亿,印度单日新增确诊连续 9 天超 30 万例,未来国际 ...

  7. 爬取知乎“凡尔赛语录”话题下的所有回答,我知道点开看你的很帅气,但还是没我帅

    凡尔赛文学火了.这种特殊的网络文体,常出现在朋友圈或微博,以波澜不惊的口吻,假装不经意地炫富.秀恩爱. 普通的炫耀,无非在社交网络发发跑车照片,或不经意露出名牌包包 logo,但凡尔赛文学还不这么直接 ...

  8. 主题挖掘和情感分析图书馆话题知乎用户问答行为数据

    原文链接:http://tecdat.cn/?p=16890 当前是大数据盛行的时代,各种用户信息行为数据分析的结果影响着人们的生活和学习,同时对图书馆的发展也有着影响. ▼ 本文在图书馆话题下知乎用 ...

  9. python爬虫:requests+pyquery实现知乎热门话题爬取

    文章目录 前言 1. requests库的基本使用 2. pyquery库的基本使用 3. 爬取知乎热门话题 前言 有些东西想忘都忘不了,而有些却转背就忘了!这段时间忙于找工作和学习mysql,把爬虫 ...

最新文章

  1. Python进行时间序列平稳检验ADFtest(Augmented Dickey-Fuller Unit Root Test)
  2. linux 软件包的安装
  3. 自定义控件:下拉刷新
  4. cpu进程调度---RT Throttling【转】
  5. python基础一 day6 文件操作
  6. 【转】matlab函数编译成dll供Cpp调用的方法
  7. luogu P1858 多人背包
  8. (转)RabbitMQ学习之主题topic(java)
  9. oracle对象管理及使用实验报告,oracle对象管理常用操作(objects management)
  10. yii mysql 2002_laravel 中出现SQLSTATE[HY000] [2002] 如何解决?
  11. 有害评论识别问题:数据可视化与频率词云
  12. oracle中varchar2和nvarchar2的区别
  13. python pip工具安装教程
  14. win10添加网络打印机_windows10安装Hp1010/1012/1015打印机教程
  15. CSGO显示FPS(帧数)指令集设置调用方法 2020年最新版本CSGO教程
  16. RAC环境的AFD详解
  17. 单片机设计 指纹识别系统
  18. Elasticsearch实战(十四)---聚合搜索Aggs多层嵌套聚合处理
  19. 请根据以下需求使用决策表设计测试用例
  20. JWT之:常见的认证机制

热门文章

  1. Android中65536问题剖析
  2. Python3.7安装Geenlet
  3. 什么是数据结构?什么是算法
  4. Excel表格中,删除列或行的快捷键是什么
  5. 【3D建模制作技巧分享】Zbrush中凹凸贴图、法线贴图和置换贴图的区别
  6. 数模【Mathematica(安装、入门方法、基本计算、基本图形、创建互动模型、利用数据、幻灯片演示、完整实例)】
  7. windows内网渗透PTH/PTK攻击
  8. 详细理解JS的三座大山
  9. Windows Anaconda Pytorch pkgs安装 - 相关问题
  10. introduce page