当爬虫遇到js加密
当爬虫遇到js加密
我们在做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(测试)
在谷歌浏览器输入该网址之后,打开F12开发者工具,访问该链接,很容易在里面找到name为'a8ba90546fd6dc43e933a46c80d9e5df'的请求,这条请求内容就是我们想要的。
观察这条请求的url:http://lab.liumingye.cn/api/ajax/search/text/5L2g5aW9/page/1/type/qq/token/a8ba90546fd6dc43e933a46c80d9e5df,在这里面也很容易发现只有两个变化的参数[`5L2g5aW9`,`a8ba90546fd6dc43e933a46c80d9e5df`](多输入几次不一样的关键词也可以发现规律)
这两个参数肯定都和输入的关键字有关系,后面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加密,得到的新的字符串就是最后结尾的字符串了!
最终代码很简单,只要是分析它的加密方式
def get_token(base64str):
"""
获取token
:param base64str:
:return: md5的字符串类型
"""
md5 = hashlib.md5()
salt = 'tool.liumingye.cn'
code = 'text/%s/page/1/type/qq%s' % (base64str, salt)
md5.update(code.encode())
return md5.hexdigest() def get_base64(key_word):
"""
将输入的关键字转化为base64
:param key_word:
:return: base64str
"""
key_word = key_word.encode()
base64str = base64.b64encode(key_word)
base64str = base64str.decode()
return base64str def get_content(base64str, token):
url = 'http://lab.liumingye.cn/api/ajax/search/text/%s/page/1/type/qq/token/%s' % (base64str, token)
headers = {'User-Agent': 'Mozilla/5.0'}
response = requests.get(url, headers=headers).json()
return response['data']['list'] if response['code'] == 200 else None def main(key_word):
base64str = get_base64(key_word)
token = get_token(base64str)
result = get_content(base64str, token)
print(result) if __name__ == '__main__':
keyword = input("请输入想要下载的曲名>>>")
main(keyword)
当爬虫遇到js加密的更多相关文章
- Python爬虫—破解JS加密的Cookie
前言 在GitHub上维护了一个代理池的项目,代理来源是抓取一些免费的代理发布网站.上午有个小哥告诉我说有个代理抓取接口不能用了,返回状态521.抱着帮人解决问题的心态去跑了一遍代码.发现果真是这样. ...
- 爬虫05 /js加密/js逆向、常用抓包工具、移动端数据爬取
爬虫05 /js加密/js逆向.常用抓包工具.移动端数据爬取 目录 爬虫05 /js加密/js逆向.常用抓包工具.移动端数据爬取 1. js加密.js逆向:案例1 2. js加密.js逆向:案例2 3 ...
- python爬虫:了解JS加密爬取网易云音乐
python爬虫:了解JS加密爬取网易云音乐 前言 大家好,我是"持之以恒_liu",之所以起这个名字,就是希望我自己无论做什么事,只要一开始选择了,那么就要坚持到底,不管结果如何 ...
- 爬虫破解js加密(一) 有道词典js加密参数 sign破解
在爬虫过程中,经常给服务器造成压力(比如耗尽CPU,内存,带宽等),为了减少不必要的访问(比如爬虫),网页开发者就发明了反爬虫技术. 常见的反爬虫技术有封ip,user_agent,字体库,js加密, ...
- Python爬虫教程-16-破解js加密实例(有道在线翻译)
python爬虫教程-16-破解js加密实例(有道在线翻译) 在爬虫爬取网站的时候,经常遇到一些反爬虫技术,比如: 加cookie,身份验证UserAgent 图形验证,还有很难破解的滑动验证 js签 ...
- python爬虫---js加密和混淆,scrapy框架的使用.
python爬虫---js加密和混淆,scrapy框架的使用. 一丶js加密和js混淆 js加密 对js源码进行加密,从而保护js代码不被黑客窃取.(一般加密和解密的方法都在前端) http:// ...
- python爬虫爬小说网站涉及到(js加密,CSS加密)
我是对于xxxx小说网进行爬取只讲思路不展示代码请见谅 一.涉及到的反爬 js加密 css加密 请求头中的User-Agent以及 cookie 二.思路 1.对于js加密 对于有js加密信息,我们一 ...
- python爬虫-有道翻译-js加密破解
有道翻译-js加密破解 这是本地爬取的网址:http://fanyi.youdao.com/ 一.分析请求 我们在页面中输入:水果,翻译后的英文就是:fruit.请求携带的参数有很多,先将参数数据保存 ...
- Python 爬虫js加密破解(四) 360云盘登录password加密
登录链接:https://yunpan.360.cn/mindex/login 这是一个md5 加密算法,直接使用 md5加密即可实现 本文讲解的是如何抠出js,运行代码 第一部:抓包 如图 第二步: ...
随机推荐
- zabbix3.4.7安装在centos 7.4上
Centos 7.4 安装Zabbix 3.4 一.安装环境 1 [root@juny-18 ~]# cat /etc/redhat-release 2 3 CentOS Linux release ...
- POJ 1458 最长公共子序列(dp)
POJ 1458 最长公共子序列 题目大意:给出两个字符串,求出这样的一 个最长的公共子序列的长度:子序列 中的每个字符都能在两个原串中找到, 而且每个字符的先后顺序和原串中的 先后顺序一致. Sam ...
- java 数据溢出和编译错误的差别
int a=100000000000;编译错误,超出int范围 int a=2100000000; int b=a*12020200;数据溢出,a并未溢出,但b在通过a计算后的数据溢出 long e= ...
- U帮忙U盘启动盘制作
第一步:制作U盘启动盘前的软.硬件准备 1.准备一个U盘或内存卡(尽量使用2G以上的) 2.进入 U帮忙官网 下载最新版U盘启动盘制作工具! 3.搜索并下载ghost版系统文件存放到电脑中. 第二步: ...
- HashMap实现原理分析--面试详谈
1. HashMap的数据结构 数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端. 数组 数组存储区间是连续的,占用内存严重,故空间复杂的很大.但数组的二分查找时间复杂度小,为O(1 ...
- 源码学习:一个express().get方法的加载与调用
刚刚接触express,它的中间件确实把我搞得头晕.get的回调中要不要加next?不加载还会执行下一个中间件么?给get指定'/'路径是不是所有以'/'开头的访问在没有确切匹配时都能执行?use件又 ...
- VS2010编译Unigine_2010源码
VS2010编译Unigine_2010源码[Debug版本] 1.Laucher工程属性改为控制台项目 2.Unigine工程编译时的Warnning LNK2019 a.属性--常规-目标文件名改 ...
- jvm内存配置参数
请看下面题目: 对于jvm内存配置参数: -Xmx10240m -Xms10240m -Xmn5120m -XXSurvivorRatio=3 其最小内存值和Survior区总大小分别是: a. 51 ...
- <Spark><Advanced Programming>
Introduction 介绍两种共享变量的方式: accumulators:聚集信息 broadcast variables:高效地分布large values 介绍对高setup costs任务的 ...
- shell脚本-实战防dos攻击
根据web日志或者或者网络连接数,监控当某个IP并发连接数或者短时内PV达到100,即调用防火墙命令封掉对应的IP,监控频率每隔3分钟.防火墙命令为:iptables -I INPUT -s 10.0 ...