Metadata-Version: 1.1
Name: zhihu-py3
Version: 0.1.2
Summary: A parser of zhihu.com with help of bs4 and requests in python3
Home-page: https://github.com/7sDream/zhihu-py3
Author: 7sDream
Author-email: didislover@gmail.com
License: MIT
Download-URL: https://github.com/7sDream/zhihu-py3/releases
Description: # zhihu-py3 : 知乎解析器 with Python3
        
        [![Documentation Status][doc-badge-img]][doc-badge-url]
        
        最近一次更新内容：
        
        重构项目结构，增加zhihu.Client类，各种类（`Answer`，`Question`，`Author`等）建议不再直接使用，新用法请看示例。
        
        具体请看[ChangeLog][changelog-url]
        
        **有问题请开Issue，几个小时后无回应可加最后面的QQ群询问。**
        
        ## 功能
        
        由于知乎没有公开API，加上受到[zhihu-python][zhihu-python-url]项目的启发，在Python3下重新写了一个知乎的数据解析模块。
        
        提供的功能一句话概括为，用户提供知乎的网址构用于建对应类的对象，可以获取到某些需要的数据。
        
        简单例子：
        
        ```python
        from zhihu import ZhihuClient
        
        Cookies_File = 'cookies.json'
        
        client = ZhihuClient(Cookies_File)
        
        url = 'http://www.zhihu.com/question/24825703'
        question = client.question(url)
        
        print(question.title)
        print(question.answer_num)
        print(question.follower_num)
        print(question.topics)
        
        for answer in question.answers:
            print(answer.author.name, answer.upvote_num)
        ```
        
        这段代码的输出为：
        ```
        关系亲密的人之间要说「谢谢」吗？
        627
        4322
        ['心理学', '恋爱', '社会', '礼仪', '亲密关系']
        龙晓航 50
        小不点儿 198
        芝士就是力量 89
        欧阳忆希 425
        ...
        ```
        
        另外还有`Author（用户）`、`Answer（答案）`、`Collection（收藏夹）`、`Column（专栏）`、`Post（文章）`、`Topic（话题）`等类可以使用，`Answer`,`Post`类提供了`save`方法能将答案或文章保存为HTML或Markdown格式，具体请看文档，或者`zhihu-test.py`
        
        ## 依赖
        
        **本项目依赖于 [requests][req-url] 、[BeautifulSoup4][bs4-url]、[html2text][html2text-url] 使用前请先安装**
        
        **html2text 只在导出为 markdown 格式功能被使用时才会被 import，如果没有此模块其他功能也能正常完成。**
        
        ```bash
        pip install requests
        pip install beautifulsoup4
        pip install html2text
        ```
        
        Linux下同时安装了Python2和3的用户请使用`pip3 install xxx`代替（应该不用我说……）
        
        ## 安装
        
        已将项目整理为标准Python模块，请使用下列命令安装
        
        ```bash
        git clone https://github.com/7sDream/zhihu-py3.git
        cd zhihu-py3
        ./setup.py install
        ```
        
        最后一行命令可能需要sudo。
        
        安装完后推荐安装[lxml][lxml-url]，因为解析html效率高而且容错率强，在知乎使用`<br>`时，自带的html.parser会将其转换成`<br>...</br>`，而lxml则转换为`<br/>`，更为标准且美观。
        
        不安装lxml也能使用本模块，此时会自动使用html.parser作为解析器。
        
        ## 准备工作
        
        第一次使用推荐运行以下代码生成 cookies 文件：
        
        ```python
        from zhihu import ZhihuClient
        
        ZhihuClient().create_cookies('cookies.json')
        ```
        
        运行结果
        
        ```python
        ====== zhihu login =====
        email: <your-email>
        password: <your-password>
        please check captcha.gif for captcha
        captcha: <captcha-code>
        ====== logging.... =====
        login successfully
        cookies file created.
        ```
        
        运行成功后会在目录下生成`cookies.json`文件。
        
        以下示例皆以登录成功为前提。
        
        建议在正式使用之前运行`zhihu-test.py`测试一下。
        
        ## 用法实例
        
        以下示例均显示了使用cookies文件（上文生成）的登录方式，其他登录方式见后。
        
        ### 获取某用户的基本信息
        
        ```python
        from zhihu import ZhihuClient
        
        Cookies_File = 'cookies.json'
        
        client = ZhihuClient(Cookies_File)
        
        url = 'http://www.zhihu.com/people/zord-vczh'
        author = client.author(url)
        
        print('用户名 %s' % author.name)
        print('用户简介 %s' % author.motto)
        print('用户关注人数 %d' % author.followee_num)
        print('取用户粉丝数 %d' % author.follower_num)
        print('用户得到赞同数 %d' % author.upvote_num)
        print('用户得到感谢数 %d' % author.thank_num)
        print('用户提问数 %d' % author.question_num)
        print('用户答题数 %d' % author.answer_num)
        
        print('用户专栏文章数 %d，名称分别为：' % author.post_num)
        for column in author.columns:
            print(column.name)
        print('用户收藏夹数 %d，名称分别为：' % author.collection_num)
        for collection in author.collections:
            print(collection.name)
        ```
        
        结果：
        
        ```
        用户名 vczh
        用户简介 专业造轮子 https://github.com/vczh-libraries
        用户关注人数 1339
        取用户粉丝数 128100
        用户得到赞同数 320326
        用户得到感谢数 43045
        用户提问数 238
        用户答题数 8392
        用户专栏文章数 25，名称分别为：
        vczh的日常
        深井冰 IT 评论
        编程语言与高级语言虚拟机杂谈（仮）
        蓝色小药丸
        用户收藏夹数 1，名称分别为：
        李老师牛逼的答案
        ```
        
        为节省篇幅，后文例子构建`client`的代码省略，因为都一样。
        
        ### 备份某问题所有答案
        
        ```python
        question = client.question('http://www.zhihu.com/question/28092572')
        for answer in question.answers:
            answer.save()
        ```
        
        会在当前目录下新建以问题标题命名的文件夹，并将所有html文件保存到该文件夹。
        
        `save`函数默认目录为当前目录下以问题标题命名的目录，默认文件名为问题标题加上答题者昵称，有相同昵称的情况下自动加上序号。
        
        ```python
        answer.save(mode="md")
        ```
        将会导出为 markdown 格式，下同。
        
        ### 备份某用户所有答案
        
        ```python
        author = client.author('http://www.zhihu.com/people/7sdream')
        for answer in author.answers:
            answer.save(filepath=author.name)
        ```
        
        备份某收藏夹所有答案，备份专栏文章同理，不再举例。
        
        ### 获取某用户点赞的动态
        
        ```python
        author = zhihu.author('http://www.zhihu.com/people/zord-vczh')
        for act in author.activities:
            if act.type == zhihu.ActType.UPVOTE_ANSWER:
                print('%s 在 %s 赞同了问题 %s 中 %s(motto: %s) 的回答, '
                      '此回答赞同数 %d' %
                      (author.name, act.time, act.answer.question.title,
                       act.answer.author.name, act.answer.author.motto,
                       act.answer.upvote_num))
        ```
        
        结果
        
        ```
        vczh 在 2015-07-24 08:35:06 赞同了问题 女生夏天穿超短裙是一种什么样的体验？ 中 Light(motto: 我城故事多。) 的回答, 此回答赞同数 43
        vczh 在 2015-07-24 08:34:30 赞同了问题 女生夏天穿超短裙是一种什么样的体验？ 中 Ms狐狸(motto: 随便写来玩玩) 的回答, 此回答赞同数 57
        ……
        ```
        
        用户activities属性的完整用法可查看`zhihu-test.py`中`test_author`函数
        
        ### 获取用户关注的人和关注此用户的人
        
        ```python
        author = client.author('http://www.zhihu.com/people/7sdream')
        
        print('--- Followers ---')
        for follower in author.followers:
            print(follower.name)
        
        print('--- Followees ---')
        for followee in author.followees:
            print(followee.name)
        ```
        
        结果：
        
        ```
        --- Followers ---
        yuwei
        falling
        周非
        ...
        --- Followees ---
        yuwei
        falling
        伍声
        ...
        ```
        
        ### 计算某答案点赞中三零用户比例
        
        ```python
        url = 'http://www.zhihu.com/question/30404450/answer/47939822'
        answer = client.answer(url)
        
        three_zero_user_num = 0
        
        for upvoter in answer.upvoters:
            print(upvoter.name, upvoter.upvote_num, upvoter.thank_num,
                  upvoter.question_num, upvoter.answer_num)
            if upvoter.is_zero_user():
                three_zero_user_num += 1
        
        print('\n三零用户比例 %.3f%%' % (three_zero_user_num / answer.upvote_num * 100))
        ```
        
        结果：
        
        ```
        ...
        宋飞 0 0 0 0
        唐吃藕 10 0 0 5
        
        三零用户比例 26.852%
        ```
        
        ### 爬取某用户关注的人的头像
        
        ```python
        import requests
        import os
        import imghdr
        
        author = client.author('http://www.zhihu.com/people/zord-vczh')
        
        os.mkdir('vczh')
        for followee in author.followees:
            try:
                filename = followee.name + ' - ' + followee.id + '.jpeg'
                print(filename)
                with open('vczh/' + filename, 'wb') as f:
                    f.write(requests.get(followee.photo_url).content)
            except KeyboardInterrupt:
                break
        
        for root, dirs, files in os.walk('vczh'):
            for filename in files:
                filename = os.path.join(root, filename)
                img_type = imghdr.what(filename)
                if img_type != 'jpeg' and img_type is not None:
                    print(filename, '--->', img_type)
                    os.rename(filename, filename[:-4] + img_type)
        
        ```
        
        结果：
        
        [点这里](http://www.zhihu.com/question/28661987/answer/42591825)
        
        ## 登录相关方法（均为`ZhihuClient`的方法）
        
        ### create_cookies
        
        用于生成 cookies，用法见前面的介绍。
        
        ### login_with_cookies
        
        用cookies字符串或文件名登录，`ZhihuClient`的构造函数就是使用这个方法。
        
        ### get_captcha
        
        获取验证码数据（bytes二进制数据），当用于其他项目时方便手动获取验证码图片数据进行处理，比如显示在控件内。
        
        ### login
        
        手动登陆方法，用于其他项目中方便手动无需 cookies 登陆，参数为：
        
         - email
         - password
         - captcha
        
         返回值有三个
        
         - code：成功为0，失败为1
         - msg：错误消息，字符串格式，成功为空
         - cookies：cookies数据，字符串格式，失败为空
        
        ### login_in_terminal
        
        跟着提示在终端里登录知乎，返回cookies字符串，create_cookies就是帮你做了将这个函数的返回值保存下来的工作而已。
        
        ### 综上
        
        如果你只是写个小脚本测试玩玩，可以使用：
        
        ```python
        from zhihu import ZhihuClient
        client = ZhiuhClien()
        client.login_in_terminal()
        
        # do thing you want with client
        ```
        
        如果你的脚本不是大项目，又要多次运行，可以先按照上文方法create_cookies，再使用：
        
        ```python
        from zhihu import ZhihuClient
        Cookies_File = 'cookies.json'
        client = ZhihuClient(Cookies_File)
        ```
        
        如果项目比较大（以GUI项目为例），可以在判断出是首次使用（没有cookies文件）时，弹出登录对话框，使用get_captcha获取验证码数据，再调用login函数手动登录并在登录成功后保存cookies文件：
        
        ```python
        import os
        from zhihu import ZhihuClient
        
        Cookies_File = 'config/cookies.json'
        
        client = ZhihuClient()
        
        def on_window_show()
            login_btn.disable()
            if os.path.isfile(Cookies_File) is False:
                captcha_imgbox.setData(client.get_capthca())
                login_btn.enable()
            else:
                with open(Cookies_File) as f
                    client.login_with_cookies(f.read())
                # turn to main window
        
        def on_login_button_clicked():
            login_btn.disable()
            email = email_edit.get_text()
            password = password_edit.get_text()
            captcha = captcha_edit.get_text()
            code, msg, cookies = clien.login(email, password, captcha)
            if code == 0:
                with open(Cookies_File, 'w') as f
                    f.write(cookies)
                # turn to main window
            else:
                msgbox(msg)
                login_btn.enable()
        ```
        
        注：以上和GUI有关的代码皆为我乱想出来的，仅作示例之用。
        
        ## 文档
        
        终于搞定了文档这个磨人的小妖精，可惜 Sphinx 还是不会用 T^T 先随意弄成这样吧：
        
        Read The Docs： [点击这里查看文档][doc-rtd-url]
        
        ## TODO List
        
         - [x] 增加获取用户关注者，用户追随者
         - [x] 增加获取答案点赞用户功能
         - [x] 获取用户头像地址
         - [x] 打包为标准Python模块
         - [x] 重构代码，增加`ZhihuClient`类，使类可以自定义cookies文件
         - [ ] 收藏夹关注者，问题关注者等等
         - [ ] `ZhihuClient`增加各种用户操作（比如给某答案点赞）
        
        ## 联系我
        
        Github：[@7sDream][my-github-url]
        
        知乎：[@7sDream][my-zhihu-url]
        
        新浪微博：[@Dilover][my-weibo-url]
        
        邮箱：[给我发邮件][mail-to-me]
        
        编程交流群：478786205
        
        [zhihu-python-url]: https://github.com/egrcc/zhihu-python
        [req-url]: https://pypi.python.org/pypi/requests/2.7.0
        [bs4-url]: http://www.crummy.com/software/BeautifulSoup
        [lxml-url]: https://pypi.python.org/pypi/lxml/3.4.4
        [html2text-url]: https://github.com/aaronsw/html2text
        [doc-rtd-url]: http://zhihu-py3.readthedocs.org/zh_CN/latest
        [zhihu-test-py-url]: https://github.com/7sDream/zhihu-py3/blob/master/zhihu-test.py
        [doc-badge-img]: https://readthedocs.org/projects/zhihu-py3/badge/?version=latest
        [doc-badge-url]: https://readthedocs.org/projects/zhihu-py3/?badge=latest
        [changelog-url]: https://github.com/7sDream/zhihu-py3/blob/master/ChangeLog.md
        
        [my-github-url]: https://github.com/7sDream
        [my-weibo-url]: http://weibo.com/didilover
        [my-zhihu-url]: http://www.zhihu.com/people/7sdream
        [mail-to-me]: mailto:xixihaha.xiha@qq.com
        
        [dev-doc-rtd-url]: http://zhihu-py3.readthedocs.org/zh_CN/dev
        [dev-zhihu-test-py-url]: https://github.com/7sDream/zhihu-py3/blob/dev/zhihu-test.py
        [dev-doc-badge-img]: https://readthedocs.org/projects/zhihu-py3/badge/?version=dev
        [dev-doc-badge-url]: https://readthedocs.org/projects/zhihu-py3/?badge=dev
        [dev-changelog-url]: https://github.com/7sDream/zhihu-py3/blob/dev/ChangeLog.md
        
        
        (<_io.BufferedReader name='ChangeLog.md'>, '# 更新日志\n\n## 2015.07.\n\n - 重构项目结构\n - 增加zhihu.Client类，改善原先模块需要使用当前目录下cookies的弊端，现在的使用方法请看Readme中的示例。\n - 去掉了`_text2int`方法，因为发现知乎以K结尾的赞同数也有办法获取到准确点赞数。\n\n## 2015.07.26\n\n重构项目结构，转变为标准Python模块结构。\n\n## 2015.07.26\n\n添加`Author.photo_url`借口，用于获取用户头像。\n\n本属性的实现较为分散，在不同的地方使用了不同的方法：\n\n - `Author.follower(e)s`、`Answer.upvoters`等属性返回的`Author`自带`photo_url`\n\n - 用户自定义的`Author`在访问过主页的情况下通过解析主页得到\n\n - 用户自定义的`Author`在未访问主页的情况下为了性能使用了知乎的CardProfile API\n\n因为实现混乱所以容易有Bug，欢迎反馈。\n\n## 2015.07.25\n\n### 增加了获取用户关注者和粉丝的功能\n\n`Author.followers`、`Author.folowees`，返回Author迭代器，自带url, name ,motto question_num, answer_num, upvote_num, follower_num属性。\n\n### html解析器优选\n\n在安装了lxml的情况下默认使用lxml作为解析器，否则使用html.parser。\n\n### 增加答案获取点赞用户功能\n\n`Author.upvoters`，返回Author迭代器，自带url, name ,motto question_num, answer_num, upvote_num, thank_num属性\n\n### 增加简易判断是否为「三零用户」功能\n\n`Author.is_zero_user()`，判断标准为，赞同，感谢，提问数，回答数均为0。\n\n## 2015.07.23\n\n### 各个类url属性更改为公开\n\n暂时这样吧，有点懒了，因为这样会让使用者有机会非法修改url，可能导致Bug，以后勤快的话会改成read-only。\n\n### 类名变更\n\n专栏类从`Book`更名为`Cloumn`\n\n文章类从`Article`更名为`Post`\n\n以上两个更名同时影响了其他类的属性名，如`Author.books`变更为`Author.columns`，其他类同理。\n\n### 接口名变更\n\n1. 统一了一下复数的使用。比如`Author.answers_num`变为`Author.answer_num`, `Author.collections_num`变为`Author.collection_num`。也就是说某某数量的接口名为`Class.foo_num`，foo使用单数形式。\n\n2. 知乎的赞同使用单词upvote，以前叫`agree`的地方现在都叫`upvote`。比如`Author.agree_num`变为`Author.upvote_num`, `Post.agree_num`变为`Post.upvote_num`。\n\n3. `Answer`类的`upvote`属性更名为`upvote_num`。\n\n### 提供`Topic`类\n\n目前只有获取话题名的功能。\n\n### 提供`Author.activities`\n\n属性获取用户动态，返回`Activity`类生成器。\n\n`Activity`类提供`type`属性用于判断动态类型，`type`为`ActType`类定义的常量，根据`type`的不同提供不同的属性，如下表：\n\n|类型|常量|提供的成员|\n|:--:|:--:|---------:|\n|关注了问题|FOLLOW_QUESTION|question|\n|赞同了回答|UPVOTE_ANSWER|answer|\n|关注了专栏|FOLLOW_COLUMN|column|\n|回答了问题|ANSWER_QUESTION|answer|\n|赞同了文章|UPVOTE_POST|post|\n|发布了文章|PUBLISH_POST|post|\n|关注了话题|FOLLOW_TOPIC|topic|\n|提了一个问题|ASK_QUESTION|question|\n\n由于每种类型都只提供了一种属性，所以所有Activity对象都有`content`属性，用于直接获取唯一的属性。\n\n示例代码见[zhihu-test.py][zhihu-test-py-url]的`test_author`函数最后。\n\n`activities`属性可以在未登录（未生成cookies）的情况下使用，但是根据知乎的隐私保护政策，开启了隐私保护的用户的回答和文章，此时作者信息会是匿名用户，所以还是建议登录后使用。\n\n## 2015.07.22\n\n尝试修复了最新版bs4导致的问题，虽然我没明白问题在哪QuQ，求测试。\n\n - Windows 已测试 ([@7sDream][my-github-url])\n - Linux\n    - Ubuntu 已测试([@7sDream][my-github-url])\n - Mac 已测试 ([@SimplyY][SimplyY-github-url])\n\n## 2015.07.16\n\n重构 Answer 和 Article 的 url 属性为 public.\n\n## 2015.07.11:\n\nHotfix， 知乎更换了登录网址，做了简单的跟进，过了Test，等待Bug汇报中。\n\n## 2015.06.04：\n\n由[Gracker][gracker-github-url]补充了在 Ubuntu 14.04 下的测试结果，并添加了补充说明。\n\n## 2015.05.29：\n\n修复了当问题关注人数为0时、问题答案数为0时的崩溃问题。（感谢：[段晓晨][duan-xiao-chen-zhihu-url]）\n\n[my-github-url]: https://github.com/7sDream\n[duan-xiao-chen-zhihu-url]: http://www.zhihu.com/people/loveQt\n[gracker-github-url]: https://github.com/Gracker\n[SimplyY-github-url]: https://github.com/SimplyY\n')
Platform: UNKNOWN
Classifier: Development Status :: 3 - Alpha
Classifier: Environment :: Web Environment
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Topic :: Internet :: WWW/HTTP
Classifier: Topic :: Software Development :: Libraries :: Python Modules
