zhihu-python:获取知乎信息

Author:

Update:09/09 2015

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 = "http://www.zhihu.com/question/24269892"

question = Question(url)

answers = question.get_all_answers()

for answer in answers:

answer.to_txt()

answer.to_md()

会在当前目录下新建text,markdown两个文件夹,并将所有txt文件保存到text文件夹,所有markdown文件保存到markdown文件夹。

备份某大V的全部回答,也很简单:

from zhihu import User

user_url = "http://www.zhihu.com/people/jixin"

user = User(user_url)

answers = user.get_answers()

for answer in answers:

answer.to_txt()

answer.to_md()

导出的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 对象需传入该问题的 url ,如:

from zhihu import Question

url = "http://www.zhihu.com/question/24269892"

question = Question(url)

得到 Question 对象后,可以获取该问题的一些信息:

# -*- coding: utf-8 -*-

from zhihu import Question

url = "http://www.zhihu.com/question/24269892"

question = 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

# 输出:

# Answer类对象

print top_answers

# 输出:

# 代表前十的Answer的生成器

print answers

# 输出:

# 代表所有Answer的生成器

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

#

# 一个Question对象

print question.get_title() # 输出:现实可以有多美好?

print author

#

# 一个User对象

print voters

#

# 代表所有该答案点赞的用户的生成器

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()

# 获取该用户关注的人

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 followees

#

# 代表所有该用户关注的人的生成器对象

print followers

#

# 代表所有关注该用户的人的生成器对象

print asks

#

# 代表该用户提的所有问题的生成器对象

print answers

#

# 代表该用户回答的所有问题的答案的生成器对象

print collections

#

# 代表该用户收藏夹的生成器对象

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

#

# 一个User对象

print creator.get_user_id() # 稷黍

print name # 给你一个不同的视角

print top_answers

#

# 代表前十个答案的生成器对象

print answers

#

# 代表所有答案的生成器对象

将 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文件夹。所有匿名用户的回答放在一个文件里面。

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 型整数

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_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 对象

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文件均保存在该文件夹。

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 对象

如果本项目有帮到你,欢迎捐赠支持。

支付宝(左),微信支付(右):

python填空题及答案知乎_GitHub - HSINAN/zhihu-python: 获取知乎内容信息,包括问题,答案,用户,收藏夹信息...相关推荐

  1. java 应用 知乎_GitHub - liangsonghua/zhihu: JAVA仿知乎与redis应用

    用户:admin/admin liangsonghua/liangsonghua 注册登陆: 拦截器: @Component public class PassportInterceptor impl ...

  2. python 类 对象 知乎_GitHub - egrcc/zhihu-python: 获取知乎内容信息,包括问题,答案,用户,收藏夹信息...

    zhihu-python:获取知乎信息 注意: 本项目不再维护更新! zhihu-python 采用 Python2.7 编写,用来方便地获取知乎上各种内容的信息,并且可以方便地将答案备份导出为 tx ...

  3. python填空题_python填空题

    以下为<python填空题>的无排版文字预览,完整内容请下载 1.Python 提供了 6 个与字符串相关的函数.其中,_________函数可以返回字符串的长度. 在 Python 中, ...

  4. python填空题_Python题库-填空题

    『Python题库 - 填空题』Python笔试填空题 part 1. Python语言概述和Python开发环境配置 part 2. Python语言基本语法元素(变量,基本数据类型, 基础运算) ...

  5. 蓝桥杯 Python 填空题 2017 省赛 购物单

    题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可. 小明刚刚找到工作,老板人很好,只是老板夫人很爱购物.老板忙的时候经常让小明帮忙到商场代为购物.小明很厌烦,但又不好推 ...

  6. 最适合新手的python刷题网站_有没有适合新手练习Python的网站(做题类)?

    直接在知乎看我整理的练习题就可以了, 给你分享一下我自己亲身经历过的python考试题(下面还有练习题大全哦~~~) 记得给小达点个关注~ 你可以参考下面的题进行练习,考试题换汤不换药,希望对你有帮助 ...

  7. python零基础自学英语软件下载_GitHub - geniux-TI/codeparkshare: Python初学者(零基础学习Python、Python入门)书籍、视频、资料、社区推荐...

    PythonShare Python初学者(零基础学习Python.Python入门)书籍.视频.资料.社区推荐 本文 主要 针对 零基础 想学习Python者.本文本文由@史江歌(shijiangg ...

  8. 从零开始学python大数据与量化交易下载_GitHub - mignonwong/Python-100-Days-1: Python - 100天从新手到大师...

    Python - 100天从新手到大师 作者:骆昊 说明:从项目上线到获得8w+星标以来,一直收到反馈说基础部分(前15天的内容)对新手来说是比较困难的,建议有配套视频进行讲解.最近把基础部分的内容重 ...

  9. 从零开始学python大数据与量化交易下载_GitHub - zhaojie1126/Python-100-Days-1: Python - 100天从新手到大师...

    Python - 100天从新手到大师 作者:骆昊 说明:从项目上线到获得8w+星标以来,一直收到反馈说基础部分(前15天的内容)对新手来说是比较困难的,建议有配套视频进行讲解.最近把基础部分的内容重 ...

最新文章

  1. python解压gz_使用python请求下载压缩tar.gz文件并使用tar解压它
  2. 习题:编程求圆周长、圆面积、圆球体积、设圆半径r=1.5。要求:用scanf输入数据,输出计算结果,输出时要求有文字说明,取小数后2位...
  3. idea ssh连接mysql数据库_mysql命令行客户端如何通过ssh服务器连接数据库啊?
  4. 【CF868F】Yet Another Minimization Problem (决策单调性优化dp+分治)
  5. java 18 - 6 TreeMap嵌套使用
  6. CDays-3 习题二 (字典及文件读取练习)及相关内容解析。Python 基础教程
  7. Timer类 和 TimerTask类。一种有用计时器工具。可以每隔相同时间去执行某任务一次。
  8. python实现解析oui.txt并抽取MAC前缀及组织名称
  9. 278. First Bad Version
  10. 传统汽车被“智能”打败?且看汽车进化的黄金十年!
  11. 【C++笔记】封装的意义,结构体和类的区别
  12. 困难之下见证良心公司!!
  13. arcgis利用Model Builder构建器进行批量处理数据
  14. 游戏编程和计算机编程一样吗,学数控编程和电脑编程区别是什么?
  15. android 免费云测平台,免费的移动APP真机云测试平台|iTestin云测工具 v3.0.8
  16. Rayman的绝顶之路——Leetcode每日一题打卡7
  17. 0基础如何转行自学软件测试
  18. 文件或目录损坏且无法读取
  19. 商业银行vh是哪个银行的简称_各个银行缩写是什么
  20. zabbix报警 High swap space usage ( less than 50% free) 解决方案

热门文章

  1. 【Drools一】值得打工人学习的规则引擎Drools
  2. python正则匹配空格+数字+空格_详解Python中正则匹配TAB及空格的小技巧
  3. 阿里云智能数据构建与管理 Dataphin公测,助力企业数据中台建设
  4. 大数据教程(1.6):linux网络配置及CRT远程连接
  5. Revit 2011 二次开发之Ribbon
  6. 出国怎么能不出现天价微博?
  7. 你把别人看透了 别人就看不透你了
  8. cesium js 路径_[CesiumJS]Cesium入门3 – Cesium目录框架结构
  9. 第二次打开不是最大_第二次约会男生该干嘛,才能让关系更进一步?
  10. 在linux上,为什么不用配置环境变量还能运行java程序呢?