Giter Site home page Giter Site logo

zhihu-rss's Introduction

由于 homebrew 在 qt5.6里面把我依赖的 qtwebkit 移出了,天坑,然后自己也早已转 js 了,总之无力维护这个仓库,为了能不漏喜欢的作者的文章,我自己的解决办法是,将需要看的回答、专栏放到书签里面。。。

zhihu-rss

知乎非官方客户端, 可以将知乎的任何 user 的动态做成 rss,只需几步操作,并且可以定制 rss 内容(回答 or 提问 or 文章等等),以 rss 的形式显示(二维表,知乎是一维的),欢迎 star。

(非官方的跨平台客户端, 目前只支持 linux 和 osx)

使用帮助看功能列表和演示部分

效果图

image

重大提醒(放弃对 win 的支持,如果出 bug 请更新zhihu-py3爬虫库)

由于知乎频繁改版(前端),导致爬虫库无法稳定,对于 win 平台需要客户端经常升级。。

于是win 下放弃,,,(由于 win 还是静态链接库。。维护太麻烦了,需要每次都要非常麻烦的再打包一次,我又没有 win 的机器,麻烦别人也不好。)

osx 和 linux 平台编译源码的老版本,如果出现 bug,请 (sudo)pip3 install zhihu-py3 --upgrade 就 ok 了

功能:

最棒的功能是:自定义关注方式

