輪帶逛終極版! 抓取輪子哥(vczh)全部知乎動態

請幫我 @vczh 輪子哥!

請幫我 @vczh 輪子哥!

請幫我 @vczh 輪子哥!

事情的起因是這樣的:

前兩天我無聊打開了知乎

看到輪子哥給這個問題點了個贊:

當你有一雙好看的腿之後,會不會覺得差一張好看的臉?www.zhihu.com圖標

?這讓我突然萌發了抓取輪子哥的知乎動態的想法

並用數據來分析輪子哥到底喜歡怎麼樣的妹紙

(最初的目的的確就是這個,別打我 逃)

成果

下載下來的json:

?

一共6506json文件,每個文件里有7條動態

也就是說到最近幾天,輪子哥已經產生了4w+條動態!

這不禁讓我想起輪子哥對「如何成為知乎大v的回答」:

回答一萬個問題,你也可以 ---vczh

資料庫:

所有的動態都存在這個只有20+m的資料庫里,是不是感覺很奇妙呢?

?

思路

主要是從知乎的動態api介面下載json數據

例如輪子哥的就是:https://www.zhihu.com/api/v4/members/excited-vczh/activities?limit=8&after_id=1454742473&desktop=True

但是期間也踩了很多的

最難的就是知乎的登錄

用戶動態這種敏感信息,顯然是需要登錄&驗證之後才能訪問的

登錄:

在1月份左右,知乎換了登錄驗證的方式

登錄需要複雜無比的加密驗證過程

所以想通過簡單的post 賬號密碼和_xsrf是完全不可能了

我甚至想過直接走phantomJs來抓取數據了

後來手動翻了翻輪子哥的動態

下拉了十分鐘還沒有拉到頭...

我果斷放棄了

最後在我堅持不懈的花了2天時間研究下

我終於成功了,最後的登錄模塊:

from client import ZhihuClientfrom configs import USERNAME, PASSWD, AUTH, START_URL# 登錄知乎s = ZhihuClient(USERNAME, PASSWD).get_session()# 增加許可權認證s.headers.update({authorization: AUTH})

這裡要說一下驗證的部分

登錄之後,這種敏感數據也是不能直接拿到

需要在請求頭裡加入賬號的auth

?

想實驗同學請務必自己註冊個小號!!!!

下載數據:

def download_activs_json(s, url, count=1): 獲取用戶信息的json信息 res = s.get(url).json() with open(BASE_DIR+/data/{}.json.format(count), w) as f: f.write(json.dumps(res, ensure_ascii=False)) print(正在下載第{}份動態.format(count)) count += 1 time.sleep(1) # 遞歸下載 直到動態下載完畢 if res[paging][is_end] == False: next_url = res[paging][next] download_activs_json(s, next_url, count) else: print(所有動態下載完畢)

我通過遞歸的方式來下載所有的json

這裡再次表示對輪子哥的敬仰

你們知道為什啥么??

因為我遇到了這個報錯!

?

超過最大遞歸次數?

?

那麼問題來了,Python3最大的遞歸次數是多少?

數據入庫:

一堆json文件肯定不方便我們調用

我選擇將數據解析之後存入據庫

import osfrom lazyspider.lazystore import LazyMysqlfrom parse import parse_activitiesfrom configs import LOCAL_DB, USER_SIGBASE_DIR = os.path.dirname(os.path.abspath(__file__))def json_to_db(): json->mysql store = LazyMysql(LOCAL_DB) for file in os.listdir(BASE_DIR+/data/): file_abs_path = BASE_DIR+/data/+file # 解析json格式的文件,篩選我們要的數據 res = parse_activities(file_abs_path) for data in res: data.update({username: USER_SIG}) store.save_one_data(data, zhihu_activities) print({}入庫完畢.format(file))if __name__ == __main__: json_to_db()

這樣一些比較關鍵的數據就乖乖存在資料庫里了

ps:這裡先拿我的數據做演示,我寫這篇文章的時候輪子哥的數據還沒跑完...

?

基本分析

準備工作終於做完了

我們正式開始找妹紙

找出最受歡迎的問題:

最受歡迎的定義:重複出現次數最多的問題

比如輪子哥看到了某個問題很感興趣,就給這個問題下的很多個回答都點了贊

def find_most_like(sql): 從結果中刪選出最受歡迎的內容(前十名) 基本演算法邏輯: 取出重複出現次數最多的問題 res = store.query(sql) # 刪選重複出現的問題 並取出前10名 cahe = {} for data in res: if data[question_id] not in cahe: cahe[data[question_id]] = 0 else: cahe[data[question_id]] += 1 top10_id = sorted( cahe.items(), key=lambda item: item[1], reverse=True)[:10] top10_question = [] for item in top10_id: _ = store.find_by_field(zhihu_activities, question_id, item[0])[0] _.update({repeat: item[1]}) top10_question.append(_) return top10_question

輪子哥會給哪些問題點贊?

def want_to_vote(): 同過sql先篩選出所有點贊的行為 sql = "SELECT * FROM `EhcoTestDb`.`zhihu_activities` WHERE `verb` = ANSWER_VOTE_UP AND `answer_voteup_count` > 100" res = find_most_like(sql) return res

結果:

