动态爬虫之QQ好友列表

步骤

1、分析qzone请求
2、分析参数来源
3、仿照数据请求

上次写的一个qzone登陆写的不详细这次决定写一个详细分析qzone js 获取好友列表

分析qzone请求

我们的好友列表要从 qzone 获取,现在打开 qzone 的链接 https://h5.qzone.qq.com/mqzone/index 并且登陆

qzone_login_success.png

你可能会说你在逗我,这特么哪里来的好友列表
别急,好友列表肯定是有的不然你发表说说怎么@你的好友呢

说到@好友都明白了吧,我们的好友列表接口就从这里开始拦截接口请求。
先把打开我们发说说的那个框框,再把浏览器开启调试模式,清空网络请求拦截列表

qzone_network_requests.png

现在你应该在发说说的那个界面,点一下说说框下面的 @符号

qzone_send_message.png

盯住网络请求那一块,找一下那个像是获取好友列表的,发现一共就6个请求,我一眼就看到了mfriend_list 接口意思很直白啊

qzone_network_requests02.png

好友列表已经找到,接下来就是分析参数了,这个过程很痛苦

分析参数来源

首先点我刚刚说到的那一条请求记录 就是这样子的 我对自己的qq号打了码毕竟这个东西获取到可以直接用cookie登陆的

qzone_friend_list_details.png

这里可能有人会说,为什么不直接点击拦截列表上面有个可以定位js发出请求的位置,这样找分析请求参数不是更简单吗
这边呢我只能说我之前也找过,但是找不到,因为点击过去找到的是封装类的位置

这边参数呢不多 六个 需要分析的就两个
qzonetoken c2176b5d6f0deff03d0dd0f59f26e51c2b408aa83419d416c737cc1b21d1e913c861ca780ad34ff4293ca5640b69
g_tk:1760587213
res_uin:***
res_type:normal
format:json
timestamp 时间戳

我们现在看一下这个 qzonetoken 使用全局搜索找一下看是不是写在静态页面中的

qzone_search_qzonetoken_result.png

继续搜索 window.shine0callback

qzone_search_window.shine0callback_result.png

发现都是一个结果。。。。 后面我试着搜索一下html 里面 发现竟然真的有

qzone_search_html_result.png

window.shine0callback = 自执行函数
所以呢 qzonetoken 参数直接用 window.shine0callback 就好了

继续全局搜索 g_tk

qzone_search_g_tk_result.png

这边呢有三个方法获取token
1、userHelper.getPskeyToken()
2、userHelper.getToken()
3、user.getToken()

我们先在控制台执行一下这些方法

qzone_exec_console_out.png

发现 user 能执行也和请求的参数对上了,不过我还是想找一下 userHelper 这个东西

先把ajax.js 这个类给弄到本地来 搜索 userHelper

qzone_search_userHelper_result.png

既然写在里面的那copy到控制台就可以执行了
开始我把 userHelper copy进去发现少了一个getCookie,再把getCookie 也复制到控制台就好了

qzone_exec_console_userHelper.png

这样子执行就能获取到 token 了

res_uin qq号码,我在搜索静态html的时候无意间发现了可以从 FrontPage 对象中获取,当然也可以从 user 对象中获取
res_type 固定normal
format 固定json
timestamp 时间戳拿一下系统时间戳就好

现在参数都分析完毕,qzone 的接口分析还是蛮简单的,不像某宝网站的程序

仿照数据请求

请到我上一篇文章拿 qzone登陆 的源码 传送到源码

找到 paresHtml 函数 在这里先切换到默认窗口

def paresHtml(self):
    self.driver.switch_to.default_content()

获取 qzonetoken 这边直接执行window.shine0callback 就能获取

qzonetoken = self.driver.execute_script('return window.shine0callback')

获取 g_tk 上面说到user里面可以直接获取,那我们就偷个懒使用 user.getToken()

g_tk = self.driver.execute_script('return user.getToken()')

获取 res_uin 直接从user 里面 getUin()

res_uin = self.driver.execute_script('return user.getUin()')

获取时间戳 由于python 中的time.time()是秒,需要乘个1000

import time
timestamp = time.time() * 1000

拼接url

list = 'https://mobile.qzone.qq.com/friend/mfriend_list?' \
               'qzonetoken=%s&g_tk=%s&res_uin=%s&res_type=normal&format=json&timestamp=%d' % (
                   qzonetoken, g_tk, res_uin, timestamp)

本身我想偷懒的直接用 self.driver.get() 直接执行的 后来想想还是算了,没有一点技术含量的东西怎么好意思写呢
最后决定使用js中的XMLHttpRequest 来模仿请求

    self.driver.execute_script('window.xhr = new XMLHttpRequest;')
    self.driver.execute_script('window.xhr.withCredentials=true;')
    self.driver.execute_script(
        'window.xhr.open(\'GET\',\'%s\',false)' % list)
    self.driver.execute_script('window.xhr.onload = function (e){window.xhrsuccess = window.xhr.responseText}')
    self.driver.execute_script('window.xhr.send()')
    print(self.driver.execute_script('return window.xhrsuccess'))

请求完成后的结果是这个样子的

qzone_xmlHttprequest_result.png

下面是请求返回的结果

{
    "code":0,
    "subcode":0,
    "message":"",
    "default":0,
    "data":{
        "gpnames":[//分组列表
            {
                "gpid":0,//分组id
                "gpname":"agp"//分组名称
            }
        ],
        "list":[//好友列表
            {
              "groupid":0,//分组id
              "isvip":1,//是否是vip 1 是 vip
              "nick":"消费主张", //昵称
              "remark":"消费主张",//备注
              "searchField":"12315 消费主张 消费主张 xiaofeizhuzhang xfzz xiaofeizhuzhang xfzz",//关键字
              "uin":12315,//qq号码
              "viplevel":1 //qq等级
            }
        ],
        "mayknow":{
             "allnum":0,
              "list":null,
              "page":1
        },
        "speciallist":null
     }
}

最后发一下模仿请求的源码 结合我上一篇文章的源码可以直接执行出结果

import time

def paresHtml(self):
    # 切换到默认窗口
    self.driver.switch_to.default_content()
    # 请求状态
    shine0callback = self.driver.execute_script('return window.shine0callback')
    # 一定要暂停一下不然 执行user的时候拿不到,因为懒加载
    time.sleep(1)

    g_tk = self.driver.execute_script('return window.user.getToken()')
    uin = self.driver.execute_script('return window.user.getUin()')
    timestamp = time.time() * 1000

    list = 'https://mobile.qzone.qq.com/friend/mfriend_list?' \
            'qzonetoken=%s&g_tk=%s&res_uin=%s&res_type=normal&format=json&timestamp=%d' % (
                shine0callback, g_tk, uin, timestamp)

    # self.load_cookies()
    # self.driver.get(list)

    self.driver.execute_script('window.xhr = new XMLHttpRequest;')

    self.driver.execute_script(
            'window.xhr.open(\'GET\',\'%s\',false)' % list)
    self.driver.execute_script('window.xhr.onload = function (e){window.xhrsuccess = window.xhr.responseText}')
    self.driver.execute_script('window.xhr.send()')
    print(self.driver.execute_script('return window.xhrsuccess'))

总结

1、qzone 里面的接口参数都差不多,总归来讲都能搜索出来
2、qzone 压缩了js提高了分析的难度
3、好友列表模拟请求时记得把cookie带过去否则t不认
4、有时候登陆会登不上,拿到的好友列表数据是请先登录,删掉cookie重试即便就好

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容