一個更 OFFICIAL 的 UNOFFICAL 庫
為啥又寫一個?
唔,說實話因為知乎前端的不穩定,維護 zhihu-py3 弄得我有點煩躁了。
每當知乎改一點點前端,就算只是改了個 html 元素類名, 我都得走一遍不完整的測試,然後慢慢的修改。如果單單是這樣還好,有時候有些改動直接造成一個或者幾個函數得重寫。而且當時我的編程習慣也不太好,解耦和 DRY 都做的不夠好,牽一髮動全身和代碼不一致這些問題也會偶爾出來煩我一下。
綜上所述,維護它其實挺累的……
不過還好有小夥伴經常幫幫忙,在這裡統一感謝一下吧。
@laike9m,@朱奕輝,@Ahonn,@ZeRoxFio,@王雪瑞,@葉知
以下 Github 小夥伴我不知道知乎帳號,如果你看到這篇文章的話,評論告訴我一下你的 Github ID 就好~感謝啦
@lishubing,@glennq,@Graker,@cssmlulu
說寫就寫,我趁著漫無目的的四月初閑下來的幾天空閑(嘛,其實是在 @秦承平 同學的不斷催促下 =,=),嘔心瀝血(並不)寫了個新的、意欲代替 zhihu-py3 的 API 庫。
在我本地開發的時候它叫做 zhihu-ng(Next Generation),後來傳 Github 上去的時候我思考再三,還是改名叫 zhihu-OAuth 了,Python 的包名也同步從 zhihu_ng 改成了 zhihu_oauth,因為這樣更達意一點。
我在 Github 的 Readme 里寫了句因為有點黑魔法所以暫時不要大肆宣傳,其實本來準備版本到 0.1.0 代碼稍微穩定一點的時候再來寫文章的,但是從 Star 和 Issues 以及群里的情況看來,已經有那麼一些人開始轉移過來了。好像也沒有發現什麼嚴重的穩定性問題吧,想了想還是早寫早享受算了(畢竟我這麼懶,以後懶得寫怎麼辦QAQ
有啥優點么?
- 比 zhihu-py3 更加穩定。意思是基本不會用著用著因為知乎前端的改動而出錯,用的稍微放心一點,當然網路方面的錯誤還是得用戶處理
- 代碼更規範,盡量 DRY。意思是說邏輯錯誤會更少,我維護起來更加簡單所以也願意多維護,你們用起來也安心……
- 同時支持 Py2 和 Py3。講真,作為一個只會 Py3 的孩子,花了我挺大功夫的……
- 基礎使用的速度提升,參見下圖。如果你想知道測試的詳細信息,看這裡。
PS:基礎使用是指單連接,作為 API 庫使用的情況下,對於那些用我的庫干爬蟲的事的同學們,請看下一段。
稍微一點吐槽
講道理哈,我其實根本沒寫過爬蟲。
zhihu-py3 一開始我沒想著開源的,因為最開始我只是為了備份我自己的答案,那時候她只是一個文件,叫 zhihu.py 基本上就是個保存答案的腳本,而且還寫的很爛!畢竟大一我還不怎麼會編程。
然而忽然有一天我想保存一個問題下的所有答案,和謝熊貓君的所有文章,於是就加上了 Question,Author 和 Post 類。
然後我不經意的搜索到了 zhihu-python,發現功能好多呀。但是我是 Py3 黨,也為了練練技術,就開始把這些功能也一個個的加進我的文件里。逐漸加到和 zhihu-python 功能差不多之後我就放到 Github 上去了。
後來我發現,好像只差一點點就幾乎啥功能都有了。這時候我想的是「先把這個庫寫完,然後就可以給知乎寫個 PC 端 APP 了呀!」所以我又去增加功能去了。什麼私信,評論,收藏之類的,凡是我覺得 APP 需要的都往裡寫。這時候的我還不知道怎麼規範的打包成模塊,zhihu.py 這個文件慢慢的變成了龐大的 1000+ 行。
這時候 @葉知 發郵件給我,說他在寫個 zhihu-rss 的 APP,感覺我這個東西不錯,問我能不能加個用戶動態的功能。我想了想感覺可以,就去加了。zhihu.py 變成了 __init__.py,為了方便他寫 dependencies,也正式上傳到了 pypi。
隨後經歷了一系列的重構 __init__.py 變成了 client.py、answer.py、question.py、author.py 等等。而我在維護這個庫的過程中慢慢棄掉了做個 APP 的想法。因為仔細思考了一下,網頁版啥功能都有啊,桌面 APP 用戶群應該很小吧。不過這個庫是個用來寫 APP 的庫的初衷一直沒有改變。
從發到 Github 以來,zhihu-py3 的描述一直是:UNOFFICIAL API Library,我也基於她寫過一個 qqqfome 的娛樂性項目,也是小 APP 性質的,還真?沒寫過知乎爬蟲,因為我對爬蟲沒什麼興趣,甚至我感覺這個庫用來做爬蟲性能差的一B呀,多線程都沒有是要爬到累死么 =,= 所以,喜歡玩爬蟲的同學們,針對自己的需求自己寫個多線程爬蟲才是墜吼的呀!(咳咳,不過我好像在知乎里答過一些爬蟲題,因為寫代碼的過程中用到的很多其實就是寫爬蟲的方法)
(嘛,不過如果 zhihu-py3 和 gevent 結合一下……寫爬蟲的話速度倒也還@#¥#%……&$#…………
咳咳,回到 zhihu-OAuth,這次它作為爬蟲庫的效率再一次下降了喲,因為好像知乎 API 有 10 個的連接限制。所以你就算 gevent 或者 multiprocessing,單 IP 的話也只能開到 10 個 worker。
所以說嘛,答應我,不要用這個庫來做爬蟲了,好咩。
技術信息
其實沒什麼好(敢)講的。如果你們對黑魔法(OAuth 驗證)感興趣可以看這個遊戲攻略。記住,悶生髮大財!
然後,代碼里也沒啥技術好說的,基本有意義的就 zhcls/normal.py、zhcls/other.py、zhcls/generator.py 這幾個文件了,分別實現基礎數據,其他知乎對象,以及列表型數據的生成……感興趣的稍微瞅瞅就行。
OAuth 相關的代碼統一在 oauth subpackage 里。
文檔
如此良心的我,項目的文檔一向很全。
這次文檔分為給用戶看的,和給對實現感興趣的開發者看的兩部分……大家各取所需吧~
尾巴
我強行把 Github 地址留到最後:GitHub - 7sDream/zhihu-oauth
因為我不喜歡我哼唧哼唧寫了一堆的東西沒人看,哼!
對了!那個文檔,我也是哼唧哼唧寫了好久的!它比代碼還多呢!所以,有啥問題看文檔先呀,這次的真的超詳細了……
啊我想起來了,用 zhihu-py3 的同學們,如果登錄遇到問題,升級到最新版,然後在調用登錄函數的時候加個參數 True 試試……如果想知道參數實幹啥的,看!文!檔!去!
最後,希望新庫不要被知乎和諧。(我偷偷這麼晚發也是這個原因……恩
以上,Enjoy it。
題圖為以CC0協議發布的無版權公有領域圖片,來自pixabay。
推薦閱讀:
※一個有顏值又好用的倒計時應用
※為什麼會有人分不清楚贊和贊同?
※你們要的「不知道診所」巡展來啦!首站天津又現長隊
※和菜頭和李笑來分別因為什麼不再登錄知乎?兩件事為知乎提高用戶的留存率的工作帶來哪些啟示?