Python開源:zhihu-python-獲取知乎內容信息,包括問題,答案,用戶,收藏夾信息
zhihu-python:獲取知乎信息
注意: 本項目不再維護更新!
Contents
-
- Question:獲取問題信息
- Collection:獲取收藏夾信息
- Post:獲取專欄文章信息
-
- zhihu.Question ---- 知乎問題操作類
- zhihu.User ---- 知乎用戶操作類
- zhihu.Answer ---- 知乎回答操作類
- zhihu.Collection ---- 知乎收藏夾操作類
- zhihu.Column ---- 知乎專欄操作類
- zhihu.Post ---- 知乎專欄文章操作類 </ul> </li> </ul>
zhihu-python 采用 Python2.7 編寫,用來方便地獲取知乎上各種內容的信息,并且可以方便地將答案備份導出為 txt 或 markdown 文件。由于知乎官方目前沒有提供 api,所以有了此項目的存在。
使用 Python3 的類似項目可以參見: zhihu-py3 。使用 PHP 的類似項目可以參見: zhihu-php 。使用 Go 的類似項目可以參見: zhihu-go 。
注: 本項目代碼均在 Ubuntu14.04 上使用 python2.7.6 編寫和測試通過,其他環境可能存在一定問題。
獲取某個問題下的全部回答并導出,很簡單:
from zhihu import Question
url = "會在當前目錄下新建text,markdown兩個文件夾,并將所有txt文件保存到text文件夾,所有markdown文件保存到markdown文件夾。
備份某大V的全部回答,也很簡單:
from zhihu import User
user_url = "導出的markdown,txt文件示例請見該項目的markdown,text文件夾。當然,想要知道某大V關注了那些人,提了什么問題也不在話下,詳情請見:快速開始。
Tips :
- 確保你的系統里面已經安裝了 Python2.7 ,不同作業系統如何安裝不再贅述。
- 檢查你系統中 python 和 pip 的版本, 如果不屬于 python2.7 , 請在執行代碼范例時,自行將 python 和 pip 分別替換成 python2.7 和 pip2 。
- 確保你的系統中安裝了 git 程序 以及 python-pip 。
克隆本項目
git clone git@github.com:egrcc/zhihu-python.git cd zhihu-python
解決依賴
sudo pip install -r requirements.txt
or
sudo pip2 install -r requirements.txt
登錄知乎
登錄 知乎 生成身份信息, 保存在當前目錄的 cookies 文件中。
python auth.py
執行測試
python test.py
不出意外,一切應該完美運行 :))
Question:獲取問題信息
Question 代表一個問題,處理知乎問題相關操作。創建一個 Question 對象需傳入該問題的 url ,如:
from zhihu import Question
url = "得到 Question 對象后,可以獲取該問題的一些信息:
# -- coding: utf-8 -- from zhihu import Question
url = "
獲取該問題的標題
title = question.get_title()
獲取該問題的詳細描述
detail = question.get_detail()
獲取回答個數
answers_num = question.get_answers_num()
獲取關注該問題的人數
followers_num = question.get_followers_num()
獲取該問題所屬話題
topics = question.get_topics()
獲取該問題被瀏覽次數
visit_times = question.get_visit_times()
獲取排名第一的回答
top_answer = question.get_top_answer()
獲取排名前十的十個回答
top_answers = question.get_top_i_answers(10)
獲取所有回答
answers = question.get_all_answers()
print title # 輸出:現實可以有多美好? print detail
輸出:
本問題相對于“現實可以多殘酷?傳送門:現實可以有多殘酷?
題主: 昨天看了“現實可以有多殘酷“。感覺不太好,所以我
開了這個問題以相對應,希望能夠“中和一下“。和那個問題題主不想
把它變成“比慘大會“一樣,我也不想把這個變成“雞湯故事會“,或者
是“曬幸福“比賽。所以大家從“現實,實際”的角度出發,講述自己的
美好故事,讓大家看看社會的冷和暖,能更加辨證地看待世界,是此
題和彼題共同的“心愿“吧。
print answers_num # 輸出:2441 print followers_num # 輸出:26910 for topic in topics: print topic, # 輸出:情感克制 現實 社會 個人經歷 print visit_times # 輸出: 該問題當前被瀏覽的次數 print top_answer
輸出:<zhihu.Answer instance at 0x7f8b6582d0e0>
Answer類對象
print top_answers
輸出:<generator object get_top_i_answers at 0x7fed676eb320>
代表前十的Answer的生成器
print answers
輸出:<generator object get_all_answer at 0x7f8b66ba30a0>
代表所有Answer的生成器</code></pre>
Answer 代表了一個答案,處理知乎答案相關操作。創建一個 Answer 對象需傳入該答案的 url ,如:
from zhihu import Answer answer_url = "http://www.zhihu.com/question/24269892/answer/29960616" answer = Answer(answer_url)
得到 Answer 對象后,可以獲取該答案的一些信息:
# -*- coding: utf-8 -*- from zhihu import Answer answer_url = "http://www.zhihu.com/question/24269892/answer/29960616" answer = Answer(answer_url) # 獲取該答案回答的問題 question = answer.get_question() # 獲取該答案的作者 author = answer.get_author() # 獲取該答案獲得的贊同數 upvote = answer.get_upvote() # 獲取該答案所屬問題被瀏覽次數 visit_times = answer.get_visit_times() # 獲取所有給該答案點贊的用戶信息 voters = answer.get_voters() # 把答案輸出為txt文件 answer.to_txt() # 把答案輸出為markdown文件 answer.to_md() print question # <zhihu.Question instance at 0x7f0b25d13f80> # 一個Question對象 print question.get_title() # 輸出:現實可以有多美好? print author # <zhihu.User instance at 0x7f0b25425b90> # 一個User對象 print voters # <generator object get_voters at 0x7f32fbe55730> # 代表所有該答案點贊的用戶的生成器 print author.get_user_id() # 輸出:田浩 print upvote # 輸出:9320 print visit_times # 輸出: 改答案所屬問題被瀏覽次數
User 代表一個用戶,處理用戶相關操作。創建一個 User 對象需傳入該用戶的 url ,如:
from zhihu import User user_url = "http://www.zhihu.com/people/jixin" user = User(user_url)
得到 User 對象后,可以獲取該用戶的一些信息:
# -*- coding: utf-8 -*- from zhihu import User user_url = "http://www.zhihu.com/people/jixin" user = User(user_url) # 獲取用戶ID user_id = user.get_user_id() # 獲取用戶性別 user_gender = user.get_gender() # 獲取該用戶的關注者人數 followers_num = user.get_followers_num() # 獲取該用戶關注的人數 followees_num =user.get_followees_num() # 獲取該用戶提問的個數 asks_num = user.get_asks_num() # 獲取該用戶回答的個數 answers_num = user.get_answers_num() # 獲取該用戶收藏夾個數 collections_num = user.get_collections_num() # 獲取該用戶獲得的贊同數 agree_num = user.get_agree_num() # 獲取該用戶獲得的感謝數 thanks_num = user.get_thanks_num() # 獲取該用戶的頭像url head_img_url = user.get_head_img_url() # 獲取該用戶關注的人 followees = user.get_followees() # 獲取關注該用戶的人 followers = user.get_followers() # 獲取該用戶提的問題 asks = user.get_asks() # 獲取該用戶回答的問題的答案 answers = user.get_answers() # 獲取該用戶的收藏夾 collections = user.get_collections() print user_id # 黃繼新 print followers_num # 614840 print followees_num # 8408 print asks_num # 1323 print answers_num # 786 print collections_num # 44 print agree_num # 46387 print thanks_num # 11477 print head_img_url # https://pic2.zhimg.com/0626f4164009f291b26a79d96c6962c5_l.jpg print followees # <generator object get_followee at 0x7ffcac3af050> # 代表所有該用戶關注的人的生成器對象 print followers # <generator object get_follower at 0x7ffcac3af0f0> # 代表所有關注該用戶的人的生成器對象 print asks # <generator object get_ask at 0x7ffcab9db780> # 代表該用戶提的所有問題的生成器對象 print answers # <generator object get_answer at 0x7ffcab9db7d0> # 代表該用戶回答的所有問題的答案的生成器對象 print collections # <generator object get_collection at 0x7ffcab9db820> # 代表該用戶收藏夾的生成器對象
Collection:獲取收藏夾信息
Collection 代表一個收藏夾,處理收藏夾相關操作。創建一個 Collection 對象需傳入該收藏夾的 url ,如:
from zhihu import Collection collection_url = "http://www.zhihu.com/collection/36750683" collection = Collection(collection_url)
得到 Collection 對象后,可以獲取該收藏夾的一些信息:
# -*- coding: utf-8 -*- from zhihu import Collection collection_url = "http://www.zhihu.com/collection/36750683" collection = Collection(collection_url) # 獲取該收藏夾的創建者 creator = collection.get_creator() # 獲取該收藏夾的名字 name = collection.get_name() # 獲取該收藏夾下的前十個答案 top_answers = collection.get_top_i_answers(10) # 獲取該收藏夾下的所有答案 answers = collection.get_all_answers() print creator # <zhihu.User instance at 0x7fe1296f29e0> # 一個User對象 print creator.get_user_id() # 稷黍 print name # 給你一個不同的視角 print top_answers # <generator object get_top_i_answers at 0x7f378465dc80> # 代表前十個答案的生成器對象 print answers # <generator object get_all_answer at 0x7fe12a29b280> # 代表所有答案的生成器對象
Column 代表一個專欄,處理專欄相關操作。創建一個 Column 對象需傳入該專欄的 url ,如:
from zhihu import Column url = "http://zhuanlan.zhihu.com/daily" column = Column(url)
得到 Column 對象后,可以獲取該專欄的一些信息:
# -*- coding: utf-8 -*- from zhihu import Column url = "http://zhuanlan.zhihu.com/daily" column = Column(url) # 獲取該專欄的標題 title = column.get_title() # 獲取該專欄的描述 description = column.get_description() # 獲取該專欄的作者 creator = column.get_creator() # 獲取該專欄的文章數 posts_num = column.get_posts_num() # 獲取該專欄的所有文章 posts = column.get_all_posts() print title # 輸出:知乎日報 print description # 輸出: # 知乎日報啟動畫面接受所有攝影師朋友們的投稿,將作品鏈接 #(如 Flickr、LOFTER 等等),發至郵箱 qidong (at) zhihu.com, # 并附上您的知乎個人頁面地址即可。 # # 詳細投稿要求: http://t.cn/zQyEpN5 print creator # 輸出:<zhihu.User instance at 0x75e33eb8> # User類對象 print posts_num # 150 print posts # 輸出:<generator object get_all_posts at 0x75e33bc0> # Post類對象
Post:獲取專欄文章信息
Post 代表一個專欄文章,處理專欄文章相關操作。創建一個 Post 對象需傳入該文章的 url ,如:
from zhihu import Post url = "http://zhuanlan.zhihu.com/p/20235601" post = Post(url)
得到 Post 對象后,可以獲取該文章的一些信息:
# -*- coding: utf-8 -*- from zhihu import Post url = "http://zhuanlan.zhihu.com/p/20770968" post = Post(url) # 獲取該文章的標題 title = post.get_title() # 獲取該文章的內容 content = post.get_content() # 獲取該文章的作者 author = post.get_author() # 獲取該文章的所屬專欄 column = post.get_column() # 獲取該文章所屬話題 topics = post.get_topics() print title # 輸出:夜讀書|四月十九日 print content # 輸出: # <p>各位,晚上好。<br> ... # ...... print author # 輸出: <zhihu.User instance at 0x75ec0fd0> for topic in topics: print topic, # 輸出:閱讀 print column # 輸出:<zhihu.Column instance at 0x75eb3eb8> # Column類對象
將 Question , Answer , User , Collection 結合起來使用。實例如下:
# -*- coding: utf-8 -*- from zhihu import Question from zhihu import Answer from zhihu import User from zhihu import Collection url = "http://www.zhihu.com/question/24269892" question = Question(url) # 得到排名第一的答案 answer = question.get_top_answer() # 得到排名第一的答案的作者 user = answer.get_author() # 得到該作者回答過的所有問題的答案 user_answers = user.get_answers() # 輸出該作者回答過的所有問題的標題 for answer in user_answers: print answer.get_question().get_title() # 得到該用戶的所有收藏夾 user_collections = user.get_collections() for collection in user_collections: # 輸出每一個收藏夾的名字 print collection.get_name() # 得到該收藏夾下的前十個回答 top_answers = collection.get_top_i_answers(10) # 把答案內容轉成txt,markdown for answer in top_answers: answer.to_txt() answer.to_md()
以上示例均可以在test.py文件中找到。
雖然是單線程,但速度不算太慢。抓取 哪些東西買了之后,會讓人因生活質量和幸福感提升而感覺相見恨晚? 下前200個回答,91秒;抓取 有哪些 100 元以下,很少見但高大上的物件? 下前50個回答,48秒;抓取 現實可以有多美好? 下前200個回答,69秒。生成的文件請見markdown,text文件夾。所有匿名用戶的回答放在一個文件里面。
zhihu.Question ---- 知乎問題操作類
class zhihu. Question ( url, title = None )
Question 以 url 為唯一標識,創建一個 Question 對象實例必須傳入一個代表知乎問題的 url (如: http://www.zhihu.com/question/26611428 ),需包含“ http:// ”。如果傳入的不是代表問題的 url ,程序會報錯。通過調用 Question 類的一系列方法,獲得該問題的一些信息。
Parameters :
- url -- 該問題的鏈接,字符串
- title -- 該問題的標題,字符串,可選
Returns: 一個 Question 實例對象
get_title ()
得到該問題的標題。
Returns: 代表標題的字符串
get_detail ()
得到該問題的詳細描述。原問題的描述可能帶有圖片或視頻,這里得到的是純文字。
Returns: 代表詳細描述的字符串
get_answers_num ()
得到該問題的回答個數。
Returns: 代表回答個數的 int 型整數
get_followers_num ()
得到關注該問題的人數。
Returns: 代表人數的 int 型整數
get_topics ()
得到該問題所屬的話題。
Returns: 一個 list ,每一個元素為代表一個話題的字符串
注:以后可能會添加一個 Topic 類,到時候每一個元素為代表一個話題的 Topic 類對象。
get_all_answers ()
得到該問題的所有回答。
Returns: 包含所有答案的 generator 對象。其中每一個元素為代表一個答案的 Answer 對象
get_top_i_answers (n)
得到該問題的前 n 個回答。
Parameters: n -- int 型整數
Returns: 包含前 n 個答案的 generator 對象。其中每一個元素為代表一個答案的 Answer 對象
get_top_answer ()
得到目前排名第一的回答。
Returns: 代表該答案的 Answer 對象
get_visit_times ()
得到該問題被瀏覽次數。該方法由 @lufo816 添加。
Returns: 代表瀏覽次數的 int 型整數
zhihu.User ---- 知乎用戶操作類
class zhihu. User ( user_url, user_id = None )
User 以 url 為唯一標識,創建一個 User 對象實例必須傳入一個代表知乎用戶的 url (如: http://www.zhihu.com/people/egrcc ),需包含“ http:// ”。如果傳入的不是代表用戶的 url ,程序會報錯。通過調用 User 類的一系列方法,獲得該用戶的一些信息。
Parameters :
- user_url -- 該用戶的鏈接,字符串
- user_id -- 該用戶的 ID ,字符串,可選
Returns: 一個 User 實例對象
get_user_id ()
得到該用戶的ID。
Returns: 代表 ID 的字符串
get_gender ()
得到該用戶的性別。
Returns: 代表 性別 的字符串(male/female)
get_followees_num ()
得到該用戶關注的人的個數。
Returns: 代表人數的 int 型整數
get_followers_num ()
得到關注該用戶的人的個數。
Returns: 代表人數的 int 型整數
get_agree_num ()
得到該用戶獲得的贊同數。
Returns: 代表贊同數的 int 型整數
get_thanks_num ()
得到該用戶獲得的感謝數。
Returns: 代表感謝數的 int 型整數
get_head_img_url(scale)
獲取用戶頭像url。該方法由 @liuwons 添加。
Parameters: scale int 型整數,代表尺寸: 1(25×25), 3(75×75), 4(100×100), 6(150×150), 10(250×250)
Returns: 對應尺寸頭像的圖片鏈接, 字符串
get_asks_num ()
得到該用戶提問題的個數。
Returns: 代表問題數的 int 型整數
get_answers_num ()
得到該用戶回答問題的個數。
Returns: 代表問題數的 int 型整數
get_collections_num ()
得到該用戶收藏夾的個數。
Returns: 代表收藏夾數的 int 型整數
get_followees ()
得到該用戶關注的人。
Returns: 包含所有該用戶關注的人的 generator 對象。其中每一個元素為代表一個用戶的 User 對象
get_followers ()
得到關注該用戶的人。
Returns: 包含所有關注該用戶的人的 generator 對象。其中每一個元素為代表一個用戶的 User 對象
get_asks ()
得到該用戶提的所有問題。
Returns: 包含所有問題的 generator 對象。其中每一個元素為代表一個問題的 Question 對象
get_answers ()
得到該用戶回答的所有問題的答案。
Returns: 包含所有回答的 generator 對象。其中每一個元素為代表一個回答的 Answer 對象
get_collections ()
得到該用戶的所有收藏夾。
Returns: 包含所有收藏夾的 generator 對象。其中每一個元素為代表一個收藏夾的 Collection 對象
zhihu.Answer ---- 知乎回答操作類
class zhihu. Answer ( answer_url, question = None, author = None, upvote = None, content = None )
Answer 以 url 為唯一標識,創建一個 Answer 對象實例必須傳入一個代表知乎回答的 url (如: http://www.zhihu.com/question/19878575/answer/14776495 ),需包含“ http:// ”。如果傳入的不是代表回答的 url ,程序會報錯。通過調用 Answer 類的一系列方法,獲得該回答的一些信息。一般不自己創建Answer對象。
Parameters :
- answer_url -- 該答案的鏈接,字符串
- question -- 該答案回答的問題, Question 對象,可選
- author -- 該答案的作者, User 對象,可選
- upvote -- 該答案獲得的贊同數, int 型整數,可選
- content -- 該答案的內容, BeautifulSoup 對象,可選
Returns: 一個 Answer 實例對象
get_question ()
得到該答案回答的問題。
Returns: 一個 Question 對象
get_author ()
得到該答案的作者 。
Returns: 一個 User 對象
get_upvote ()
得到該答案獲得的贊同數。
Returns: 一個 int 型整數
get_content ()
得到該答案的內容。
Returns: 一個 BeautifulSoup 對象
get_visit_times ()
得到該答案所屬問題被瀏覽次數。該方法由 @lufo816 添加。
Returns: 代表瀏覽次數的 int 型整數
get_voters ()
得到給該答案點贊的用戶。該方法由 @lufo816 添加。
Returns: 包含所有給該答案點贊的用戶的 generator 對象。其中每一個元素為代表一個用戶的 User 對象
to_txt ()
將該答案轉成txt文件,并會在當前目錄下創建一個text文件夾,所生成的txt文件均保存在該文件夾。
to_md ()
將該答案轉成markdown文件,并會在當前目錄下創建一個markdown文件夾,所生成的markdown文件均保存在該文件夾。
zhihu.Collection ---- 知乎收藏夾操作類
class zhihu. Collection ( url, name = None, creator = None )
Collection 以 url 為唯一標識,創建一個 Collection 對象實例必須傳入一個代表知乎收藏夾的 url (如: http://www.zhihu.com/collection/27053469 ),需包含“ http:// ”。如果傳入的不是代表收藏夾的 url ,程序會報錯。通過調用 Collection 類的一系列方法,獲得該收藏夾的一些信息。
Parameters :
- url -- 該收藏夾的鏈接,字符串
- name -- 該收藏夾的名字,字符串,可選
- creator -- 該收藏夾的創建者,User 對象,可選
Returns: 一個 Collection 實例對象
get_name ()
得到該收藏夾的名字。
Returns: 代表名字的字符串
get_creator ()
得到該收藏夾的創建者。
Returns:代表創建者 User 對象
get_all_answers ()
得到該收藏夾收藏的所有回答。
Returns: 包含該收藏夾下所有回答的 generator 對象。其中每一個元素為代表一個回答的 Answer 對象
get_top_i_answers (n)
得到該收藏夾收藏的前 n 個回答。
Parameters: n -- int 型整數
Returns: 包含該收藏夾下前 n 個回答的 generator 對象。其中每一個元素為代表一個回答的 Answer 對象
zhihu.Column ---- 知乎專欄操作類
class zhihu. Column ( Column_url )
Column 以 url 為唯一標識,創建一個 Column 對象實例必須傳入一個代表知乎專欄的 url (如: http://zhuanlan.zhihu.com/daily ),需包含“http(s)://”。如果傳入的不是代表專欄的 url ,程序會報錯。通過調用 Column 類的一系列方法,獲得該專欄的一些信息。該類由 @johnnyluck 添加。
Parameters :
- column_url -- 該專欄的鏈接,字符串
Returns: 一個 Column 實例對象
get_title ()
得到該專欄的題目。
Returns: 一個代表題目的字符串
get_creator ()
得到該專欄的創建者。
Returns: 一個 User 對象
get_description ()
得到該專欄的描述。
Returns: 一個專欄描述的字符串
get_followers_num ()
得到該專欄的關注人數。
Returns: 一個 int 型的整數
get_posts_num ()
得到該專欄的所有文章數。
Returns: 一個 int 型的整數
get_content ()
得到該答案的內容。
Returns: 一個字符串
get_posts ()
得到該專欄的所有文章。
Returns:包含所有文章的 generator 對象。其中每一個元素為代表一個文章 Post 對象
zhihu.Post ---- 知乎專欄文章操作類
class zhihu. Post ( Post_url )
Post 以 url 為唯一標識,創建一個 Post 對象實例必須傳入一個代表知乎文章的 url (如: http://zhuanlan.zhihu.com/p/20235601 ),需包含“http(s)://”。如果傳入的不是代表文章的 url ,程序會報錯。通過調用 Post 類的一系列方法,獲得該文章的一些信息。該類由 @johnnyluck 添加。
Parameters :
- post_url -- 該文章的鏈接,字符串
Returns: 一個 Post 實例對象
get_title ()
得到該文章的題目。
Returns: 一個代表題目的字符串
get_author ()
得到該文章的作者。
Returns: 一個 User 對象
get_content ()
得到該文章的內容。
Returns: 一個文章描述的字符串
get_topics ()
得到該文章的話題。
Returns: 一個列表
get_column ()
得到該文章的所屬專欄。
Returns:一個 Column 的實例對象