抓包分析
以「如何看待《万万没想到西游篇》大电影在知乎上被众多大神唾弃的现象? - 张兆杰的回答」为例。
使用Chrome抓包发现,点击「等人赞同」链接时,浏览器向如下网址发送GET请求:
https://www.zhihu.com/answer/26236952/voters_profile
26236952是此答案对应的aid:
返回的JSON数据中有这么一项:
"next": "/answer/26236952/voters_profile?total=808&offset=10&follows=NYRY--TZ3-l5H4gXp5RoqQVv"
下拉滚动条,浏览器会继续发送GET请求:
https://www.zhihu.com/answer/26236952/voters_profile?total=808&offset=10&follows=NYRY--TZ3-l5H4gXp5RoqQVv
正好是next指向的网址。
每次GET请求返回的JSON数据都包含了10个点赞用户的信息,单个用户的信息如下:
<div class="zm-profile-card clearfix no-hovercard">
<div class="zg-right">
<button data-follow="m:button" data-id="6b500d547283f3cc186eafff2a8033b4" class="zg-btn zg-btn-follow zm-rich-follow-btn small nth-0">关注她</button>
</div>
<a title="薛定谔的喵"
data-tip="p$t$fang-ting-20-32"
class="zm-item-link-avatar"
target="_blank"
href="/people/fang-ting-20-32">
<img src="https://pic1.zhimg.com/52ae34056536f4088c7667890f14aaa8_m.jpg" class="zm-item-img-avatar">
</a>
<div class="body">
<div class="author ellipsis">
<a data-tip="p$t$fang-ting-20-32" href="https://www.zhihu.com/people/fang-ting-20-32" target="_blank" class="zg-link" title="薛定谔的喵">薛定谔的喵</a>
<span class="bio hidden-phone">世界那么大,我来看看!</span>
</div>
<ul class="status">
<li><span>13 赞同</span></li>
<li><span>6 感谢</span></li>
<li class="hidden-phone"><a href="/people/fang-ting-20-32/asks" target="_blank">0 提问</a></li>
<li class="hidden-phone"><a href="/people/fang-ting-20-32/answers" target="_blank">19 回答</a></li>
</ul>
</div>
</div>
由于0回答则必然0赞同0感谢,只须提取提问和回答数。
如果是匿名用户:
<div class="zm-profile-card clearfix no-hovercard">
<span class="zm-item-link-avatar">
<img title="匿名用户" class="zm-item-img-avatar" src="https://pic2.zhimg.com/aadd7b895_m.jpg"/>
</span>
<div class="body">
匿名用户
</div>
</div>
使用说明
1. 答案对应的aid需要自己在网页源码中找
2. 如果需要获取完整的抓取结果,将下面save这一行取消注释
# 想看完整结果可以保存到csv文件,用Excel查看
# save(infos, aid)
3. 首次使用时需要运行 ZhiHuClient().login(username, password) 登录一次,以后不需要
4. 控制台输出如下:
总赞数:822,四零用户数:182,比例:0.22141119221411193
四零用户是指:0赞同、0感谢、0提问、0回答。有些知友万年潜水,从来不提问和回答,他们的数据也会是四个0。所以四零用户不等于水军号。而且现在养水军号一般会养上一段时间伪装成正常号再使用,很难判断。
改进空间:后来测了一下,发送GET请求的网址可以精简:
https://www.zhihu.com/answer/26236952/voters_profile?offset=10
只需改变offset值就能获取不同的信息,可以改成多线程爬取。
脚本源码
1 | #!/usr/bin/env python |