09.06 60 行代碼爬取知乎神回覆,笑的停不下來

爬取知乎神回覆很簡單,這篇文章我們就來揭曉一下背後的原理。

知乎神回覆都有些什麼特點呢?我們先來觀察一下

60 行代碼爬取知乎神回覆,笑的停不下來


60 行代碼爬取知乎神回覆,笑的停不下來


大家看出什麼規律了麼?短小精闢有沒有?贊同很多有沒有?所以爬取知乎神回覆我們只要爬取那些贊同多又字數少的回答就可以。簡單的兩個步驟就能實現,第一步爬取知乎回答,第二部篩選回答。是不是很easy?

爬取知乎回答

第一步我們爬取知乎上的回答。知乎上的回答太多了,一下子爬取所有的回答會很費時,我們可以選定幾個話題,爬取這幾個話題裡的內容。

下面的函數用於爬取某一個指定話題的內容

def get_answers_by_page(topic_id, page_no):
offset = page_no * 10
url = <topic> # 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

/<topic>

get_answers_by_page函數有兩個參數,第一個參數是話題的id,第二個參數表示爬的是第幾頁的內容。

爬下來的內容當中有幾個需要注意的字段,下圖中用黃框高亮出來了

60 行代碼爬取知乎神回覆,笑的停不下來


這幾個字段的含義如下:

  • 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,大家可以在公眾號後臺回覆“知乎神回覆”獲取地址。

知乎神回覆

代碼寫完了,我們來運行下看看。恰好昨天是程序員節,我們就來篩選一下和程序員有關的神回覆。結果如下,一共75條搞笑段子

1:Q: 碼農們最常說的「謊言」有哪些?

A: //TODO

2:Q: 在 GitHub 上保持 365 天全綠是怎樣一種體驗?

A:曾經保持了200多天全綠,但是冷落了女朋友,一直綠到現在。

3:Q: 如何反駁「程序員離開電腦就是廢物」這個觀點?

A: 不不不,很多程序員在電腦前也是廢物。

4:Q: 假如有一天所有的人都使用計算機語言說話,會是怎樣的場景?

A:hello, world.燙燙燙燙燙燙燙

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: 左輪手槍裝有一顆子彈,對著自己頭開一槍獎勵10萬元,兩槍1億,三槍2億,四槍4億,5槍16億,值得嗎?

A:只要不打要害,我告訴你,我能打到我們A站上市!!!!

40:Q: iPhone 處理器的性能按照現在每年翻一倍的節奏,是不是很快就能趕上甚至超過臺式電腦的處理器?

A: 小時候我總覺得過兩年我就能和大我兩歲的哥哥一樣大了。

41Q: 知乎給你帶來的最小限度的好處是什麼?

A: 消磨時間還不覺得罪惡。

42:Q: 有哪些反人類的科技發明或設計?

A: 電腦連不上網,診斷以後它提示我要聯網解決

43:Q: 為什麼設計師不願意被稱為美工?

A: 只要工資開的高,叫我阿姨都行。

44:Q: 為什麼有人認為網易雲音樂是業界良心?

A: 有一天突然給我推送一條消息說我要的歌詞找到了

45:Q: 為什麼沒有出現無人機自毀式攻擊武器呢?恐怖分子用過嗎?

A: 你是說導彈麼?

46:Q: 既然思想是我的,那麼為什麼有時候我控制不了我的負面情緒?

A: 操作系統不會允許用戶訪問、修改及刪除核心系統文件,因為這會損壞系統,導致運行異常。

47:Q: 魯迅雖然很牛,但在這世界十大文豪裡是不是湊數的?

A: 為什麼文豪要為文盲排的榜買單?

48:Q: 人類的哪些科技已經接近瓶頸,很久沒有重大突破了?

A: 燒開水

49:Q: 如何看待某些人下載軟件喜歡到官網的偏好?

50:Q: 為什麼很多人買筆記本打遊戲,而不用性能更好的臺式機?

A: 因為買不起房子。。。

最後,我自己是一名從事了多年開發的Python老程序員,辭職目前在做自己的Python私人定製課程,今年年初我花了一個月整理了一份最適合2019年學習的Python學習乾貨,可以送給每一位喜歡Python的小夥伴,想要獲取的可以關注我的頭條號並在後臺私信我:01,即可免費獲取。


分享到:


相關文章: