好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

如何写个爬虫程序扒下知乎某个回答所有点赞用户名单?

问一个人知乎账号想fo一下,结果她不告诉我,现在想想有点奇怪,有点好奇,好在我知道几个她点赞过的问题,想用社会工程学的方法筛选下,找出她的知乎账号。(匿了没法邀请,算了她应该不会来这个区)

回复内容: 每个回答的div里面都有一个叫 data-aid="12345678"的东西,
然后根据, HdhCmsTestzhihu测试数据/answer/12345678/voters_profile?&offset=10
这个json数据连接分析所有点赞的id和个人连接就行, 每10的点赞人数为一个json连接.

刚刚试了一下,需要登陆之后才能得到完整的数据, 登陆知乎可以参考我写的博客.
python模拟登陆知乎


比如我这个回答的data-aid = '22229844'

  #!/usr/bin/env python 
 # -*- coding: utf-8 -*- 

 import   requests 
 from   bs4   import   BeautifulSoup 
 import   time 
 import   json 
 import   os 
 import   sys 

 url   =   'http://HdhCmsTestzhihu测试数据' 
 loginURL   =   'http://HdhCmsTestzhihu测试数据/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://HdhCmsTestzhihu测试数据/"  , 
     'Host'  :   'HdhCmsTestzhihu测试数据'  , 
 } 

 data   =   { 
     'email'  :   ' 
 xxxxx  @gmail测试数据  ', 
     '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://HdhCmsTestzhihu测试数据/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://HdhCmsTestzhihu测试数据/question/27621722/answer/48820436这个大神的399各赞为例子. 
 zanBaseURL   =   'http://HdhCmsTestzhihu测试数据/answer/22229844/voters_profile?&offset={0}' 
 page   =   0 
 count   =   0 
 while   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   ZhihuClient 

 client   =   ZhihuClient  (  'cookies.json'  ) 

 url   =   'http://HdhCmsTestzhihu测试数据/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://HdhCmsTest zhihu测试数据/answer/222298 44/voters_profile
URL发送数据。
从这个URL的格式上已经很容易猜到这就是给答案22229844 进行投票的投票者资料了,一看服务器返回的Response (一段JSON数据)也能说明这一点。那么只要我们可以向这个URL发送一段GET请求就能知道投票者了。剩下的就是要解决怎么找出这个URL的问题,也就是找到这个22229844 。
2. 既然知道当点击 等人赞同 会触发一段Ajax向这个URL发送请求,那这个22229844 要么在DOM中存储了,要么是计算出来的。既然如此,在DOM中搜索22229844这个字符串,很轻松就能找到这样的一个div:

  

我好奇的是,你说的社会工程学是啥?
据我所知,一般所谓社会工程学就是黑客的骗术,凭借已知信息骗取信任拿到自己要的信息,但是核心就是骗。
你现在是知道她点了哪个答案的赞,跟社会工程学有什么关系呢?
你是想说你知道她点过的多个答案,准备从同时赞过这些答案的人中找到她?
运气好可能一下子就找出来了,运气不好恐怕一堆候选人等着你。关键看你知道她赞过几个答案了。
论技术的话,我觉得用不着python写js在控制台跑就好了 找轮子哥 他有源码 轮子哥有爬取用户自动分析性别颜值值得关注程度的源码

查看更多关于如何写个爬虫程序扒下知乎某个回答所有点赞用户名单?的详细内容...

  阅读:42次