作為醫學生,你經歷或老師講述過的有意思的病例有哪些?www.zhihu.com圖標中國現在到底有多強大?www.zhihu.com圖標長得好看,但沒有男朋友是怎樣的體驗?www.zhihu.com圖標你的日常搭配是什麼樣子?www.zhihu.com圖標有哪些「還有這種操作?」的故事?www.zhihu.com圖標你見過最漂亮的女生長什麼樣?www.zhihu.com圖標你見過哪些員工因為作死被開除的事情?www.zhihu.com圖標有哪些十三年前(2005 年左右)看似不靠譜的預測成真了?www.zhihu.com圖標如何看待阿里巴巴安全部門的月餅事件?www.zhihu.com圖標如何看待阿里「月餅門」中最後一人(第五人)也被開除?www.zhihu.com圖標

輪子哥會關注哪些問題?

def want_to_follow(): 同過sql先篩選出所有關注的行為 sql = "SELECT * FROM `EhcoTestDb`.`zhihu_activities` WHERE `verb` = QUESTION_FOLLOW" res = find_most_like(sql) return res

結果:

如何看待上海「離婚買房」?www.zhihu.com圖標身為蘿莉的蘿莉控是什麼樣的感受?www.zhihu.com圖標你遇見老師做過最奇葩的事是什麼?www.zhihu.com圖標怎麼看無債一身輕成為新美國夢?www.zhihu.com圖標配一台台式機,預算不超過 3 萬,該怎樣選擇配置?www.zhihu.com圖標如何評價暴走大事件欄目在優酷被全部下架?www.zhihu.com圖標如何看待 .NET Native,真能達到 C++ 的性能、C# 的生產效率嗎?www.zhihu.com圖標如何看待青島房客滅門房東全家事件?www.zhihu.com圖標如何評價電影《大空頭》(The Big Short)?www.zhihu.com圖標

輪子哥會回答哪些問題?

def want_to_answer(): 同過sql先篩選出所有回答問題的行為 sql = "SELECT * FROM `EhcoTestDb`.`zhihu_activities` WHERE `verb` = ANSWER_CREATE AND `answer_voteup_count` > 100" res = find_most_like(sql) return res

結果:

劉鑫們的心理機制到底是什麼樣的呢?該不該做出道德評價?存在合理的道德審判法庭么?www.zhihu.com圖標配一台台式機,預算不超過 3 萬,該怎樣選擇配置?www.zhihu.com圖標如何看待這次華為涉及清真寺的鬧鐘提醒功能及引發的公關危機?www.zhihu.com圖標如何評價蘋果公司對限制老舊 iPhone 性能一事致歉,更換電池服務降價至 218 元?www.zhihu.com圖標當我們在學習一門編程語言的時候,我們究竟在學習什麼?www.zhihu.com圖標面試了個985的計算機應屆生,還比不過個專科生,讀985的計算機專業有什麼用?www.zhihu.com圖標假設中國男人真的配不上中國女人,誰能配得上中國女人?www.zhihu.com圖標00後和10後是不是都沒有童年,只有手機了?www.zhihu.com圖標iPhone 7 (Plus)和iPhone 8 (Plus)應該如何選擇?www.zhihu.com圖標不會用Github是怎麼樣的體驗?www.zhihu.com圖標

輪子哥最關注的妹紙?

def find_girl(): 通過sql 篩選內容含有 女 、妹、腿 的數據 sql = "SELECT * FROM `EhcoTestDb`.`zhihu_activities` WHERE `question_name` LIKE %妹% OR `question_name` LIKE %腿% OR `question_name` LIKE %女% ORDER BY `verb`" res = find_most_like(sql) return res

結果:

你見過最漂亮的女生長什麼樣?www.zhihu.com圖標如何評價男生因為讓妹子「用農夫礦泉水加噴壺」替代雅漾大噴,而遭許多妹子反駁的事?www.zhihu.com圖標女生腿長是什麼感覺?www.zhihu.com圖標現在的男性是否普遍不再對女性展開追求了?為什麼?www.zhihu.com圖標如何看待支付寶的多個生活圈只允許女性發帖且芝麻信用 750 以上才能評論?www.zhihu.com圖標世界上存在動漫少女般完美的「身體」嗎?www.zhihu.com圖標有哪些「這都能女權」的事例?www.zhihu.com圖標女生有一頭短髮是種怎樣的體驗?www.zhihu.com圖標

結論

  • 輪子哥絕對是知乎的重度用戶 @知乎小管家,快送年貨
  • 輪子哥對時事還是很關心的,比如月餅事件
  • 發照片(美的話),真的會被點贊....
  • 時不時還是會回答一些編程相關的問題
  • ......

最後

其實有了這些數據完全可以做到:

  • 輪子哥從哪一年開始給妹紙相關的問題點贊的
  • 被點贊的妹紙的照片批量下載
  • 被點贊的妹紙都有哪些共同特徵?
  • 回答問題、點贊問題的頻次分布是怎樣的?
  • ...

奈何我能力有限!

空有這麼多數據卻不能整出一些有趣的東西

有機會可以請甲哥 @路人甲 來分析一波

想要代碼的同學

關注我的公眾號:findyourownway

回復輪子哥 獲取所有代碼~

最最後,大家新年快樂喲~

推薦閱讀:

TAG:Python | vczh知乎用戶 | python爬蟲 |