爬虫js逆向系列
我会把做爬虫过程中,遇到的所有js逆向的问题分类展示出来,以现象,解决思路,以及代码实现。我觉得做技术分享,不仅仅是要记录问题,解决办法,更重要的是要提供解决问题的思路。怎么突破的,遇到这个问题怎么思考,尝试的方法有哪些。这样就可以有的放矢。希望对大家有用
爬虫认知
在程序猿所有的方向中,爬虫是离money最近的一个方向,你的明白?而且爬虫可发展的方向很多,前可走大数据,人工智能,后可转后端,还有就是安全领域。而且爬虫做得好,要求的技术栈还是比较全面的。如果你对爬虫有兴趣,欢迎加V:13809090874,一起沟通交流
免责申明:
此内容仅供学习交流使用,不用于商业用途,如果涉及侵权,联系作者删除
此专栏系列主要写一些js逆向爬虫的实战:抖音第三方数据分析平台爬虫心路历程(done)
1.1井中蛙:爬虫js逆向之无限debugger--抖音第三方数据分析平台的坑zhuanlan.zhihu.com
1.2井中蛙:爬虫js逆向之加密参数破解--抖音第三方数据分析平台的坑zhuanlan.zhihu.com快手第三数据分析平台爬虫爬虫心路历程(ing)
淘宝
拼多多
知乎
B站
微博
小红书
美团
携程
看完这个系列,js逆向对我们来说,就是信手拈来,所见即所得,哈哈哈。如果你有想抓取的网站,但有瓶颈的,或者需要源码的,欢迎加我微信:13809090874,一起攻克。
js逆向爬虫实战(2)–新快之http2.0
咱们还是老规矩,做爬虫先搞它的接口,再破登录问题。接口的破解的流程是:查看网络请求
分析请求头
找到加密参数
寻找加密参数生成的地方
破解js
带入登录参数测试接口
配套工具:charles+chrome浏览器(过段时间,我会写一篇charles小技巧,chrome调试小技巧的文章,敬请期待)
1. 查看网络请求
请求头内容如下:
url:
https://xk.newrank.cn/xdnphb/nr/cloud/ks/rank/accountAllRankList?xyz=967e1b623a8f63f569848866a45b9f10&nonce=d17c8b2e9
headers:
:method: POST
:authority: xk.newrank.cn
:scheme: https
:path: /xdnphb/nr/cloud/ks/rank/accountAllRankList?xyz=967e1b623a8f63f569848866a45b9f10&nonce=d17c8b2e9
content-length: 105
accept: application/json, text/plain, */*
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36
content-type: application/json;charset=UTF-8
origin: https://xk.newrank.cn
sec-fetch-site: same-origin
sec-fetch-mode: cors
sec-fetch-dest: empty
referer: https://xk.newrank.cn/data/
accept-encoding: gzip, deflate, br
accept-language: zh-CN,zh;q=0.9
cookie: UM_distinctid=174297e3d3c94d-08a2e378f3e7c7-31647304-fa000-174297e3d3d39
cookie: _uab_collina=159858542194830430867211
cookie: Hm_lvt_a19fd7224d30e3c8a6558dcb38c4beed=1602296580
cookie: __root_domain_v=.newrank.cn
cookie: _qddaz=QD.m5e3n6.wvazzv.kg322ho4
cookie: Hm_lvt_ab2358e695ccada3424acb6402afd2cb=1600654506,1601369103,1602224134,1602404683
cookie: Hm_lpvt_ab2358e695ccada3424acb6402afd2cb=1602404683
cookie: token=C50F88092E574BCCA85F41CA00F178EB
从url上看有两个加密参数:xyz和nonce。
从header里我们需要cookies。
这里大家有没有注意到一个问题,header里前面几行有“:method”这些带冒号的字段。这是http2协议,这玩意困扰我有好久,继续往下看,马上告诉你怎么解决
我们先来看一下,一点也不改动,重新发一次请求看一下,看是否能够请求成功。
用charles去模拟请求,是可以获取到数据的。但经过我测试xyz和nonce是有失效期的,cookie的失效期时间还是比较久的,cookies跟登录信息有关。而xyz与nonce是与请求接口有关。
接下来我们就要去模拟接口了:
python代码模拟接口请求(http2.0解决)
刚才用charles请求是没问题的,我们用python的requests库来试试:
def all_rank_list():
header = {'Content-Type': 'application/json;charset=UTF-8', 'pragma': 'no-cache', 'cache-control': 'no-cache', 'accept': 'application/json, text/plain, */*',
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36', 'origin': 'https://xk.newrank.cn',
'sec-fetch-site': 'same-origin', 'sec-fetch-mode': 'cors', 'sec-fetch-dest': 'empty', 'referer': 'https://xk.newrank.cn/data/account/rank/overall',
'accept-encoding': 'gzip, deflate, br', 'accept-language': 'zh-CN,zh;q=0.9', 'Connection': 'close', 'Content-Length': '101',
'Cookie':'UM_distinctid=174297e3d3c94d-08a2e378f3e7c7-31647304-fa000-174297e3d3d39; _uab_collina=159858542194830430867211;Hm_lvt_a19fd7224d30e3c8a6558dcb38c4beed=1602296580;__root_domain_v=.newrank.cn;_qddaz=QD.m5e3n6.wvazzv.kg322ho4;Hm_lvt_ab2358e695ccada3424acb6402afd2cb=1600654506,1601369103,1602224134,1602404683;token=C50F88092E574BCCA85F41CA00F178EB'}
#参数我已经破解了,就直接带着了,将我们抓取到的接口的xyz和nonce复制过来也是可以的
url = 'https://xk.newrank.cn/xdnphb/nr/cloud/ks/rank/accountAllRankList'
nonce_ = nonce()
url_ = url + '?AppKey=joker&nonce={}'.format(nonce_)
xyz_ = xyz(url_)
url_params = {
'xyz':xyz_,
'nonce':nonce_
}
url = '{}?{}={}&{}={}'.format(url,'xyz',url_params['xyz'],'nonce',url_params['nonce'])
post_params ={"type":"搞笑","rankDate":"2020-10-07","start":1,"size":20,"rankType":"realTime","sort":"newrankIndex"}
r = requests.post(url, data=post_params, headers=header,verify=False)
print(r.text)
这里的返回结果为:
{"msg":"内部错误","data":null,"code":5000}
这里虽然是一个小坑,但让我费了好久的时间,最后解决这个问题,让我吐血三升,直骂自己傻逼。我先卖个关子,继续看,看我怎么解决的。
遇到这个这个返回结果,第一想法就是,我的请求参数不对,哪里出了问题。
第一次尝试: 文本比对–请求头文本对比
我就不贴图了,完全设置是一样的,结果还是不行,还是这个问题。我郁闷了,懵逼一会了。难道是跟http2协议有关,跟请求头的“:method”这样的字段有关?
第二次尝试: http2协议–请求头带冒号解决”:method“。
我的请求是不带“:method”这些字段,因为python的requests包不支持http2协议请求。没辙就百度嘛!!python的确有两个包可以支持http2的请求,hyper包,但这个已经三年不更新了;还有一个包名字我忘了,它不支持代理。做爬虫,不支持代理还怎么玩啊。自闭中。。
第三次尝试: 查看该网站的发送请求的js地方,看它是带了哪些请求参数,是不是也带了“:method”这东西
看上图,没看到“:method”这鬼玩意。好吧,我想复杂了,那就是说不带也是可以的。用curl来模拟一下,看看能不能请求到数据
第四次尝试: curl模拟请求
结果:
真的是不带也是可以的,请求头里没有“:method”。
各位到了这一步基本可以确定,不是别人的问题,而是我自己的问题了。那到底是哪里出了问题了呢。。。。。。。。。抓狂中
第五次尝试: 经过痛苦地一遍遍查看短短24行代码,终于发现问题所在了。
r = requests.post(url, data=post_params, headers=header,verify=False)
就是这行的代码的问题,大家能看出问题点嘛?
它的请求头有个字段:
'Content-Type': 'application/json;charset=UTF-8'
哎,说多了都是累:改一个变量定义就可以了:
r = requests.post(url, json=post_params, headers=header,verify=False)
把data改成json就可以了。。。。。。我TM。。
data在什么使用呢?这哥们写的很好Python requests.post方法中data与json参数区别
不说了,郁闷死了。咱们继续。
下一篇文章给大家说说如何破解请求的加密参数xyz与nonce的。
此生愿为井中一蛙,不问世间繁华变迁,常怀敬畏之心,坚守心中的方寸之地