监测知乎用户的个人动态并保存内容至本地。
某用户的动态结果保存目录如下:
activities为个人动态页快照,archives为动态对应的回答/文章快照
.
├── activities
│ ├── 2024
│ │ └── 01
│ │ └── 17
│ │ ├── 回答-为什么只有饿死的狮子而没有饿死的老虎?说明了什么问题?.png
│ │ ...
│ │ └── 赞同-如何看待211高校华中某业大学动物Y养系黄某若教授十几年如一日的学术造假行为?.png
│ └── 20240117181850.json
└── archives
└── 2024
└── 01
└── 17
├── 回答-为什么只有饿死的狮子而没有饿死的老虎?说明了什么问题?
│ ├── info.json
│ └── 回答-为什么只有饿死的狮子而没有饿死的老虎?说明了什么问题?.png
...
└── 赞同-如何看待211高校华中某业大学动物Y养系黄某若教授十几年如一日的学术造假行为?
├── info.json
└── 赞同-如何看待211高校华中某业大学动物Y养系黄某若教授十几年如一日的学术造假行为?.png
16 directories, 25 files
其中:
动态文件activities/2024/01/17/赞同-如何看待211高校华中某业大学动物Y养系黄某若教授十几年如一日的学术造假行为?.png如图:

目标文件archives/2024/01/17/赞同-如何看待211高校华中某业大学动物Y养系黄某若教授十几年如一日的学术造假行为?/赞同-如何看待211高校华中某业大学动物Y养系黄某若教授十几年如一日的学术造假行为?.png如图:

archives/2024/01/17/赞同-如何看待211高校华中某业大学动物Y养系黄某若教授十几年如一日的学术造假行为?/info.json内容为:
{
"title": "如何看待211高校华中某业大学动物Y养系黄某若教授十几年如一日的学术造假行为?",
"url": "https://zhuanlan.zhihu.com/p/678136207",
"author": "zhang-li-28-1",
"shot_at": "2024-01-17T18:19:13.783"
}
ZhiArchive使用Playwright,它由4个部分组成,分别是monitor,archiver,login worker和api:
- monitor:用于监测用户个人主页的动态并将新的动态:打快照,把动态的目标(回答、文章)链接通过redis传递给archiver。
- archiver:打开目标链接并保存屏幕快照至本地。
- login worker:用于登录知乎获取monitor和archiver所必需的认证信息。
- api:提供接口来操作控制monitor,archiver,login worker。
注意查看日志跟踪运行状态
archiver: archiver.log
monitor: monitor.log
login_worker: login_worker.log
# 下载本项目
git clone https://github.com/amchii/ZhiArchive.git
# 进入项目目录
cd ZhiArhivedocker build -t zhi-archive:latest -f CN.Dockerfile .现在支持 0配置 启动,你若是只想在本机 试用本项目,可以忽略这一步。
但是当部署在云服务器上并暴露API端口时,强烈建议配置.apienv启用接口认证。
所有可配置项见config.py:
支持通过环境变量或.env,.apienv文件配置
.env文件
secret_key= # 请生成一个随机字符串
.apienv文件
# API认证账号,配置用户名和密码
enable_auth=true
username=
password=
若当前是root用户,则会导致容器内的chromium浏览器无法以沙盒模式启动:https://playwright.dev/python/docs/docker#run-the-image,可能会被知乎执行恶意代码(🤨。
docker 新版本可以直接使用docker compose而不是docker-compose
docker compose up -d
这会为每个worker启用一个容器,同时运行一个redis实例。
需要通过环境变量或.env文件配置redis,如:
redis_host=172.17.0.1
redis_port=6379
redis_passwd=apassword
启动服务:
docker compose -f docker-compose2.yaml up -d
API端口为9090,以127.0.0.1为例,
打开http://127.0.0.1:9090/zhi/login获取知乎登录二维码:

扫码完成登录后将自动应用获取的Cookie并重定向到配置页面http://127.0.0.1:9090/zhi/core/config 。
states/d2b7f9613e2c0da587ee.state.json即保存的cookies文件,上一步登录成功后自动设置,所以如果你有该文件,也可以不登录直接设置为你的文件路径。
Monitor默认每5分钟监测一次,配置项含义见config.py。
Monitor和Archiver默认是暂停状态,通过配置页的归档Archiver配置和监控Monitor配置 更改people为你想要监控的知乎用户名,通过下方的切换状态按钮可以控制运行状态,注意观察日志文件的输出。
- 即使是无头模式,Chromium浏览网页和截图时占用内存依然较高,在低内存的云服务器上可能会崩溃(需要数百MB,最好通过docker的
--memory限制下,参考docker-compose2.yaml) - 超长的回答/文章可能会截图失败(playwright抛出错误),经测试内存越大能截的图越长
- 所有元素selector可配置
- 通过接口完全控制
Monitor,Archiver - 支持监测多个用户
- 异常告警
- 提供前端界面
- 存档任务失败处理
