你好呀,我是歪歪。
周末的时候吃了一个瓜,真的是太好吃了。
虽然 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 人了,他会去gz处进行公正的嘛。
接着我想看看哪个评论的话题性是最大的,也就是 root_comments 的 child_comment_count 数是最大的。
我截取了排名前十的数据:
第一位是一名叫做“无亡”的用户,他说:
我要挑战 天津考生 天津卷常年 40 分钟以内写完 很多次 150
然后下面有 610 个回复:
从评论上看这个哥们好像确实报名了,也是第二个报名的。
瞬间觉得这真的是个人才啊,于是想去他的主页看看这是何方神圣。
结果…
这是牛逼吹的太大,兜不住了,自己就销号了?
这里答主说的“退乎”的人,应该就是这个“无亡”同学吧:
所以,这个故事告诉我们什么?
口嗨一时爽,装逼要谨慎。
回复第二多的是这个:
很多吃瓜群众都愿意对这个比赛进行众筹,我粗略的算了一下,好像大家的钱加起来,距离 100w 也不算特别远了。
说真的,要是这个活动办起来,我也愿意花钱买个门票,看看应战的人到底是何方神圣。
翻了很多评论,反正就是有几个人装逼说问题不大,但是一叫报名就各种各样的借口。
然后我换了一个视角,按照评论点赞数最高进行排序:
前 10 前面,我最喜欢的是这个评论:
真的是这样的,只要在任何的社交平台里面讨论到跑步相关的话题,总是有人冒出几个特别的离谱的成绩,吹的是有板有眼的。
但是真的要说在线下来对线,真刀真枪的干一场,马上各种各样的理由就来了,反正就是不承认自己在吹牛逼。
包括这个评论下面也是,大家又开始关于跑步成绩吵起来了。
用我们程序员的话说就是:no bb,show me code.
还在评论里面发现了一个角度刁钻的哥们:
他居然想组局对赌,真的是处处是人才啊。
我还发现了特别多的评论是”cy”,我也不懂是啥意思。就搜了一下,原来是“插眼”的意思。
要说插眼,我就懂了。我盲僧插眼贼溜。
有 10 分之一的评论都是 cy:
评论区还有特别多的瓜可以吃,但是我就不一一列举了。
我接着就去了 B 站,我看到了两个相关的视频。
第一个是这个:
这个 up 主的自我介绍是这样的:
我高考数学 148 分,考入清华基课班竞赛业余选手,教了 12 年数学。但是做题巅峰事情的我应该也做不到,但是我联系报名了大众组,重在参与。
这哥们,一看就是实在人,实力在线,但是不轻易装逼,报个大众组,赚个噱头,稳得一笔。
这个视频下面有个评论是把我看笑了:
我也来装一个,本人高考728分,现在在麻省理工数学系读博,本科期间总共发表了接近500篇sci,研一的时候读到过哥德巴赫猜想,花了我两天才解决掉,也因此获得过菲尔兹奖,我想说,高考我50分钟做完数学满分,但这也算我的极限了,因为我是看到题目就想到答案,再加上写的时间,如果写的再快点最少也要40几分钟吧,40分钟以内根本不可能。装完了,爽!
很好的讽刺了这个话题下面的一些“装逼犯”。
而我想说的是:兄弟,别光喝酒,吃几颗花生米啊,边吃边说。
第二个视频是这个:
这个大佬给出的结论是有可能。因为考试之前是可以提前十分钟拿到试卷,但是不能动笔的。
我依稀记得好像确实是先拿到了试卷,但是不能动笔。至于是提前多久那就不记得了。
大佬说,有这十分钟,完全可以通过口算,把选择题和填空题做完。
是的,没听错,可以通过口算,秒杀高考数学绝大部分的选择题和填空题:
听的我一愣一愣的:这特么还是人吗?
这瓜越往后面吃,我越觉得人和人之间的参差是巨大的。在这些学神面前,我都不好意思说自己是学渣。
在我吃完瓜,写完文章之后,我发现答主更新了:
太遗憾了,居然没有把局组起来。到最后,还是只有三个人报名了。
但是答主表示明年还能再来,只要凑够十人我们随时可以开始。
那么,这个叫做“李笑”的、不在国内无法参赛的、看起来很厉害的用户,不知道到时候会不会迎战:
我相信你是个大佬,只不过你拿学历说事儿的样子,真的 low。
另外,我是真的想这个活动举办起来,有主办方,有赞助商的那种,然后全平台直播。
对了一定要有解说,不然我是真的看不懂。
虽然这些题我是不会了,但是吃瓜,我一定站在最前线。