知乎上经常会有很多令人忍俊不禁的神回复,初看之下拍案叫绝,细思之下更是回味无穷。本文就来介绍下如何爬取知乎的神回复,揭晓其背后的原理。

14833_wx.jpg

知乎神回复都有些什么特点呢?我们先来观察一下,如下图:

大家看出什么规律了么?短小精辟有没有?赞同很多有没有?所以爬取知乎神回复我们只要爬取那些赞同多又字数少的回答就可以。

简单的两个步骤就能实现,第一步爬取知乎回答,第二部筛选回答。是不是很 easy?

爬取知乎回答

第一步我们爬取知乎上的回答。知乎上的回答太多了,一下子爬取所有的回答会很费时,我们可以选定几个话题,爬取这几个话题里的内容。

下面的函数用于爬取某一个指定话题的内容:

def get_answers_by_page(topic_id, page_no):     offset = page_no * 10     url = <topic_url> # topic_url是这个话题对应的url     headers = {         "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36",     }     r = requests.get(url, verify=False, headers=headers)     content = r.content.decode("utf-8")     data = json.loads(content)     is_end = data["paging"]["is_end"]     items = data["data"]     client = pymongo.MongoClient()     db = client["zhihu"]     if len(items) > 0:         db.answers.insert_many(items)         db.saved_topics.insert({"topic_id": topic_id, "page_no": page_no})     return is_end

get_answers_by_page 函数有两个参数,第一个参数是话题的 id,第二个参数表示爬的是第几页的内容。

爬下来的内容当中有几个需要注意的字段,下图中用黄框高亮出来了:

