我们在做python爬虫的时候经常会遇到许多的反爬措施,js加密就是其中一种。

破解js加密的方法也有很多种:

1.直接驱动浏览器抓取数据,无视js加密。

2.找到本地加密的js代码,使用python的相关库直接运行js代码。

3.找到本地加密的js代码,理清加密逻辑,然后用python代码来模仿js代码ƒ的流程,生成我们想要的加密的数据。

这里我们简单介绍一下第三种,也是最难的一种。

目标网站:http://tool.liumingye.cn/music/?type=qq&name=%E4%BD%A0%E5%A5%BD(测试)
在谷歌浏览器输入该网址之后,打开开发者工具,访问该链接,很容易在里面找到name'a8ba90546fd6dc43e933a46c80d9e5df'的请求,这条请求内容就是我们想要的。

观察这条请求的url:http://lab.liumingye.cn/api/ajax/search/text/5L2g5aW9/page/1/type/qq/token/a8ba90546fd6dc43e933a46c80d9e5df,在这里面也很容易发现只有两个变化的参数5L2g5aW9a8ba90546fd6dc43e933a46c80d9e5df

这两个参数肯定都和输入的关键字有关系,后面32位的字符串猜测是md5生成的(md5加密生成的字符串是32位),因为md5加密不可逆,所以网站后台也无法通过该字符串来获取用户输入的关键字。所以我们猜测第一个变化的字符串就是由关键字直接加密变化来的,而且是可逆的。

可逆的加密方式第一个想到的就是利用base64加密,自己试了下,果然这个字符串就是通过base64生成的。
因为md5不可逆,所以必须找到它是如何生成的。复制这个字符串在前面请求中的返回值中查找,结果找不到。这时可以判定该字符串不是由服务器返回,而是本地通过js生成的,我们只用找到加密的js代码就可以了。
正常的访问网站只会加载两个js脚本,一个是空的,另一个名为:localstorage.js?v=20190301,查看这个请求的响应,里面有串whir.res.loadJs("main", "https://lmy.nos-eastchina1.126.net/music/js/main.js?v=20190301", "20190301"),复制这条代码里面的链接,会自动下载这个js脚本(谷歌浏览器)

下载完成后打开,刚才我们猜测该字符串是通过md5生成的,所以我们直接ctrl+f搜索’md5’,搜索完成之后会出现两个匹配的结果,第一个是一个函数的形式,第二个出现在字符串中,很显然我们要的是第一个,包裹这条函数的完整行代码是:'url':_0x940f42[_0x2699('0x43f', '(0%N')](_0x940f42[_0x2699('0x440', '94!y')](_0xd3b949 + _0x940f42['xrghN'], _0x36a191) + _0x2699('0x441', 'hn#I'), md5(_0x36a191 + _0x940f42['tFjdt']))

很显然这段代码做了一定的处理,我们无法直接得知这里面是什么内容。我们先从md5括号里面的找起,复制'_0x36a191'到完整的js代码里面查找,然后会找打一段比较长的代码:

