基於python的知乎開源爬蟲 zhihu_oauth使用介紹


  今天在無意之中發現了一個知乎的開源爬蟲,是基於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,比較麻煩,使用這個現成的輪子就方便很多了。以后想慢慢欣賞知乎的美女就再也不用發愁啦,嘿嘿嘿。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM