基於python的知乎開源爬蟲 zhihu

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

相關文章
相關標籤/搜索