今天在無心之中發現了一個知乎的開源爬蟲,是基於Python的,名字叫zhihu_oauth,看了一下在github上面star數還挺多的,貌似文檔也挺詳細的,因而就稍微研究了一下。發現果真很好用啊。就在這裏給你們介紹一下如何使用。html
項目的主頁地址在:https://github.com/7sDream/zhihu-oauth。做者的知乎主頁爲:https://www.zhihu.com/people/7sdream/。python
項目的文檔地址爲:http://zhihu-oauth.readthedocs.io/zh_CN/latest/index.html 。講道理,原做者對於該怎麼使用這個庫已經講的很是詳細了,我在這裏再重複一遍簡直就是多此一舉。因此你們要是想詳細瞭解這個庫怎麼用,就去官方文檔吧。我只說一下我以爲須要補充的重要的幾點。git
首先是安裝。做者已經將項目上傳到pypi了,因此咱們能夠直接使用pip進行安裝了。按照做者的說法,項目對於Python3的支持更好,淡然目前也是兼容Python2的,因此你們最好使用python3.直接 pip3 install -U zhihu_oauth 便可安裝。github
安裝好了第一步就是登錄。直接使用下面的代碼就能夠登錄。api
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登陸而不用每次都輸入密碼了。session
在登陸完成以後,能夠乾的事情固然就不少了,好比下面的代碼就能夠得到本身的知乎帳戶的基本信息ssh
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即收藏夾類的所有屬性)ui
['__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']url
最後,我使用這個類,抓取了知乎某個問題下全部回答中的圖片(抓美女圖,哈哈哈哈),只用了不到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,比較麻煩,使用這個現成的輪子就方便不少了。之後想慢慢欣賞知乎的美女就不再用發愁啦,嘿嘿嘿。