qq好友列表获取之动态爬虫清洗爬取qq好友列表数据 - 获取qq好友ip、群、群成员列表。我们的好友列表要从 qzone 获取,现在打开 qzone 的链接 https://h5.qzone.qq.com/mqzone/index 并且登陆。

具体步骤:

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

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

分析qzone请求

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

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

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

qq好友列表获取

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

qq好友列表获取

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

qq好友列表获取

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

分析参数来源

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

qq好友列表获取

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

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

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

qq好友列表获取

继续搜索 window.shine0callback

qq好友列表获取

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

qq好友列表获取

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

继续全局搜索 g_tk

qq好友列表获取

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

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

qq好友列表获取

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

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

qq好友列表获取

既然写在里面的那copy到控制台就可以执行了。这个不同微信好友列表获取的方式。
开始我把 userHelper copy进去发现少了一个getCookie,再把getCookie 也复制到控制台就好了

qq好友列表获取

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

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

现在参数都分析完毕,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'))

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

qq好友列表

下面是请求返回的结果

{"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}
}

最后发一下模仿请求的源码 结合我上一篇文章的源码可以直接执行出结果,也可以获取qq好友ip

import timedef 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() * 1000list = '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重试即便就好

更多:qq好友列表获取

qq好友列表获取之动态爬虫清洗爬取好友列表数据 - 获取qq好友、群、群成员列表相关推荐

  1. 爬虫beautifulsoup爬取豆瓣读书数据

    爬虫beautifulsoup爬取豆瓣读书数据:主要是爬取收集书的名字.类别.简介,用于接下来的聚类学习. 豆瓣链接:https://book.douban.com/tag/?view=type&am ...

  2. python战反爬虫:爬取猫眼电影数据 (一)(Requests, BeautifulSoup, MySQLdb,re等库)

    姓名:隋顺意 博客:Sui_da_xia 微信名:世界上的霸主 本篇文章未涉及猫眼反爬,主要介绍爬取无反爬内容,战反爬内容请去 python战反爬虫:爬取猫眼电影数据 (二)(Requests, Be ...

  3. python战反爬虫:爬取猫眼电影数据 (二)(Requests, BeautifulSoup, MySQLdb,re等库)

    姓名:隋顺意 博客:Sui_da_xia 微信名:世界上的霸主 本文主要介绍破解反爬,可以先去上一篇观看爬取无反爬内容 python战反爬虫:爬取猫眼电影数据 (一)(Requests, Beauti ...

  4. AJAX教程美食滤镜,Python爬虫实例——爬取美团美食数据

    1.分析美团美食网页的url参数构成 1)搜索要点 美团美食,地址:北京,搜索关键词:火锅 2)爬取的url https://bj.meituan.com/s/%E7%81%AB%E9%94%85/ ...

  5. python战反爬虫:爬取猫眼电影数据 (一)

    非常荣幸邀请到 赛迪人工智能大赛(简称AI世青赛)全球总决赛银奖的获得者 隋顺意 小朋友为本公众号投稿,隋小朋友虽然小小年纪,但编程能力已经比大多数大学生强非常多了,欢迎大家关注,捧场. 姓名:隋顺意 ...

  6. node 爬虫 实战 - 爬取拉勾网职位数据

    node 爬虫 实战 - 爬取拉勾网职位数据,主要想把数据用于大数据学习,到时候大数据分析可以自己分析一下职位的情况,和比较一些我现在的职位在深圳乃至全国的开发人员水平. 涉及到的技术栈:node.j ...

  7. python爬虫爬取58网站数据_Python爬虫,爬取58租房数据 字体反爬

    Python爬虫,爬取58租房数据 这俩天项目主管给了个爬虫任务,要爬取58同城上福州区域的租房房源信息.因为58的前端页面做了base64字体加密所以爬取比较费力,前前后后花了俩天才搞完. 项目演示 ...

  8. 用Scrapy爬虫框架爬取食品论坛数据并存入数据库

    这篇文章主要给大家介绍了食品网站的数据采集和存储过程,详解了如何分析网页结构.爬虫策略.网站类型.层级关系.爬虫方法和数据存储过程,最终实现将帖子的每条评论爬取到数据库中,并且做到可以更新数据,防止重 ...

  9. Python爬虫:爬取喜马拉雅音频数据详解

    前言 喜马拉雅是专业的音频分享平台,汇集了有声小说,有声读物,有声书,FM电台,儿童睡前故事,相声小品,鬼故事等数亿条音频,我最喜欢听民间故事和德云社相声集,你呢? 今天带大家爬取喜马拉雅音频数据,一 ...

最新文章

  1. Gentoo 安装日记 20 (安装配置开机引导程序grub)
  2. 搭建基于spring MVC框架 + RESTful架构风格技术总结
  3. 理解并实施:GLBP(ccna200-120新增考点)
  4. JavaScript:学习笔记(9)——Promise对象
  5. 下列哪一项不是计算机网络的典型应用,09级计算机信息网络试卷A
  6. 矩阵论-线性变换的特征值与特征变换
  7. java短信验证码功能发送的验证码如何校验_企业如何选择短信平台才能保障安全和稳定性?...
  8. DP Intro - Tree DP Examples
  9. iOS开发--基于AFNetWorking3.0的图片缓存分析
  10. HDU 5387 Clock(分数类+模拟)
  11. 【Luogu1095】守望者的逃离
  12. java判断safari_js代码判断浏览器种类IE、FF、Opera、Safari、chrome及版本
  13. JBPM工作流框架应用
  14. c盘清理代码_WIN10 C盘空间不够怎么办?几个小方法助你清理硬盘空间
  15. Android百度地图,定位图标随着方向的改变而改变
  16. Linux:dd命令详解(df du命令参数)
  17. spi通讯不需要地线吗_SPI通信时是不是主机和从机的MISO、MOSI两根线应该交叉接呀?...
  18. Centos7开地狱已满服之插件安装
  19. 如何更换 macOS Mojave 登陆界面背景图?
  20. 数据结构基础之图(上):图的基本概念

热门文章

  1. ACL详解 Cisco
  2. 忙里偷闲附上打油诗一首
  3. 树莓派和电脑之间串口通信编程
  4. Linux | 管道
  5. Code vs 1391 伊吹萃香(虫洞)
  6. 关于BBSXP 7.00 BETA2 SQL通杀教程
  7. [数据集][目标检测]天牛数据集目标检测数据集VOC格式3050张
  8. export、export default的使用
  9. WPF--Prism框架安装初识
  10. 全国程序员工资新统计,“高危”行业就这收入?