分析QQ空间

登录QQ空间

爬取第一步,分析站点,首先需要知道如何登录QQ空间。最初想法是用requests库配置登录请求,模拟登录,但是不久便放弃了这一思路,请看下图↓

d30669b4464bf0733b44c918fb228ee3.png

login

根据登录按钮绑定的监听事件可以追踪到该按钮的点击事件如下:

d201d0944f00ed579ae2731b26ee6664.png

login function

账号加密是必然的,但这一堆堆的代码真心不好解析,有耐心的勇士尽情一试!

在排除这种登录方法后,选择selenium模拟用户登录不失为省时省力的方法,而且我们只是需要通过selenium完成登录,获取到Cookies和后面讲述的g_tk参数后,就可以停用了,所以效率并不太低。

分析空间相册

登录以后,页面会跳转至 [https://user.qzone.qq.com/{QQ_NUMBER}](javascript:;), 这时把鼠标移到导航栏你会发现,所有的导航栏链接都是javascript:; 。没错就是这么坑,一切都是暗箱操作。

当然这并不难处理,使用调试工具捕获点击后产生的请求,然后过滤出正确的请求包即可。因为网络包非常多,那么怎么过滤呢,猜想相册数据的API必然会返回个列表list,尝试过滤list然后逐个排除,最后定位到请求包。下面是通过fcg_list过滤后的数据包,列表信息以jsonp格式返回,稍作处理即可当做json格式来读取(后面有讲)。

9e6e06a95c95fc7c69c43c749b4c4fef.png

album list

从Headers和Response可以分别获取到两组重要信息:

  1. request 获取相册列表所需的请求信息,包括请求链接和参数
  2. response 数据包包含的所有相册的信息,是每个相册所含照片对应的请求包参数的数据来源

先看请求包:

# urlhttps://h5.qzone.qq.com/proxy/domain/photo.qzone.qq.com/fcgi-bin/fcg_list_album_v3# argsg_tk: 477819917callback: shine0_Callbackt: 691481346hostUin: 123456789uin: 123456789appid: 4inCharset: utf-8outCharset: utf-8source: qzoneplat: qzoneformat: jsonpnotice: 0filter: 1handset: 4pageNumModeSort: 40pageNumModeClass: 15needUserInfo: 1idcNum: 4callbackFun: shine0_: 1551788226819

其中hostUin, uin都是QQ号,g_tk是必须的且每次重新登录都会更新(后面有讲如何获取),其它有些参数不是必须的,我尝试后整理出如下请求参数:

query = { 'g_tk': self.g_tk, 'hostUin': self.username, 'uin': self.username, 'appid': 4, 'inCharset': 'utf-8', 'outCharset': 'utf-8', 'source': 'qzone', 'plat': 'qzone', 'format': 'jsonp'}

接下来看jsonp格式的跨域响应包:

shine0_Callback({ "code":0, "subcode":0, "message":
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