輪帶逛終極版! 抓取輪子哥(vczh)全部知乎動態
請幫我 @vczh 輪子哥!
請幫我 @vczh 輪子哥!
請幫我 @vczh 輪子哥!
事情的起因是這樣的:
前兩天我無聊打開了知乎
看到輪子哥給這個問題點了個贊:
當你有一雙好看的腿之後,會不會覺得差一張好看的臉??這讓我突然萌發了抓取輪子哥的知乎動態的想法
並用數據來分析輪子哥到底喜歡怎麼樣的妹紙(最初的目的的確就是這個,別打我 逃)成果
下載下來的json:
?
一共6506個json文件,每個文件里有7條動態
也就是說到最近幾天,輪子哥已經產生了4w+條動態!這不禁讓我想起輪子哥對「如何成為知乎大v的回答」:
回答一萬個問題,你也可以 ---vczh
資料庫:
?
思路
主要是從知乎的動態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()
這樣一些比較關鍵的數據就乖乖存在資料庫里了
?
基本分析
準備工作終於做完了
我們正式開始找妹紙找出最受歡迎的問題:
最受歡迎的定義:重複出現次數最多的問題
比如輪子哥看到了某個問題很感興趣,就給這個問題下的很多個回答都點了贊
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
結果:
作為醫學生,你經歷或老師講述過的有意思的病例有哪些?中國現在到底有多強大?長得好看,但沒有男朋友是怎樣的體驗?你的日常搭配是什麼樣子?有哪些「還有這種操作?」的故事?你見過最漂亮的女生長什麼樣?你見過哪些員工因為作死被開除的事情?有哪些十三年前(2005 年左右)看似不靠譜的預測成真了?如何看待阿里巴巴安全部門的月餅事件?如何看待阿里「月餅門」中最後一人(第五人)也被開除?輪子哥會關注哪些問題?
def want_to_follow(): 同過sql先篩選出所有關注的行為 sql = "SELECT * FROM `EhcoTestDb`.`zhihu_activities` WHERE `verb` = QUESTION_FOLLOW" res = find_most_like(sql) return res
結果:
如何看待上海「離婚買房」?身為蘿莉的蘿莉控是什麼樣的感受?你遇見老師做過最奇葩的事是什麼?怎麼看無債一身輕成為新美國夢?配一台台式機,預算不超過 3 萬,該怎樣選擇配置?如何評價暴走大事件欄目在優酷被全部下架?如何看待 .NET Native,真能達到 C++ 的性能、C# 的生產效率嗎?如何看待青島房客滅門房東全家事件?如何評價電影《大空頭》(The Big Short)?輪子哥會回答哪些問題?
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
結果:
劉鑫們的心理機制到底是什麼樣的呢?該不該做出道德評價?存在合理的道德審判法庭么?配一台台式機,預算不超過 3 萬,該怎樣選擇配置?如何看待這次華為涉及清真寺的鬧鐘提醒功能及引發的公關危機?如何評價蘋果公司對限制老舊 iPhone 性能一事致歉,更換電池服務降價至 218 元?當我們在學習一門編程語言的時候,我們究竟在學習什麼?面試了個985的計算機應屆生,還比不過個專科生,讀985的計算機專業有什麼用?假設中國男人真的配不上中國女人,誰能配得上中國女人?00後和10後是不是都沒有童年,只有手機了?iPhone 7 (Plus)和iPhone 8 (Plus)應該如何選擇?不會用Github是怎麼樣的體驗?輪子哥最關注的妹紙?
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
結果:
你見過最漂亮的女生長什麼樣?如何評價男生因為讓妹子「用農夫礦泉水加噴壺」替代雅漾大噴,而遭許多妹子反駁的事?女生腿長是什麼感覺?現在的男性是否普遍不再對女性展開追求了?為什麼?如何看待支付寶的多個生活圈只允許女性發帖且芝麻信用 750 以上才能評論?世界上存在動漫少女般完美的「身體」嗎?有哪些「這都能女權」的事例?女生有一頭短髮是種怎樣的體驗?結論
- 輪子哥絕對是知乎的重度用戶 @知乎小管家,快送年貨
- 輪子哥對時事還是很關心的,比如月餅事件
- 發照片(美的話),真的會被點贊....
- 時不時還是會回答一些編程相關的問題
- ......
最後
其實有了這些數據完全可以做到:
- 輪子哥從哪一年開始給妹紙相關的問題點贊的
- 被點贊的妹紙的照片批量下載
- 被點贊的妹紙都有哪些共同特徵?
- 回答問題、點贊問題的頻次分布是怎樣的?
- ...
奈何我能力有限!
空有這麼多數據卻不能整出一些有趣的東西有機會可以請甲哥 @路人甲 來分析一波想要代碼的同學
關注我的公眾號:findyourownway回復輪子哥 獲取所有代碼~最最後,大家新年快樂喲~
推薦閱讀: