今天在無意之中發現了一個知乎的開源爬蟲,是基於Python的,名字叫zhihu_oauth,看了一下在github上面star數還挺多的,貌似文檔也挺詳細的,於是就稍微研究了一下。發現果然很好用啊。就在這里給大家介紹一下如何使用。
項目的主頁地址在:https://github.com/7sDream/zhihu-oauth。作者的知乎主頁為:https://www.zhihu.com/people/7sdream/。
項目的文檔地址為:http://zhihu-oauth.readthedocs.io/zh_CN/latest/index.html 。講道理,原作者對於該怎么使用這個庫已經講的非常詳細了,我在這里再重復一遍簡直就是畫蛇添足。所以大家要是想詳細了解這個庫怎么用,就去官方文檔吧。我只說一下我覺得需要補充的重要的幾點。
首先是安裝。作者已經將項目上傳到pypi了,所以我們可以直接使用pip進行安裝了。按照作者的說法,項目對於Python3的支持更好,淡然目前也是兼容Python2的,所以大家最好使用python3.直接 pip3 install -U zhihu_oauth 即可安裝。
安裝好了第一步就是登陸。直接使用下面的代碼就可以登陸。
1 from zhihu_oauth import ZhihuClient 2 from zhihu_oauth.exception import NeedCaptchaException 3 client = ZhihuClient() 4 user = 'email_or_phone' 5 pwd = 'password' 6 try: 7 client.login(user, pwd) 8 print(u"登陸成功!") 9 except NeedCaptchaException: # 處理要驗證碼的情況 10 # 保存驗證碼並提示輸入,重新登錄 11 with open('a.gif', 'wb') as f: 12 f.write(client.get_captcha()) 13 captcha = input('please input captcha:') 14 client.login('email_or_phone', 'password', captcha) 15 16 client.save_token('token.pkl') # 保存token 17 #有了token之后,下次登錄就可以直接加載token文件了 18 # client.load_token('filename')
上面的代碼是直接使用賬號密碼登陸,最后保存了登陸之后的token,在下次登錄的時候我們就可以直接使用token登錄而不用每次都輸入密碼了。
在登錄完成之后,可以干的事情當然就很多了,比如下面的代碼就可以獲得自己的知乎賬戶的基本信息
1 from __future__ import print_function # 使用python3的print方法 2 from zhihu_oauth import ZhihuClient 3 4 client = ZhihuClient() 5 client.load_token('token.pkl') # 加載token文件 6 # 顯示自己的相關信息 7 me = client.me() 8 9 # 獲取最近 5 個回答 10 for _, answer in zip(range(5), me.answers): 11 print(answer.question.title, answer.voteup_count) 12 13 print('----------') 14 15 # 獲取點贊量最高的 5 個回答 16 for _, answer in zip(range(5), me.answers.order_by('votenum')): 17 print(answer.question.title, answer.voteup_count) 18 19 print('----------') 20 21 # 獲取最近提的 5 個問題 22 for _, question in zip(range(5), me.questions): 23 print(question.title, question.answer_count) 24 25 print('----------') 26 27 # 獲取最近發表的 5 個文章 28 for _, article in zip(range(5), me.articles): 29 print(article.title, article.voteup_count)
當然可以干的事情還遠遠不止這些,比如我們知道了某個問題的url地址或者問題id,就可以獲得這個問題下有多少個回答,作者的信息等等一系列詳細的信息。開發者想的真的挺周到的,一般常見的需要的信息基本全部都包括了。具體的代碼我就不貼了,大家自行參考官方文檔。
一個小的tips:由於這個庫有好多個類,比如獲得作者信息的類,獲得文章信息的類等等。每個類都有非常多的方法,我去看了一下官方文檔,作者有些類的屬性就沒有完全列出來,那么我們怎么查看這個類全部的屬性呢?其實很簡單,只需要使用python的dir函數就可以了,使用dir(object)可以查看object類(或對象)的全部屬性。比如我們有一個answer類對象,使用dir(answer)就會返回answer對象所有屬性的列表。除去默認的一些屬性之外,我們就可以找到這個類的我們需要的屬性了,很方便吧。(下面是collection即收藏夾類的全部屬性)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_build_data', '_build_params', '_build_url', '_cache', '_data', '_get_data', '_id', '_method', '_refresh_times', '_session', 'answer_count', 'answers', 'articles', 'comment_count', 'comments', 'contents', 'created_time', 'creator', 'description', 'follower_count', 'followers', 'id', 'is_public', 'pure_data', 'refresh', 'title', 'updated_time']
最后,我使用這個類,抓取了知乎某個問題下所有回答中的圖片(抓美女圖,哈哈哈哈),只用了不到30行代碼(去掉注釋)。分享給大家。
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # @Time : 2017/5/3 14:27 4 # @Author : Lyrichu 5 # @Email : 919987476@qq.com 6 # @File : save_images.py 7 ''' 8 @Description:保存知乎某個問題下所有答案的圖片 9 ''' 10 from __future__ import print_function # 使用python3的print方法 11 from zhihu_oauth import ZhihuClient 12 import re 13 import os 14 import urllib 15 16 client = ZhihuClient() 17 # 登錄 18 client.load_token('token.pkl') # 加載token文件 19 id = 24400664 # https://www.zhihu.com/question/24400664(長得好看是一種怎么樣的體驗) 20 question = client.question(id) 21 print(u"問題:",question.title) 22 print(u"回答數量:",question.answer_count) 23 # 建立存放圖片的文件夾 24 os.mkdir(question.title + u"(圖片)") 25 path = question.title + u"(圖片)" 26 index = 1 # 圖片序號 27 for answer in question.answers: 28 content = answer.content # 回答內容 29 re_compile = re.compile(r'<img src="(https://pic\d\.zhimg\.com/.*?\.(jpg|png))".*?>') 30 img_lists = re.findall(re_compile,content) 31 if(img_lists): 32 for img in img_lists: 33 img_url = img[0] # 圖片url 34 urllib.urlretrieve(img_url,path+u"/%d.jpg" % index) 35 print(u"成功保存第%d張圖片" % index) 36 index += 1
如果要是自己寫的話,直接抓取解析網頁是無法獲得全部回答的,所以只能去破解知乎的api,比較麻煩,使用這個現成的輪子就方便很多了。以后想慢慢欣賞知乎的美女就再也不用發愁啦,嘿嘿嘿。