• 技术文章 >后端开发 >Python教程

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

    2016-06-06 16:21:57原创1521
    问一个人知乎账号想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 requests
    from bs4 import BeautifulSoup
    import time
    import json
    import os
    import sys
    
    url = '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 = 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://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. 点击 任意一个答案页面下面的超链接 等人赞同 发现会向类似于这样的
    zhihu.com/answer/222298
    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在控制台跑就好了 找轮子哥 他有源码 轮子哥有爬取用户自动分析性别颜值值得关注程度的源码
    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:
    Web大前端开发直播班

    相关文章推荐

    • 详细了解Python进程池与进程锁• 一起聊聊Python的编码样式• 带你搞懂Python反序列化• 归纳整理!Python实用技巧总结• 归纳整理python正则表达式解析
    1/1

    PHP中文网