⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 why技术 「why技术」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注**微信公众号:【芋道源码】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

今天吃了一个瓜,真的是太好吃了。

虽然 2022 年都还没过半,但是我个人已经把这个瓜评选为年度前三了。很久没有吃过这么有质量、又让我酣畅淋漓的瓜了。

事情这样的,我在知乎上刷到了这样的问题:

按理来说,我是一个数学渣的,这种关于数学的问题我一般都不是很感兴趣。我甚至都不记得我高考的时候数学考了多少分了。

但是,我还是鬼使神差地点了进去。

没想到,这一点进去,我就陷进去了。

题目大概是说 B 站上有个 up 主说自己高考数学的时候差不多 35 分钟就把题做完了,最后考了 149 分。

这个 up 主其实挺好的,我还专门去看了一下他之前的视频,他今年一月份发的视频里面说自己是在美国攻读博士学位,学的是纯数学专业。

然后他的高考数学分数没有问题,因为他后面晒了自己的成绩单,但是由于没有可以佐证的证据, 35 分钟这个时间就特别有争议了。

大家围绕着这个时间就开始吵起来了。

一拨人说应该问题不大,一拨人说绝无可能。

于是就出现了下面这样的一个回答:

https://www.zhihu.com/question/522084520/answer/2394053852

总体意思就是有个不愿意透露姓名的、参加过数学奥林匹克大赛的数学大佬,他说他觉得没有人可以在 35 分钟之内高考数学拿到 149 分。

他还立下了奖金 100w 的战书:

在 2022 年 6 月 7 日中午 12 点集合,等当天试卷出来之后全网直播,40 分钟之内 145 分以上即可,参赛费 1 万,挑战成功奖金 100 万。

他也知道知乎上能人辈出,所以特别欢迎大家来打他的脸。希望大家帮他扩散这个消息,让更多的人看到,如果能凑够十个人就开搞。

此消息一出,各路吃瓜豪杰闻风赶到。我给你看看这个回答的数据:

3.3w 人点赞,6805 条评论,5736 人追更,1.7w 人收藏,很恐怖的数据了。

因为答主最后一次更新在 3 月 20 号。至今已经过去了 2 个多月了,我当然第一时间是想知道截止现在有多少人报名了。

所以我想在评论区里面找到答主关于这方面问题的回复。

但是 6800 多条评论,这么多评论直接影响到我吃瓜的速度了。知乎网页版上分页就分了 121 页,而且里面还夹杂着特别多的“查看回复”:

“查看回复”,就是下面这种楼中楼的情况:

我翻了几页,就发现事情不对,这瓜虽然好吃,但是一页页地翻的话,吃起来也太费劲了。

你知道,我是程序员嘛。

所以...

扒评论

知乎的评论我看了一下,特别的好扒,结构也不算复杂。

从开发者工具中看到的接口和响应是这样的:

看它这个接口,里面有个 limit=20&offset=0,猜也能猜出来,limit=20 的意思是一页显示 20 条,然后 offset=0 说明它是基于偏移量来做的分页。

然后返回的数据中有一个 paging 的属性。很重要,所以我把这个属性单独拿出来说:

前两个属性不多说了,分别用来标识当前是否第一页和最后一页。

接着有个 next 和 previous,表示上一页和下一页。注意看这两个属性唯一的差别就在 offset 上,一个是 0,一个是 20,也就是说一页显示 20 个。

totals 代表有 2417 条数据。一页 20 个,所以一共 121 页。

那么问题就来了,明明前面说了 6805 条评论,这里怎么只有 2417 条呢?

这个差距也太大了吧?

是的,我开始也有这个疑问,于是我随便找了一个"查看回复"点了一下:

在开发者工具里面看到了这样的请求和响应:

看到接口名称的时候,我一瞬间都懂了。

前面的 2417 条,是 root_comments。每个 root_comments 下面会挂很多 child_comments。

拿个实际的数据来说,就是这个意思:

所以我的策略是先把 root_comments 都拿下来。

我想要拿到的数据应该是谁评论了什么内容,这个内容有多少人点赞,对应的数据是这样的:

所以这个程序写起来很简单,就这么几行代码:

从输出的结果来看,是没有毛病的:

但是我发现一个神奇的事情是这样的:

当我获取到 offset=420 的时候,只给我返回了两条数据再然后就全是空了:

一直到 offset=2420 ,也就是最后一页,都是空的:

我不理解,但是我也找不到为什么,猜测应该是触发到了他们的某个限制策略了吧。

前面说了知乎是根据偏移量分页的,很有可能的一个逻辑就是当 offset 大于某个值的时候,系统认为这个值不合理,觉得你有可能是在刷数据,那么我就不给你数据了。