_0x36a191 = _0x940f42['BMdWK'](_0x940f42['BMdWK'](_0x940f42['jTMsB'](_0x940f42[_0x2699('0x4c0', '94!y')](_0x2699('0x4c1', 'S]7#') + window[_0x2699('0x4c2', '7l)O')](utf8[_0x2699('0x4c3', 'hn#I')](_0x581614))[_0x2699('0x4c4', 'Kj]n')](/\//g, '*'), _0x2699('0x4c5', '%L%W')), _0x44fdca), '/type/'), _0x5ebc3e);,这个看上去还要继续分析,我们暂时不管它。

第二个要找的就是_0x940f42['tFjdt'],先复制tFjdt到js代码里面查找,然后会发现_0x940f42['tFjdt'] = _0x2699('0x437', 'gKGX')
接着在继续找下去会有点麻烦,我们直接打开刚才访问的链接,打开Console,复制_0x2699('0x437', 'gKGX')到控制台回车,结果给我们返回了一个"tool.liumingye.cn"的字符串。最后我们得知_0x940f42['tFjdt'] == "tool.liumingye.cn",然后再按这种方式查找别的,以此类推。

最后我们会发现之前的

'url':_0x940f42[_0x2699('0x43f', '(0%N')](_0x940f42[_0x2699('0x440', '94!y')](_0xd3b949 + _0x940f42['xrghN'], _0x36a191) + _0x2699('0x441', 'hn#I'), md5(_0x36a191 + _0x940f42['tFjdt']))

变成了

'url': http://lab.liumingye.cn/api/ + ajax/search/ + _0x36a191 + /token/, md5(0x36a191 + tool.liumingye.cn)

而我们分析的链接为

`http://lab.liumingye.cn/api/ ajax/search/ text/5L2g5aW9/page/1/type/qq /token/ a8ba90546fd6dc43e933a46c80d9e5df

两链接一减,很容易的出_0x36a191 = text/5L2g5aW9/page/1/type/qq, md5(0x36a191 + tool.liumingye.cn) = a8ba90546fd6dc43e933a46c80d9e5df

最后我们把_0x36a191'tool.liumingye.cn' 相加,然后把得到的新的字符串通过md5加密,得到的新的字符串就是最后结尾的字符串了!
最终代码很简单,只要是分析它的加密方式

 1 def get_token(base64str):2     """3     获取token4     :param base64str:5     :return: md5的字符串类型6     """7     md5 = hashlib.md5()8     salt = 'tool.liumingye.cn'9     code = 'text/%s/page/1/type/qq%s' % (base64str, salt)
10     md5.update(code.encode())
11     return md5.hexdigest()
12
13
14 def get_base64(key_word):
15     """
16     将输入的关键字转化为base64
17     :param key_word:
18     :return: base64str
19     """
20     key_word = key_word.encode()
21     base64str = base64.b64encode(key_word)
22     base64str = base64str.decode()
23     return base64str
24
25
26 def get_content(base64str, token):
27     url = 'http://lab.liumingye.cn/api/ajax/search/text/%s/page/1/type/qq/token/%s' % (base64str, token)
28     headers = {'User-Agent': 'Mozilla/5.0'}
29     response = requests.get(url, headers=headers).json()
30     return response['data']['list'] if response['code'] == 200 else None
31
32
33
34 def main(key_word):
35     base64str = get_base64(key_word)
36     token = get_token(base64str)
37     result = get_content(base64str, token)
38     print(result)
39
40
41 if __name__ == '__main__':
42     keyword = input("请输入想要下载的曲名>>>")
43     main(keyword)```

当Python爬虫遇到JS加密相关推荐

  1. Python爬虫之js加密破解,抓取网易云音乐评论生成词云

    js破解历程 前言 技能点 界面概况 静态网页动态网页 页面解析 step1: 找参数step2:分析js函数step3:分析参数step4: 校验step5:转为python代码 编写爬虫 很多人学 ...

  2. python爬虫--破解js加密:kankan登录破解

    这一系列文章旨在解决python 爬虫过程中遇到的各种反爬,从简单到复制,是个进阶的过程.如果对你有帮助,欢迎关注. 今天要破解的网站是天天看看(http://www.kankan.com/)的登录, ...

  3. python爬虫遇到js加密,python爬虫遇到JS加密,pyv8运行js,详细解密过程

    首先说一下什么是加密,所谓js加密大多出现在表单提交过程中,下面我将以中国电信为例,详细讲解如何利用pyv8来加密登录的密码.要说明的是pyv8目前仅仅支持python2,用的下伙伴要注意自己的pyt ...

  4. python爬虫遇到js加密_当爬虫遇到js加密

    目标网站:http://tool.liumingye.cn/music/?type=qq&name=%E4%BD%A0%E5%A5%BD(测试) 在谷歌浏览器输入该网址之后,打开F12开发者工 ...

  5. python爬虫 破解js加密有道词典案列的两种方式以及思路总结

    代码在后面 思路1总结 抓包找到这四个加密参数 'salt': salt, 'sign': sign, 'ts': ts, 'bv': bv, 得到四个值(涉及到js中 MD5, 时间戳. 随机数等) ...

  6. Python爬虫:js加密实例-有道翻译

    此项目,参考别人的教程,自己摸索了一下,将结果展示出来,以供后人参考 实现功能: 通过requests请求有道翻译的接口,返回翻译结果,并封装成函数使用 有道翻译地址:http://fanyi.you ...

  7. 网易云音乐python爬虫(Js破解)

    网易云音乐下载python爬虫(Js破解) 最近做了一个网易云音乐下载的python爬虫,功能就是输入歌曲的名字,程序自动下载网易音乐搜索界面的第一首歌(一般都是原唱排第一位).本文很适合小白学习,写 ...

  8. Python爬虫之Js逆向案例(2)-某乎搜索

    Python爬虫之Js逆向案例(2)-知乎搜索 声明:某乎加密逆向分析仅用于研究和学习 大家好,今天继续分享关于某乎关键词搜索接口为案例的Js逆向实战.如果你是一名新手,而且还没有来得及看上一篇< ...

  9. Python爬虫之Js逆向案例(6)-某道翻译

    Python爬虫之Js逆向案例(6)-有道翻译 声明:某道翻译加密逆向分析仅用于研究和学习,如有侵权,可联系删除 大家好,距离上次分享js逆向案例已经有一个月了,在这期间每次在快要揭秘出来时.整理文章 ...

最新文章

  1. python监控数据库_【Python】NavicatPre查询日志监控并转存数据库
  2. Xamarin ios C#苹果应用开发第二讲配置环境和编写代码
  3. 基于Spring Cloud实现微服务前后端系统
  4. Angular 应用里的 vendor.js 是用来干什么的?
  5. 基于Token的身份验证——JWT
  6. OpenShift 4 之 GitOps(7)用ArgoCD部署Pacman应用集群
  7. 知识图谱盛会再度开启!洞悉KG的前沿技术与最新实践探索!!
  8. 小tips:善用页面的base类
  9. Webpack 实现 Tree shaking 的前世今生
  10. ethtool工具设置网口配置
  11. 无人车之美——双舵轮运动分解与合成
  12. 软件构造第一次实验感想总结
  13. 一步步用python制作游戏外挂
  14. Java使用当前日期加四位数实现每日自增单号工具类
  15. MySQL教程——2 中级篇(索引、视图、存储过程)
  16. 项目支付接入支付宝【沙箱环境】
  17. bert 环境搭建之PytorchTransformer 安装
  18. java周报_java学习28天2020/8/2 周报
  19. win7删除计算机 网络连接,win7系统怎么删除多余的本地连接【图文】
  20. tp5 日期范围查询_tp5(thinkPHP5框架)时间查询操作实例分析,tp5thinkphp5

热门文章

  1. postgresql.conf syslog_ident
  2. qemu-2.0.0 rpm编译及使用
  3. 四十五个微观粒子的量子计算机,量子产品大火!量子产品系虚假宣传?
  4. asp.net房屋装修公司业务管理系统
  5. H5游戏引擎Layabox融资成功,A轮进帐1亿!
  6. 【clickhouse 按时间查询】
  7. |转帖| 执着的意义!
  8. 我的世界方块云服务器bug,我的世界当中神奇的bug,你见过哪些?
  9. Kettle: 数据库查询/数据库连接
  10. 技术开发合同免税政策