如何用 60 行代碼爬取知乎神回復?
作者 | 強哥
責編 | 郭芮
知乎上經常會有很多令人忍俊不禁的神回復,初看之下拍案叫絕,細思之下更是回味無窮。本文就來介紹下如何爬取知乎的神回復,揭曉其背後的原理。
知乎神回復都有些什麼特點呢?我們先來觀察一下:
大家看出什麼規律了么?短小精闢有沒有?贊同很多有沒有?所以爬取知乎神回復我們只要爬取那些贊同多又字數少的回答就可以。簡單的兩個步驟就能實現,第一步爬取知乎回答,第二部篩選回答。是不是很easy?
1.爬取知乎回答
第一步我們爬取知乎上的回答。知乎上的回答太多了,一下子爬取所有的回答會很費時,我們可以選定幾個話題,爬取這幾個話題里的內容。
下面的函數用於爬取某一個指定話題的內容:
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 - 贊同的數量。
這些欄位在下一步篩選回答的時候會用到。
2.篩選回答
爬完數據後,我們來篩選一下結果。
我們用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。
3.知乎神回復
代碼寫完了,我們來運行下看看。恰好前兩天是程序員節,我們就來篩選一下和程序員有關的神回復。一些好玩的結果如下:
1、
Q:碼農們最常說的「謊言」有哪些?
A://TODO
2、
Q:在 GitHub 上保持 365 天全綠是怎樣一種體驗?
A:曾經保持了200多天全綠,但是冷落了女朋友,一直綠到現在。
3、
Q:突然想開一家程序員主題的餐館,名字就叫程序員的菜,菜名就叫各種語言中的關鍵字,各位指點一下,有前途沒?
A:進門一個大大的 hello world,招牌菜叫「紅燒產品經理」,一定會爆滿的。
4、
Q:什麼是遞歸?
A:「不宜公開討論的政治內容」的定義和範疇本身也屬於「不宜公開討論的政治內容」。
5、
Q:編程最基本的術語 「bug」 該怎麼翻譯?
A:幺蛾子,你的程序又出幺蛾子了。
6、
Q:編程的樂趣是什麼?
A:人的成就感來源於兩樣東西,創造和毀滅。
7、
Q:作為程序員,你在編程時吃了哪些數學的虧?
A:看論文時候一個"顯然"推了我一下午。
8、
Q:土豪程序員的設備都有啥?
A:女朋友。
9、
Q:祈求代碼不出 bug 該拜哪個神仙?
A:拜雍正,專治八阿哥。
10、
Q:考上好大學學 IT 是不是當今中國窮人家孩子晉級中產唯一的出路?
A:對,就4條路。寫代碼,搞金融,在代碼圈搞金融,在金融圈寫代碼。
11、
Q:為什麼程序員無論到哪兒都喜歡背電腦包,哪怕裡面沒有裝電腦?
A:因為他們沒有別的包。
12、
Q:為什麼程序員的女朋友或老婆顏值普遍要高於男方很多?還是說程序員已經算是婚戀市場的優質股了?
A:程序員女朋友顏值高,我是服的,因為隨便問十個程序員他的女朋友是誰,有九個回答是新垣結衣。
13、
Q:程序員夫妻結婚戒指刻什麼字好?
A:0 error 0 warning.
14、
Q:IT 工程師被叫「碼農」時是否會不舒服?
A:我們好歹還是人,產品和設計已經是狗了……
15、
Q:怎麼找到喜歡程序員的妹子做女友?
A:看緣分,知乎上這麼多用戶,你關注到我就是緣分。
16、
Q:程序員女朋友如何給程序員男朋友過生日?
A:告訴他,介面已經準備好了。
17、
Q:哪些話可以惹火程序員?
A:路過他電腦前時說一句,呦,又在寫bug呢!
18、
Q:我的一位老師說,Java 適用於大型軟體而 C# 適用中小型軟體。這是真的么?
A:Java有項天賦,就是能把中小型軟體寫成大型的。
19、
Q:為什麼程序員薪資那麼高?
A:時薪又不高。
20、
Q:是不是大部分程序員都在抱怨工資低?
A:誰、誰在抱怨工資高?
21、
Q:單身程序狗解決了一個技術難題後沒有妹子可以炫耀或誇一下自己怎麼辦?
A:現在你明白了吧,為什麼那麼多程序員要寫技術博客。
22、
Q:中國程序員是否偏愛「衝鋒衣+牛仔褲+運動鞋」的衣著?如果是,為何會形成這樣的潮流?
A:穿那麼好看給程序看嗎?
23、
Q:為什麼我認為程序員似乎大多不善言辭?
A:你就當是我們情商低就好了,這樣你開心,我們也開心。
24、
Q:在中國,年齡最大的程序員不過40歲左右,請問中國的程序員未來還可以做什麼?
A:這跟為什麼90後沒人活過30歲是同一個原理。
25、
Q:如何回復程序員發來的簡訊:「Hello world」?
A:hello nerd.
26、
Q:為什麼程序員不應該會修電腦?
A:范冰冰需要會修電視機嗎?
27、
Q:同事說自己 C++ 水平全中國第一,怎麼讓他意識到自己沒那麼厲害?
A:實不相瞞,我也不是裝逼:我的 C++ 水平全國第 0。
28、
Q:為什麼 iPhone 刪軟體時,所有圖標都要抖?
A:第三方軟體是嚇得,系統自帶軟體是嘚瑟。
29、
Q:iPhone 處理器的性能按照現在每年翻一倍的節奏,是不是很快就能趕上甚至超過台式電腦的處理器?
A:小時候我總覺得過兩年我就能和大我兩歲的哥哥一樣大了。
30、
Q:有哪些反人類的科技發明或設計?
A:電腦連不上網,診斷以後它提示我要聯網解決。
31、
Q:既然思想是我的,那麼為什麼有時候我控制不了我的負面情緒?
A:操作系統不會允許用戶訪問、修改及刪除核心系統文件,因為這會損壞系統,導致運行異常。
32、
Q:如何看待某些人下載軟體喜歡到官網的偏好?
A:同學你沒中過百度全家桶吧?
33、
Q:為什麼很多人買筆記本打遊戲,而不用性能更好的台式機?
A:因為買不起房子......
34、
Q:Chrome 真的很費電嗎?
A:不費電,我現在就在用Chrome,用到現在這麼久,筆記本電量還有50%,我估訁
35、
Q:MacBook 上安裝 Windows 後的使用體驗如何?
A:像突然間有了軟肋,並且還失去了鎧甲。
36、
Q:為什麼有人願意花幾千元買 iPhone ,卻不願意花幾十元買正版 iPhone 軟體和遊戲?
A:因為他們下載不到iPhone。
37、
Q:有什麼 App 取的名字特別驚艷?
A:水表助手…是查快遞的…
38、
Q:如何用 iPad 遙控 PC 關機?
A:瞄準PC電源鍵扔過去。
39、
Q:如何評價 Internet Explorer?
A:下載其他瀏覽器的瀏覽器
-----一年後-----
IE8以下好爛,做前端想哭的節奏。
40、
Q:一個完整的 PPT 做下來,最讓你頭疼的是什麼?
A:怎樣向領導隱藏自己的實力。
41、
Q:什麼是 Vim 可以做而 Emacs 做不到的?
A:幫助烏干達的可憐兒童……
42、
Q:蘋果用戶為什麼選擇蘋果?
A:因為不用蘋果的用戶不是蘋果用戶。
43、
Q:有線滑鼠會被無線滑鼠取代嗎?
A:我覺得在網吧有線滑鼠就不會被取代。
44、
Q:計算機世界裡有哪些經典謠言?
A:我已閱讀並同意該條款。
45、
Q:計算機系的學生都有哪些口頭禪?
A:我電腦上運行得好好的啊??
46、
Q:如何看待百度官博公開闢謠涉李彥宏家事傳聞?
A:「中國人對隱私沒那麼敏感,願意用隱私換取便利。」——李彥宏
47、
Q:在飛機上遇到了馬雲該怎麼聊天?
A:Hello Jack, my name is Jackson.
48、
Q:如何看待百度在魏則西事件過去之後又悄悄的把承諾整改的廣告提示顏色調淡了?
A:請大家不要黑百度,我是做前端開發的,這是時間久了,網頁CSS掉色了。
作者:強哥,資深Python程序員,先後供職於Morgan Stanley和ebay,擅長爬蟲、web開發、數據分析。
聲明:本文首發於作者個人公眾號Python與數據分析,為作者投稿,版權歸其個人所有。
「徵稿啦」
CSDN 公眾號秉持著「與千萬技術人共成長」理念,不僅以「極客頭條」、「暢言」欄目在第一時間以技術人的獨特視角描述技術人關心的行業焦點事件,更有「技術頭條」專欄,深度解讀行業內的熱門技術與場景應用,讓所有的開發者緊跟技術潮流,保持警醒的技術嗅覺,對行業趨勢、技術有更為全面的認知。
如果你有優質的文章,或是行業熱點事件、技術趨勢的真知灼見,或是深度的應用實踐、場景方案等的新見解,歡迎聯繫 CSDN 投稿,聯繫方式:微信(guorui_1118,請備註投稿+姓名+公司職位),郵箱(guorui@csdn.net)。
※教你用 100行Node.js 代碼,快速構建一個靜態網站生成器!
※Python術語恐遭強制修改;蘋果Safari曝漏洞;華為提前發布5G手機
TAG:CSDN |