我想找找其他的帖子来论证我的观点,但是一时间竟然没有找到一个回答下面有超过 5000 个评论的帖子,所以这条路没有走通。但是也侧面证明了,这确实是一个神贴,在整个知乎都属于少部分的情况,出点奇奇怪怪的异常也是很正常的嘛。

但是我发现了另外一个问题,其他评论不多的帖子,比如之前一篇关于成都的,只有 722 个评论。

当我点击评论的时候是这样的:

弹窗加上下拉瀑布流的形式进行的展示,和手机上的展示类似。根本就看不到什么分页信息,这才是偏移量分页的正确打开方式。

因为可以带着上一次返回的数据的最大 id 去做 limit 查询,这也是大数据量的情况下,一个非常好的分页手段。

具体好处就不展开了,老八股文了。这只是一个应用场景而已。

回到我们的神贴中,前面我说了它下面是有分页的,但是通过接口访问到 offset=440 的时候,只展示了两条数据之后,就没有数据了。

也就是说接口最多只返回 442 条 root_comments 类型的数据。442,一页 20 条,一共 23 页。

所以我只需要在评论页上点击到 23 页,就能证明我的观点。

首先我直接点击最后一页的时候,是一片空白,和我们程序表现一致:

然后,我就从第一页开始,一页页地点,点到 23 页的时候,果然是符合我的猜测的:

虽然后面还有接近 100 页,但是全是空白页,这应该是知乎的一个 BUG 吧?

算了,不深究。

先能拿多少数据就拿多少数据,牢记使命,吃瓜的时候要跟着主线走,先把主线剧情打通关。千万不要因为走得太远,而忘记自己吃瓜的初衷。

现在的主线就是 root_comments。

而我已经把 root_comments 的数据拿到了,还要获取对应的 child_comments 怎么搞呢?

还是得找到对应的接口才行。

当点击评论下面的“查看回复”时,接口是这样的:

其中有一串神秘的数字,10093095452,这是什么玩意?

我也不知道,但是我知道这是一种 restful 风格的请求,所以这个数字,是一个入参。

既然是获取 root_comments 下的 child_comments,这个入参一定和 root_comments 有关。

于是我拿着这串数字直接去搜索了获取 root_comments 时的第一页返回数据:

看我标注了五角星的地方,原来这串神秘数字,就是每个 root_comments 的 id 呀。

而且还有一个意外收获,我发现返回的数据结构里面有个 child_comment_count 属性,这个数据就是代表这个 root_comments 下面有多少个评论。

所以,我在解析 root_comments 的时候,只需要判断一下对应的 child_comment_count 属性是否为 0。不为 0,则说明是有回复的,按照前面说的 restful 的方式获取数据即可。

也就是在程序中加入这样的逻辑:

而 handleChildComment 的关键其实就是拿到这个 url,后面的代码就和解析 root_comments 基本一致:

把代码跑起来,控制台日志打印得哗哗的:

检查了一下,看起来没有毛病。

接下来就更简单了,把数据搞到数据库里面去就完事了。

最后一共拉取到了 4267 条数据:

距离 6800 条评论还差一点,原因前面说了,当 offset 大于某个值的时候,接口就没有返回数据了。

这不重要,反正大部分数据都拿到了。

接下来就是安心吃瓜了。

开始吃瓜

因为我最关心的是答主说了些什么事情。

所以我首先过滤了一下 cna777 这个答主的所有回复:

这个吃瓜的姿势就很舒服了。

从答主的回答来看,好像截至 5 月 26 号,只有三个人报名,如果到 6.1 还没有 10 个人的话,可能今年就不会组织了。

果然是吃瓜的人很多,但是都真的只是吃瓜而已。

其中我还看到答主有这样的一个评论,有点意思,我当然要看看上下文是什么了。

前面扒评论的时候我说了,我把 root_comments 的 id 存下来了,所以只需要过滤指定的 id,就能找到上下文:

原来是有人质疑答主是否有这么多钱。这个没啥意思,但是我惊讶地发现这个 root_comments 的 id 下面居然有 197 条评论。

是一个非常有争议性的评论,所以我看了一下评论的内容:

然后找到了对应的页面上的评论,把这 197 条评论全部看完了:

总结起来就是说这个叫做 kiki 的同学,说他是高中数学老师,他觉得这个挑战可以完成,但是不知道为什么,即使非常多的吃瓜群众叫他展现一波实力,他也一直顾左右而言它,并不正面应战。

主要是质疑答主是否能拿出这 100w,这个质疑也在其他的评论中出现过。

但是我就奇怪了,要是真的有实力就直接去报名啊。主要是现在报名的人都没有 10 个,大家就开始怀疑答主能否拿出 100w。然后借题发挥,输出自己的各种观点。

这个逻辑的先后顺序也不对的嘛,答主不是多次说了嘛,等报名人够 10 人了,他会去公证处进行公证的嘛。

接着我想看看哪个评论的话题性是最大的,也就是 root_comments 的 child_comment_count 数是最大的。

我截取了排名前十的数据:

第一位是一名叫做“无亡”的用户,他说:

我要挑战 天津考生 天津卷常年 40 分钟以内写完 很多次 150

然后下面有 610 个回复:

从评论上看这个哥们好像确实报名了,也是第二个报名的。

瞬间觉得这真的是个人才啊,于是想去他的主页看看这是何方神圣。

结果...

这是牛逼吹得太大,兜不住了,自己就销号了?

这里答主说的“退乎”的人,应该就是这个“无亡”同学吧:

所以,这个故事告诉我们什么?

口嗨一时爽,装逼要谨慎。

回复第二多的是这个:

很多吃瓜群众都愿意对这个比赛进行众筹,我粗略地算了一下,好像大家的钱加起来,距离 100w 也不算特别远了。

说真的,要是这个活动办起来,我也愿意花钱买个门票,看看应战的人到底是何方神圣。

翻了很多评论,反正就是有几个人装逼说问题不大,但是一叫报名就各种各样的借口。

然后我换了一个视角,按照评论点赞数最高进行排序:

前 10 里面,我最喜欢的是这个评论:

真的是这样的,只要在任何的社交平台里面讨论到跑步相关的话题,总是有人冒出几个特别离谱的成绩,吹得是有板有眼的。

但是真的要说在线下来对线,真刀真枪地干一场,马上各种各样的理由就来了,反正就是不承认自己在吹牛逼。

包括这个评论下面也是,大家又开始关于跑步成绩吵起来了。

用我们程序员的话说就是:no bb,show me code.

还在评论里面发现了一个角度刁钻的哥们:

他居然想组局对赌,真的是处处是人才啊。

我还发现了特别多的评论是"cy",我也不懂是啥意思。就搜了一下,原来是“插眼”的意思。

要说插眼,我就懂了。我盲僧插眼贼溜。

有 10 分之一的评论都是 cy:

评论区还有特别多的瓜可以吃,但是我就不一一列举了。

我接着就去了 B 站,看到了两个相关的视频。

第一个是这个:

https://www.bilibili.com/video/BV1Va411t7CV/?spm_id_from=333.788.recommend_more_video.2

这个 up 主的自我介绍是这样的:

我高考数学 148 分,考入清华基课班竞赛业余选手,教了 12 年数学。但是做题巅峰事情的我应该也做不到,但是我联系报名了大众组,重在参与。

这哥们,一看就是实在人,实力在线,但是不轻易装逼,报个大众组,赚个噱头,稳得一笔。

这个视频下面有个评论是把我看笑了:

我也来装一个,本人高考728分,现在在麻省理工数学系读博,本科期间总共发表了接近500篇sci,研一的时候读到过哥德巴赫猜想,花了我两天才解决掉,也因此获得过菲尔兹奖,我想说,高考我50分钟做完数学满分,但这也算我的极限了,因为我是看到题目就想到答案,再加上写的时间,如果写的再快点最少也要40几分钟吧,40分钟以内根本不可能。

装完了,爽!

很好地讽刺了这个话题下面的一些“装逼犯”。

而我想说的是:兄弟,别光喝酒,吃几颗花生米啊,边吃边说。

第二个视频是这个:

https://www.bilibili.com/video/BV1sP4y1M7K4/?spm_id_from=333.788.recommend_more_video.-1

这个大佬给出的结论是有可能。因为考试之前是可以提前十分钟拿到试卷,但是不能动笔的。

我依稀记得好像确实是先拿到了试卷,但是不能动笔。至于是提前多久那就不记得了。

大佬说,有这十分钟,完全可以通过口算,把选择题和填空题做完。

是的,没听错,可以通过口算,秒杀高考数学绝大部分的选择题和填空题:

听得我一愣一愣的:这还是人吗?

这瓜越往后面吃,我越觉得人和人之间的参差是巨大的。在这些学神面前,我都不好意思说自己是学渣。

在我吃完瓜之后,我发现答主更新了:

太遗憾了,居然没有把局组起来。到最后,还是只有三个人报名了。

但是答主表示明年还能再来,只要凑够十人我们随时可以开始。

那么,这个叫做“李笑”的、不在国内无法参赛的、看起来很厉害的用户,不知道到时候会不会迎战:

我相信你是个大佬,只不过这一副拿学历说事儿的样子,实在不敢恭维。

另外,我是真的想这个活动举办起来,有主办方,有赞助商的那种,然后全平台直播。

对了一定要有解说,不然我是真的看不懂。

虽然这些题我是不会了,但是吃瓜,我一定站在最前线。

文章目录
  1. 1. 扒评论
  2. 2. 开始吃瓜