问一个人知乎账号想fo一下,结果她不告诉我,现在想想有点奇怪,有点好奇,好在我知道几个她点赞过的问题,想用社会工程学的方法筛选下,找出她的知乎账号。(匿了没法邀请,算了她应该不会来这个区)
回复内容:每个回答的div里面都有一个叫 data-aid=12345678的东西,
然后根据, www.zhihu.com/answer/12345678/voters_profile?&offset=10
这个json数据连接分析所有点赞的id和个人连接就行, 每10的点赞人数为一个json连接.
刚刚试了一下,需要登陆之后才能得到完整的数据, 登陆知乎可以参考我写的博客.
python模拟登陆知乎
比如我这个回答的data-aid = '22229844'
#!/usr/bin/env python# -*- coding: utf-8 -*-import requestsfrom bs4 import beautifulsoupimport timeimport jsonimport osimport sysurl = 'http://www.zhihu.com'loginurl = 'http://www.zhihu.com/login/email'headers = { user-agent: 'mozilla/5.0 (macintosh; intel mac os x 10.10; rv:41.0) gecko/20100101 firefox/41.0', referer: http://www.zhihu.com/, 'host': 'www.zhihu.com',}data = { 'email': 'xxxxx@gmail.com', 'password': 'xxxxxxx', 'rememberme': true,}s = requests.session()# 如果成功登陆过,用保存的cookies登录if os.path.exists('cookiefile'): with open('cookiefile') as f: cookie = json.load(f) s.cookies.update(cookie) req1 = s.get(url, headers=headers) with open('zhihu.html', 'w') as f: f.write(req1.content)# 第一次需要手动输入验证码登录else: req = s.get(url, headers=headers) print req soup = beautifulsoup(req.text, html.parser) xsrf = soup.find('input', {'name': '_xsrf', 'type': 'hidden'}).get('value') data['_xsrf'] = xsrf timestamp = int(time.time() * 1000) captchaurl = 'http://www.zhihu.com/captcha.gif?=' + str(timestamp) print captchaurl with open('zhihucaptcha.gif', 'wb') as f: captchareq = s.get(captchaurl) f.write(captchareq.content) logincaptcha = raw_input('input captcha:\n').strip() data['captcha'] = logincaptcha # print data loginreq = s.post(loginurl, headers=headers, data=data) # print loginreq.url # print s.cookies.get_dict() if not loginreq.json()['r']: # print loginreq.json() with open('cookiefile', 'wb') as f: json.dump(s.cookies.get_dict(), f) else: print 'login failed, try again!' sys.exit(1)# 以http://www.zhihu.com/question/27621722/answer/48820436这个大神的399各赞为例子.zanbaseurl = 'http://www.zhihu.com/answer/22229844/voters_profile?&offset={0}'page = 0count = 0while 1: zanurl = zanbaseurl.format(str(page)) page += 10 zanreq = s.get(zanurl, headers=headers) zandata = zanreq.json()['payload'] if not zandata: break for item in zandata: # print item zansoup = beautifulsoup(item, html.parser) zaninfo = zansoup.find('a', {'target': _blank, 'class': 'zg-link'}) if zaninfo: print 'nickname:', zaninfo.get('title'), ' ', print 'person_url:', zaninfo.get('href') else: anonymous = zansoup.find( 'img', {'title': true, 'class': zm-item-img-avatar}) print 'nickname:', anonymous.get('title') count += 1 print count
这里有个 python 3 的项目 zhihu-py3 7sdream/zhihu-py3 · github
封装了知乎爬虫的各方面需求,比如获取用户信息,获取问题信息,获取答案信息,之类的……当然也包括点赞用户啥的,虽然是单线程同步式 但是平常用用还是可以滴。
这里是她的文档:welcome to zhihu-py3’s documentation!
欢迎 star 以及 fork 或者贡献代码。
===
获取点赞用户灰常简单 大概就这样
from zhihu import zhihuclientclient = zhihuclient('cookies.json')url = 'http://www.zhihu.com/question/36338520/answer/67029821'answer = client.answer(url)print('问题:{0}'.format(answer.question.title))print('答主:{0}'.format(answer.author.name))print('此答案共有{0}人点赞:\n'.format(answer.upvote_num))for upvoter in answer.upvoters: print(upvoter.name, upvoter.url)
看到第一名的答案中的评论,补充一下如何发现aid这个关键特征的思路:
一句话概述:对人工操作时发送的http request/response进行分析,找出关键定位特征。
工具:firebug
1. 点击 任意一个答案页面下面的超链接 等人赞同 发现会向类似于这样的
http://www.zhihu.com/answer/22229844/voters_profile
url发送数据。
从这个url的格式上已经很容易猜到这就是给答案22229844 进行投票的投票者资料了,一看服务器返回的response (一段json数据)也能说明这一点。那么只要我们可以向这个url发送一段get请求就能知道投票者了。剩下的就是要解决怎么找出这个url的问题,也就是找到这个22229844 。
2. 既然知道当点击 等人赞同 会触发一段ajax向这个url发送请求,那这个22229844 要么在dom中存储了,要么是计算出来的。既然如此,在dom中搜索22229844这个字符串,很轻松就能找到这样的一个div:
data-copyable=1 data-isowner=0 data-helpful=1 data-deleted=0 data-created=1444404675 data-collapsed=0 data-atoken=67029821 data-author=洛克 data-qtoken=36338520 data-aid=22229844 itemtype=http://schema.org/answer itemscope= itemprop=topanswer class=zm-item-answer tabindex=-1>我好奇的是,你说的社会工程学是啥?
据我所知,一般所谓社会工程学就是黑客的骗术,凭借已知信息骗取信任拿到自己要的信息,但是核心就是骗。
你现在是知道她点了哪个答案的赞,跟社会工程学有什么关系呢?
你是想说你知道她点过的多个答案,准备从同时赞过这些答案的人中找到她?
运气好可能一下子就找出来了,运气不好恐怕一堆候选人等着你。关键看你知道她赞过几个答案了。
论技术的话,我觉得用不着python写js在控制台跑就好了找轮子哥 他有源码轮子哥有爬取用户自动分析性别颜值值得关注程度的源码