这几个字段的含义如下:

  • question.title:问题的标题。

  • content:回答的内容。

  • voteup_count:赞同的数量。

  • 这些字段在下一步筛选回答的时候会用到。

    筛选回答

    爬完数据后,我们来筛选一下结果。我们用 MongoDB 中的聚合管道对回答做筛选。

    关于 MongoDB 的聚合管道的用法可以参考 Aggregation Pipeline Quick Reference 这篇文章:

    https://docs.mongodb.com/manual/meta/aggregation-quick-reference/

    代码如下:

    client = pymongo.MongoClient() db = client["zhihu"] items = db.answers.aggregate([     {"$match": {"target.type": "answer"}},     {"$match": {"target.voteup_count": {"$gte": 1000}}},     {"$addFields": {"answer_len": {"$strLenCP": "$target.content"}}},     {"$match": {"answer_len": {"$lte": 50}}},])

    上面的代码会筛选所有赞同大于 1000、字数小于 50 的回答,筛选出来的结果就是短小精辟的神回复。

    以上是核心代码,完整代码已上传 GitHub:

    https://github.com/pythonml/answer

    知乎神回复

    代码写完了,我们来运行下看看。由于关注者大部分是程序员,我们来筛选一下和程序员有关的神回复。结果如下,近百条搞笑段子

    PS:段子仅仅是作为爬虫的结果展示,供大家一笑!大家可以在评论区讨论下哪个段子最逗!

    1

    Q:码农们最常说的「谎言」有哪些?

    A://TODO

    2

    Q:计算机系的学生都有哪些口头禅?

    A:我电脑上运行的好好的啊??

    3

    Q:如何反驳「程序员离开电脑就是废物」这个观点?

    A:不不不,很多程序员在电脑前也是废物。

    4

    Q:假如有一天所有的人都使用计算机语言说话,会是怎样的场景?

    A:hello,world。烫烫烫烫烫烫烫?d}??R?0:?v??.

    5

    Q:突然想开一家程序员主题的餐馆,名字就叫程序员的菜,菜名就叫各种语言中的关键字,各位指点一哈,有前途没?

    A:进门一个大大的 hello world,招牌菜叫“红烧产品经理”,一定会爆满的。

    6

    Q:什么是递归?

    A:「不宜公开讨论的政治内容」的定义和范畴本身也属于「不宜公开讨论的政治内容」

    7

    Q:编程最基本的术语 “Bug” 该怎么翻译?

    A:幺蛾子,你的程序又出幺蛾子了。

    8

    Q:编程的乐趣是什么?

    A:人的成就感来源于两样东西,创造和毁灭。

    9

    Q:计算机世界里有哪些经典谣言?

    A:我已阅读并同意该条款。

    10

    Q:作为程序员,你在编程时吃了哪些数学的亏?

    A:看论文时候一个"显然"推了我一下午。

    11

    Q:土豪程序员的设备都有啥?

    A:女朋友。。。

    12

    Q:祈求代码不出 Bug 该拜哪个神仙?

    A:拜雍正,专治八阿哥。

    13

    Q:考上好大学学 IT 是不是当今中国穷人家孩子晋级中产唯一的出路?

    A:对,就 4 条路,写代码,搞金融,在代码圈搞金融,在金融圈写代码。

    14

    Q:为什么程序员无论到哪儿都喜欢背电脑包,哪怕里面没有装电脑?

    A:因为他们没有别的包。

    15

    Q:「Talk is cheap. Show me the code」怎么翻译比较好?

    A:屁话少说,放码过来。

    16

    Q:为什么程序员的女朋友或老婆颜值普遍要高于男方很多?还是说程序员已经算是婚恋市场的优质股了?

    A:程序员女朋友颜值高,我是服的,因为随便问十个程序员他的女朋友是谁,有九个回答是新垣结衣。

    17

    Q:为什么一部分人宁可买几个机械键盘换着用,也不愿意给自己敷一下面膜?

    A:老子不靠脸吃饭。老子靠辛辛苦苦挣来的钞票。老子想怎么花就怎么花。

    18

    Q:程序员夫妻结婚戒指刻什么字好?

    A:0 error 0 warning。

    19

    Q:IT 工程师被叫「码农」时是否会不舒服?

    A:我们好歹还是人,产品和设计已经是狗了……

    20

    Q:为什么一个销售男(30岁)会约我一个男程序员(24岁)去小区附近的星巴克?

    A:根据哥多年的经验,他应该是有巨牛逼的 idea 然后只差程序员去实现了。

    21

    Q:怎么找到喜欢程序员的妹子做女友?

    A:看缘分,知乎上这么多用户,你关注到我就是缘分。

    22

    Q:程序员女朋友如何给程序员男朋友过生日?

    A:告诉他,接口已经准备好了。

    23

    Q:作为程序员,你是如何在工作以后找到女朋友的?

    A:题主作了这么久的程序员,还喜欢女孩子已经难能可贵了。

    24

    Q:程序员转行烧烤需要做哪些准备,有哪些优势和劣势?

    A:你看,你连自己做烧烤都不知道优势劣势在哪里,所以,你还是需要一名产品经理。

    25

    Q:哪些话可以惹火程序员?

    A:路过他电脑前时说一句,呦,又在写 Bug 呢!

    26

    Q:我的一位老师说,Java 适用于大型软件而 C# 适用中小型软件。这是真的么?

    A:Java 有项天赋,就是能把中小型软件写成大型的。

    27

    Q:为什么 2014 年程序员薪资那么高?

    A:时薪又不高。

    28

    Q:是不是大部分程序员都在抱怨工资低?

    A:谁、谁在抱怨工资高?

    29

    Q:单身程序狗解决了一个技术难题后没有妹子可以炫耀或夸一下自己怎么办?

    A:现在你明白了吧,为什么那么多程序员要写技术博客。

    30

    Q:中国程序员是否偏爱「冲锋衣+牛仔裤+运动鞋」的衣着?如果是,为何会形成这样的潮流?

    A:穿那么好看给程序看吗?

    31

    Q:作为 IT 从业人员,你觉得有什么工具大大提高了你的工作效率?

    A:单身。

    32

    Q:为什么我认为程序员似乎大多不善言辞?

    A:你就当是我们情商低就好了,这样你开心,我们也开心。

    33

    Q:在中国,年龄最大的程序员不过 40 岁左右,请问中国的程序员未来还可以做什么?

    A:这跟为什么 90 后没人活过 30 岁是同一个原理。

    34

    Q:如何回复程序员发来的短信:「Hello world」?

    A:hello nerd。

    35

    Q:怎么看出 IT 男喜欢一个女生?

    A:当他拼着自己早已养成的寡言少语的习惯去死命的跟你套近乎的时候。

    36

    Q:有线鼠标会被无线鼠标取代吗?

    A:我觉得在网吧有线鼠标就不会被取代。

    37

    Q:同事说自己 C++ 水平全中国第一,怎么让他意识到自己没那么厉害?

    A:实不相瞒,我也不是装逼:我的 C++ 水平全国第 0。

    38

    Q:为什么 iPhone 删软件时,所有图标都要抖?

    A:第三方软件是吓得,系统自带软件是嘚瑟。

    39

    Q:计算机世界里有哪些经典谣言?

    A:Windows 正在联机寻找解决方案。

    40

    Q:iPhone 处理器的性能按照现在每年翻一倍的节奏,是不是很快就能赶上甚至超过台式电脑的处理器?

    A:小时候我总觉得过两年我就能和大我两岁的哥哥一样大了。

    41

    Q:知乎给你带来的最小限度的好处是什么?

    A:消磨时间还不觉得罪恶。

    42

    Q:有哪些反人类的科技发明或设计?

    A:电脑连不上网,诊断以后它提示我要联网解决。

    43

    Q:为什么设计师不愿意被称为美工?

    A:只要工资开的高,叫我阿姨都行。

    44

    Q:为什么有人认为网易云音乐是业界良心?

    A:有一天突然给我推送一条消息说我要的歌词找到了

    45

    Q:为什么没有出现无人机自毁式攻击武器呢?恐怖分子用过吗?

    A:你是说导弹么?

    46

    Q:既然思想是我的,那么为什么有时候我控制不了我的负面情绪?

    A:操作系统不会允许用户访问、修改及删除核心系统文件,因为这会损坏系统,导致运行异常。

    47

    Q:鲁迅虽然很牛,但在这世界十大文豪里是不是凑数的?

    A:为什么文豪要为文盲排的榜买单?

    48

    Q:人类的哪些科技已经接近瓶颈,很久没有重大突破了?

    A:烧开水。

    49

    Q:如何看待某些人下载软件喜欢到官网的偏好?

    A:同学你没中过百度全家桶吧?

    50

    Q:为什么很多人买笔记本打游戏,而不用性能更好的台式机?

    A:因为买不起房子。。。

    51

    Q:第一次听好耳机对你带来的震撼有多大?

    A:第一次听好耳机不会给人多大震撼,但是当换回普通耳机的时候,震撼就来了。

    52

    Q:Chrome 真的很费电吗?

    A:不费电,我现在就在用 Chrome,用到现在这么久,笔记本电量还有 50%,我估讠

    53

    Q:MacBook 上安装 Windows 后的使用体验如何?

    A:像突然间有了软肋,并且还失去了铠甲。

    54

    Q:家里所有有关产品都用苹果产品是一种什么体验?

    A:来个电话全家都响了起来。

    55

    Q:你为什么不买 iPhone X?

    A:日益增长的美好生活需要和贫穷的现实之间的矛盾。

    56

    Q:为什么有人愿意花几千元买 iPhone ,却不愿意花几十元买正版 iPhone  软件和游戏?

    A:因为他们下载不到 iPhone。

    57

    Q:有什么 App 取的名字特别惊艳?

    A:水表助手…是查快递的…

    58

    Q:你为什么要买移动硬盘?

    A:条件好了也要给自己的女人们住舒适点啊。

    59

    Q:如何用 iPad 遥控 PC 关机?

    A:瞄准 PC 电源键扔过去。

    60

    Q:如何评价 2016 年 9 月 7 日的苹果发布会?

    A:为了新 MacBook Pro,半年看了三场发布会……

    61

    Q:如何评价 Internet Explorer?

    A:下载其他浏览器的浏览器。

    -----一年后-----

    IE8 以下好烂,做前端想哭的节奏。

    62

    Q:爸妈让我攒钱买房,我却想买苹果电脑怎么办?

    A:你要真能 3 年攒 50 万的房子,差这 1 万 7 买个电脑么,大哥?

    63

    Q:有哪些垃圾手机软件?

    A:短信拦截软件! 拦截后告诉你它拦截了一条短信。 我相信 99% 的人会再去点进去看一下被拦截的短信!

    64

    Q:一个完整的 PPT 做下来,最让你头疼的是什么?

    A:怎样向领导隐藏自己的实力。

    65

    Q:什么是 Vim 可以做而 Emacs 做不到的?

    A:帮助乌干达的可怜儿童……

    66

    Q:苹果用户为什么选择苹果?

    A:因为不用苹果的用户不是苹果用户。

    67

    Q:为什么程序员不应该会修电脑?

    A:范冰冰需要会修电视机吗?

    68

    Q:你随身携带或佩戴最久的那件东西是什么?对你有什么特殊的意义?

    A:眼镜,因为瞎。

    69

    Q:颜值真的有那么重要吗?

    A:同样是互联网巨头,李彦宏是老公,而马云只能当爸爸。

    70

    Q:为什么人常会在黑夜里,变得矫情万分?

    A:要渲染的图像少了,CPU 就有空闲来思考人生了。

    71

    Q:你第一次跳槽是什么原因?后悔吗?

    A:我上班就是为了钱,他非得和我谈理想,可我的理想是不上班…

    72

    Q:面试的时候被人问到为什么你没有去清华大学,你该怎么回答?

    A:“去了,但保安没让进。”

    73

    Q:接了阿里 Offer 后毁约会被拉黑吗?

    A:得打个电话,让对方拥抱变化。

    74

    Q:男生在【日常打扮】中如何才能穿出二次元的感觉,同时显得得体又不怪异?

    A:穿女装就好了。

    75

    Q:IT 界有哪些有意思的短笑话?

    A:winrarsetup.rar。

    76

    Q:平时开玩笑开习惯了,结果跟女生表白人家以为我是开玩笑呢,怎么办?

    A:她才没误会呢,只是她比较善良。

    77

    Q:怎样拒绝女生的告白?

    A:对不起,我是个好人。

    78

    Q:你会在意你的恋人有异性闺蜜吗?

    A:女人永远不会明白男人为什么怀疑她跟别的男人的友谊,因为男人太了解男人了!

    79

    Q:如何成为“交际花”?

    A:善解人异,善解人疑,善解人意,善解人衣。

    80

    Q:如何优雅地拒绝他人的表白?

    A:我知道了,你先回去等消息吧~

    81

    Q:在哪里可更高几率遇见高质量男生?

    A:两会的时候可以去逛逛,每个地方牛逼的大叔都在那。

    82

    Q:为什么那么多人说自己寂寞、孤单、想找个男/女朋友,却还是单身?

    A:因为不仅自己丑,还嫌别人长得丑。

    83

    Q:做备胎是什么感觉?

    A:每一句话都是密码

    84

    Q:滚床单来不及卸妆怎么办?

    A:别啊,我要的就是阿凡达。

    85

    Q:男生坚持每天给女生说晚安,持续一年会怎样?

    A:IE 天天都问我要不要把它设定为默认浏览器,已经好几年了。

    86

    Q:女生送青蛙玩具给男生,代表什么意思?

    A:我送你個青蛙,你好歹還我點蝌蚪吧。

    87

    Q:女生的长相重要吗?

    A:重要,一般姑娘撒个娇就能解决的问题我都得靠武力。

    88

    Q:你为什么还单身?

    A:因为单身比较专注,单身使人进步~

    89

    Q:为什么绝大部分女生拒绝男生表白后都希望做朋友,这是什么心态?

    A:跟你客气一下啊,要不还能说什么,“我们不合适,我们还是做仇人吧”

    90

    Q:如何用歌词表白?

    A:总想对你表白,我的心情是多么豪迈。

    91

    Q:表白被拒绝时你在想什么?

    A:不愧是我看上的妹子,眼光果然不错~

    92

    Q:有个女生帮了我的忙,我想感谢她但不希望她男友误会,我该怎么做?

    A:你可以给她送个锦旗。。。