前言
先说明, 本文是水文, 跟 Python 也没关系的, 写着 Python, 是因为 jb 用 py 写爬虫比较多;
本文只是简单介绍个网站如何爬虫的思路, 文章很短, 1 分钟看完, 没啥特别的, 完~
讲故事啦
为什么要说这事, 是因为今早在某群看到有同学问, 访问接口没有数据, 是啥问题;
第一反应就是, 请求参数不对, 但接着该同学说, 参数都一样的, 还是没数据;
刚好看到了, 就试试吧, 打开首页 http://www.phizhub.com/ , 是个表情包的网站, 够骚的~
常规操作, Chrome F12-network, 选择 XHR, 现在一般网站都是 Ajax 加载图片的, 所以直接选择 xhr 了, 刷新网页, 这不就有数据了吗?
逐个点击看返回的内容, 不难找到图片地址;
这样, 接口地址也出来了:
http://www.phizhub.com/phiz/get_phiz_list/?category=-1&page=1&last_time=0&page_size=40
后面的参数, 不纠结, 把这个地址放到 Chrome 上访问, 发现居然是没数据:
行吧, 可能是因为请求时需要特定的参数, 用 postman 模拟一波, 按照上面看到的参数搞一波, 发现还是没有数据:
一开始以为参数不对或者有遗漏, 检查一遍发现还是不行, 那就说明, 可能是服务器有检验机制了;
先看了一下 body, 那 4 个参数都很正常, 可以排除了;
再看看请求头, 看到一个 sss 参数跟 timestamp 参数, 其他参数看着都正常;
首先, 这个 sss 可能性很大, 因为这命名很奇怪, 另外, 校验时间戳, 也合理;
刷新几次网站, 发现这两个参数都是会变化的, 因此更加怀疑了;
每次刷新都能正常显示, 当时自己模拟的时候又不行, 参数肯定是没错的, 这是不是说明, 有时效性限制?
既然有这样的怀疑, 就测试一下吧, 刷新网页, 把 sss 跟 timestamp 的值复制到 postman 模拟, 经过几次, 偶然发现居然可以的;
同样的参数, 再 post 一次, 发现就返回空数据了, 就证实了时效性校验的机制, 而且这个时效性极短, 5 秒内!
参数逻辑
下面讲讲这两个参数的逻辑;
时间戳, 一般是当前时间戳, 拿去转化看看, 发现就是当前时间, 无难度:
问题就在 sss 这个玩意, 这种情况只能找源码, 那怎么看?
首先, 返回到这个页面, 此时, 红框里的就是需要分析的接口;
那把鼠标移动到右侧的 jQuery-1.8.3.min.JS 文件, 此时会弹出一堆 JS 文件;
逐个找, 点击一个你觉得很大可能跟数据有关的文件, 这里不难看出, 就是 get_data, 那就点击右侧的 JS 文件吧;
点击后, 直接跳转到这里, sss 对应的是代码的 abc, 而 abc 是 get_abc 函数生成的, 而且需要时间戳做参数;
一般情况下, 浏览器默认是非调试状态, 那就点击右上的按钮, 暂停下吧;
点击后, 会自动打开一个文件, 乱七八糟一大堆, 不想看;
既然不想看, 就返回到刚刚那个 JS 文件吧, 然后把鼠标移动到 get_abc 函数上;
然后点击, 逻辑不就出来了吗?
因此, 这两个参数的逻辑如下:
- function current_timestamp(){
- return(new Date).getTime()
- };
- # 当前时间戳
- function get_abc(a){
- return $.md5("phizhub_abc_"+a)
- }
- # sss 就是 phizhub_abc_+ 当前 13 位时间戳拼接而成的 md5
故事完, 可以愉快啪啪啪了, 脚本没有, 纯提供分析思路;
小结
看吧, 都说是水文, 你还不信?
本文也没讲到啥, 只是现在爬虫的门槛会越来越高, 而学会怎么找 JS 源码, 算是当今爬虫必备的技能了, 希望对你有帮助~
谢谢大家~
来源: https://juejin.im/post/5c6e61756fb9a049c043a055