以及 zhihurss 配合 pocket 用简直神器,特别是你用了 pocket 的alfred插件后

  1. minibrowser
  2. 自定义关注方式、删除关注者:用户名上右键
  3. 添加关注
  4. 后台更新功能,点击已读(标题颜色变淡就像 rss 一样)
  5. (这个功能有点小问题,以前好的,现在又不行了,和知乎改版可能有关)支持对站外不可见用户的关注(http://www.zhihu.com/settings/profile 这里的隐私保护打了勾),支持设置代理。

功能演示

(为了图片小点,画质渣了,,实际上 retina 屏幕效果如上面的效果图,还是非常好滴)

特别提醒

  1. 然后最好不用zhihurss 爬大量数据(上万条),不然会被封 ip,不过提供代理功能,见设置登陆状态和代理,(如果就和我一样正常使用,一次也就爬个几百条,嫌麻烦就不用设置代理了,肯定不会封 ip)
  2. 老用户,或者突然程序有问题,一般是你 rss 的人改了个性域名,解决方法见 知乎的设置引起的bug
  3. 最好阅读一下 知乎的设置引起的bug

zhihurss 推荐列表

https://github.com/SimplyY/zhihu-rss/blob/master/zhihurss%20list.md

安装

Mac OS X

osx下同时安装了Python2和3的用户请使用pip3 install xxx代替(应该不用我说……)

  1. 安装homebrew
  2. 安装pyqt5.5及其依赖(homebrew 在 qt5.6里面把我依赖的 qtwebkit 移出了,天坑,所以步骤多了):
brew install python3 d-bus sip xz
brew install homebrew/versions/qt55
brew install --ignore-dependencies pyqt5
ln -s /usr/local/opt/qt55 /usr/local/opt/qt5
  1. git clone https://github.com/SimplyY/zhihu-rss
  2. cd zhihu-rss
  3. pip install $(cat requirements.txt)
  4. 在程序目录(clone 的目录)下开启终端,执行python3 ./entry.py 或者 在 finder 里双击osx-launcher运行程序

linux

linux ,请自行编译,以下是所需依赖,有任何问题可以开issue, 或者加qq群:zhihu&github 交流群 478786205 来讨论。

依赖:

本项目依赖于 zhihu-py3(requests ,BeautifulSoup4, html2text), pyqt5, qt quick的各种东西比如qt webkit(装qt即可)

Linux下同时安装了Python2和3的用户请使用pip3 install xxx代替(应该不用我说……)

  1. (sudo)pip3 install zhihu-py3 --upgrade
  2. qt 在线安装的时候不需要安装安卓相关(安卓相关几个g...)
  3. 安装pyqt5
  4. git clone https://github.com/SimplyY/zhihu-rss
  5. python3 zhihu-rss/entry.py

设置登陆状态和代理:

在 config 文件夹里面的 config.json文件可以设置是否登录,代理设置(一个 str)

( config.json example:{"is_sign": true,"proxy": "http://127.0.0.1:10025"}以及proxy那个一定别设置错了, 不然 network timeout)

知乎的设置引起的bug

(最新版已解决,但是其实是和知乎的制度有关的,最好看一看)

  1. 由于知乎竟然可以更改自己的个性网址
    • (这个页面 http://www.zhihu.com/settings/profile ),引起了这个紧急 bug(老用户注意:好多大v 都改了自己的。)
    • 解决办法是取消关注,然后重新关注(输入正确的 url),以及 添加关注的默认的url 后几个字母 yuwei-80(也就是我的),我作死的改成了 SimplyY(知乎规定一个月改不回来。。)大家也帮忙改一下。。
  2. 隐私保护打了勾:
    • 还有一个是早就有了的,也是那个页面,对隐私保护打了勾,造成无法添加其关注,而且无法更新所有动态,
    • 解决方法见下面的特别提醒

感谢:

爬虫方面全部使用7sDream的zhihu-py3, 非常感谢

zhihu-rss's People

Contributors

simplyy avatar xcodebuild avatar xen0n avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

zhihu-rss's Issues

少用列表推导的if

原因是无法用else: break,这样依赖就会迭代整个对象,如果对象过大,或者需要联网,读写文件什么的,将变成性能瓶颈

在使用zhihu_py3的时候,写了一行这样的代码

answers = [answer for index, answer in enumerate(author.answers) if index < MAX_FIRST_FEED_NUM]

要知道即便MAX_FIRST_FEED_NUM = 5的时候仍然,,,爬采铜的答案花了两分多钟,,,,,换成爬我的时候,3秒钟,,gg

最后把代码改成了这样:

for index, answer in enumerate(author.answers):
     if index < MAX_FIRST_FEED_NUM:
           answers.append(answer)
     else:
            break

问题解决了

动态类型的参数列表

一定要谨记,这个我已经错了几次了,特别是重构时,一不小心参数列表的顺序就错了,debug老半天qaq

界面设计

主页面

  • 有侧边栏,工具栏(主页、添加特别关注、提醒页面)。内容部分为listview显示特别关注的所有回答或者动态,点击展开单个动态或回答(显示原文链接)。

内容部分

  • 登陆页面(需要两个账号,大号需要主页链接,小号需要邮箱和密码)
  • 添加特别关注页面。罗列所有已关注者(需要有搜索功能),点击选择其中的一些来特别关注,需要选择是什么关注和是否提醒 。
  • 某个关注者页面,主页面导航栏点击进入,listview显示。
  • notifications 界面。

关于将给信号槽传参数

使用lambda

def set_view(viewer):
    root_item = viewer.rootObject()

    button = root_item.findChild(QObject, 'button')
    button.clicked.connect(lambda: get_answer(root_item))

新功能待开发列表

  • 关注时可以选择导入动态数量,确定后弹出一个窗口
  • 来显示爬虫进度
  • 删除关注者
  • 在用户名的右边, 显示未读数 , 未阅读,加粗标题,
  • 自定义关注方式:用户名上右键点击,然后弹出一个对话框,让用户打勾
  • 后台更新功能

增加环境设置步骤

项目写得不错... 就是要运行起来有点蛋碎啊

环境搭建

# 环境: Python 3.4.3, Qt 5.5

git clone https://github.com/SimplyY/zhihu_rss.git
cd zhihu_rss

# virtualenv
python3.4 -m venv venv
. venv/bin/activate

# pip 依赖
# 建议写一个 requirements.txt 方便管理
pip install requests beautifulsoup4 html2text

# 非 pip 依赖
# sip
wget http://www.riverbankcomputing.com/static/Downloads/sip4/sip-4.16.9.tar.gz
tar xf sip-4.16.9.tar.gz
cd sip-4.16.9
python ./configure.py
make -j8 && make install
cd ..

# PyQt5
wget http://www.riverbankcomputing.com/static/Downloads/PyQt5/PyQt-gpl-5.5.tar.gz
tar xf PyQt-gpl-5.5.tar.gz
cd PyQt-gpl-5.5
python ./configure.py --qmake /usr/lib64/qt5/bin/qmake --confirm-license  --no-designer-plugin --no-qml-plugin --no-qsci-api
make -j8 && make install
cd ..

# zhihu-py3
# 还是建议写个 setup.py
git clone https://github.com/7sDream/zhihu-py3.git
cd venv/lib/python3.4/site-packages
ln -s ../../../../zhihu-py3/zhihu.py .
cd ../../../..

运行

# 这是 bug 啊...
# 自己改了...
# src/model/noticer.py get_noticers_in_json except IOError 的时候直接 pass 就行了
# 否则首次运行没有数据, 在 src/control/listview.py 会 TypeError: 'NoneType' object is not iterable

# 然后 src/model/feeds_list.py 没处理首次运行文件不存在的情况
# 我绕过去了
# 最好也改一下
mkdir json
touch json/feeds.json

# woc 终于能运行了
# 然而默认模块搜寻路径没有当前目录...
PYTHONPATH=. python ./src/main.py

py 多线程 Lock 的使用

当我们在多个线程都在访问同一个资源时,一定需要加锁,这样才能线程安全,使得不被资源被破坏,比如同时对文件读写,对文件的破坏不可逆转。

当有锁的时候,其他线程会 block 来等待占用资源的线程将此锁释放(解掉)

Lock 的详细介绍

Locks have 2 states: locked and unlocked. 2 methods are used to manipulate them: acquire() and release(). Those are the rules:

if the state is unlocked: a call to acquire() changes the state to locked.
if the state is locked: a call to acquire() blocks until another thread calls release().
if the state is unlocked: a call to release() raises a RuntimeError exception.
if the state is locked: a call to release() changes the state to unlocked().

代码示例

使用 with 的优雅写法

 with FeedsList.feeds_lists_json_lock:
            ensure_dir(FEEDS_JSON_PATH)
            with open(FEEDS_JSON_PATH, 'wb') as f:
                f.write(json_data.encode('utf-8'))

在python中动态调用qml里定义的方法

def load_listview():

    noticers1_names = [noticer1.name for noticer1 in noticer.Noticer.get_noticers(1)]

    q_noticers1_names = QVariant(noticers1_names)

    QMetaObject.invokeMethod(my_app.noticers1_model, "updateNoticersList", Qt.DirectConnection,
                             Q_ARG(QVariant, q_noticers1_names))

qml:

            ListModel {
                id: noticers1_model
                objectName: "noticers1_model"
                function updateNoticersList(noticers1_names){
                    noticers1_model.clear()
                    for(var i = 0; i < noticers1_names.length; i++){
                        noticers1_model.append({"name":noticers1_names[i]})
                    }

                }
            }

python 和 json

python没有重载

json

loads、dumps注意s,是处理多个数据
以及,data = f.readlines()
记住要loads(data[0])

重大提醒,爬虫库无法稳定,和取消对 win 的支持

由于知乎频繁改版(前端),导致爬虫库无法稳定,对于 win 平台需要客户端经常升级。。

于是win 下放弃,,,(由于 win 还是静态链接库。。维护太麻烦了)

osx 和 linux 平台编译源码的老版本,如果出现 bug,请 (sudo)pip3 install zhihu-py3 --upgrade 就 ok 了

关于获得qml的属性

    url = url_input.getText(0, 100)
    notice_method = notice_method_spin.property("value")
    is_remind = is_remind_spin.property("value")

字典是一个对象

我们先读一段代码

def test(activities):
    feeds = []
    feed = {"url": None, "action": None}
    for act in activities:
        _set_feed_word(feed, feeds, act)

 def _set_feed_word(feed, feeds, act): 
    feed["action"] = act["action"]
    feed["url"] = act["url"]
    feeds.append(feed)

那么问题来了,假如
activities = [{"action": 1, "url": 1.1}, {"action": 2, "url": 2.2}]
的话,运行test(activities)
那么feeds结果是什么=,=

pyqt 多线程更新ui线程的ui数据

现在有俩要更新的qml里面的ui数据

  1. 当add完一个noticer后,需要爬虫动态,爬虫速度比较慢,需要多线程,当爬完的时候更新ui线程的listview(俩个) 在这
  2. 再爬虫的时候,我启动了一个dialog,来显示爬虫进度,但是后来发现,只有一个进程的话,ui线程完全就不能更新数据啊qaq 在这

pyqt相关的英文文档翻了好多,或许是我看不懂qaq

关于 pyqt5 某一个版本的 bug

其实我也碰到过了,显著特征就是,连接 https 页面(知乎)的时候会自动蹦掉,是 pyqt5 的 webview 的一个 bug(我查到的),人家已经发了补丁,也就是说更新到最新版的 pyqt5就 ok 了(如果你本来就是最新版估计这个对你无效)

我做了如下步骤,之后就好了,

brew uninstall pyqt5 --with-python3
brew install pyqt5 --with-python3

有关全局变量

入口文件一定不要有全局变量,不然a import b,c,d,xxxx后,会发生d import a的惨剧

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.