Python爬虫JS逆向案例教学,看看千元以上的外包都是怎么样的(附源码)

2023-11-05 07:50

本文主要是介绍Python爬虫JS逆向案例教学,看看千元以上的外包都是怎么样的(附源码),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

知识点:

  • requests
  • execjs

第三方库:

  • requests >>> pip install requests
  • execjs >>> pip install PyExecJS

开发环境:

  • 版 本:anaconda5.2.0(python3.6.5)
  • 编辑器:pycharm

【付费VIP完整版】只要看了就能学会的教程,80集Python基础入门视频教学

点这里即可免费在线观看

分析,单首歌曲所在的链接、加密的规则

选定目标


先点击动态加载,然后在点击播放按钮

先使用检索工具,复制歌曲ID,在检索工具里搜索,最后找到歌曲的数据包

在这里插入图片描述
找到加密之后的数据,复制encSecKey到检索工具里查找


找到数据包后,右键点击Open in Sources panel


分析数据,复制代码

运行后得到加密参数

开始写代码

第一个解密

import requests  # 发送网络请求
import execjs  # 调用js代码的模块url = 'https://music.163.com/weapi/song/enhance/player/url/v1?csrf_token=f3cb47b2b44afb5c7d5b267cc60766cb'js = open('demo.js', 'r', encoding='utf-8').read()ctx = execjs.compile(js)# 调用js里面的函数 (第一个是函数名, 参数)result = ctx.call('start', song_id)data = {'params': result['encText'],'encSecKey': result['encSecKey']}headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36',# 用户信息标识'cookie': '_iuqxldmzr_=32; _ntes_nnid=ebf3d77c667fa506d26f9ddb18340c1a,1631792204854; _ntes_nuid=ebf3d77c667fa506d26f9ddb18340c1a; NMTID=00OR9oja7jRdVKsdkWjsSkzfpe6kDoAAAF77mUMdg; WNMCID=xzerkz.1631792205013.01.0; WEVNSM=1.0.0; WM_NI=vBQ2%2Bw17HytDYS1GI3g7DkT7VTr%2B4EXODB%2F33ynkt8Lb7U7Q8x8H6wR%2BOmpKo2yVbM5u9jad1RshFBs0VYnhDdMY6YnieHA%2FXZUX9B0lfGL7deJ0g5xFtC36hy1cLdVJUGs%3D; WM_NIKE=9ca17ae2e6ffcda170e2e6ee82b766aa92b998f05a92b88ab6c84a869f8a84f43af5edfbb0d769989aa7b0c22af0fea7c3b92ab69e9fd3aa7df3e9889af7509b8dffa8cc39a5e98c8cd73d968cbeccb74f9c918ca3ae39f1a7a28cf73490bef9b6b65bfca8f8a9b57d92f5818ef341adeeb7b7e147f7abf78be470f38ebd89c54ab1f09abaed6488bc83bab553aeb7aba9c4259c869bb9bc4af4b4aaa8cf3da8bb86d1e63fbc9abca4b23eaca7ff84cf7096969ba8f237e2a3; WM_TID=GAgBwBSskVpAURVAEAZ73v38OSZWFyaG; __csrf=f3cb47b2b44afb5c7d5b267cc60766cb; MUSIC_U=ef63db2826f2c58d750719abd63a4be1b03d88b788d670ba6fcb33633b202b19993166e004087dd3d78b6050a17a35e705925a4e6992f61dfe3f0151024f9e31; ntes_kaola_ad=1; JSESSIONID-WYYY=RkN1BuKQuGb4%5Csy%5CWRrXIDVpjajXMbdGrsnKDqT%5C9vS2wSxduz%2BcCS4ezpW0%5CCjs3zUBgSUyFA25V1qwv2nYxP%2BzmcKema2fyYpNfdnlpvbkAg%2FcC%2F8giulOPCM4kby5P1u4Xw%2BMXRViAaA4jxtFszXxwSK6MFddUGNo8%2B4dXnFm2NnJ%3A1631797886961; playerid=74269792'}

第二个解密

js = open('demo.js', 'r', encoding='utf-8').read()
ctx = execjs.compile(js)
# 调用js里面的函数 (第一个是函数名, 参数)
result = ctx.call('main', input('请输入你想要下载的歌曲名称/歌手名称:'))
data = {'params': result['encText'],'encSecKey': result['encSecKey']
}
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36',# 用户信息标识'cookie': '_iuqxldmzr_=32; _ntes_nnid=ebf3d77c667fa506d26f9ddb18340c1a,1631792204854; _ntes_nuid=ebf3d77c667fa506d26f9ddb18340c1a; NMTID=00OR9oja7jRdVKsdkWjsSkzfpe6kDoAAAF77mUMdg; WNMCID=xzerkz.1631792205013.01.0; WEVNSM=1.0.0; WM_NI=vBQ2%2Bw17HytDYS1GI3g7DkT7VTr%2B4EXODB%2F33ynkt8Lb7U7Q8x8H6wR%2BOmpKo2yVbM5u9jad1RshFBs0VYnhDdMY6YnieHA%2FXZUX9B0lfGL7deJ0g5xFtC36hy1cLdVJUGs%3D; WM_NIKE=9ca17ae2e6ffcda170e2e6ee82b766aa92b998f05a92b88ab6c84a869f8a84f43af5edfbb0d769989aa7b0c22af0fea7c3b92ab69e9fd3aa7df3e9889af7509b8dffa8cc39a5e98c8cd73d968cbeccb74f9c918ca3ae39f1a7a28cf73490bef9b6b65bfca8f8a9b57d92f5818ef341adeeb7b7e147f7abf78be470f38ebd89c54ab1f09abaed6488bc83bab553aeb7aba9c4259c869bb9bc4af4b4aaa8cf3da8bb86d1e63fbc9abca4b23eaca7ff84cf7096969ba8f237e2a3; WM_TID=GAgBwBSskVpAURVAEAZ73v38OSZWFyaG; __csrf=f3cb47b2b44afb5c7d5b267cc60766cb; MUSIC_U=ef63db2826f2c58d750719abd63a4be1b03d88b788d670ba6fcb33633b202b19993166e004087dd3d78b6050a17a35e705925a4e6992f61dfe3f0151024f9e31; ntes_kaola_ad=1; JSESSIONID-WYYY=RkN1BuKQuGb4%5Csy%5CWRrXIDVpjajXMbdGrsnKDqT%5C9vS2wSxduz%2BcCS4ezpW0%5CCjs3zUBgSUyFA25V1qwv2nYxP%2BzmcKema2fyYpNfdnlpvbkAg%2FcC%2F8giulOPCM4kby5P1u4Xw%2BMXRViAaA4jxtFszXxwSK6MFddUGNo8%2B4dXnFm2NnJ%3A1631797886961; playerid=74269792'
}
url = 'https://music.163.com/weapi/cloudsearch/get/web?csrf_token='

提取数据

songs = requests.post(url, data=data, headers=headers).json()['result']['songs']
for song in songs:song_name = song['name']    # 歌曲名称song_id = song['id']        # 歌曲idsinger_name = song['ar'][0]['name'] # 歌手名称

拿到每一首歌的url地址

mp3_url = requests.post(url, data=data, headers=headers).json()['data'][0]['url']

依次请求 歌曲 url

# 音频 图片 视频  二进制数据
mp3_data = requests.get(mp3_url, headers=headers).content

保存数据

with open(f'mp3/{song_name}-{singer_name}.mp3', mode='wb') as f:f.write(mp3_data)
print(f'{song_name}-{singer_name}爬取成功!!!')

完整代码

import requests  # 发送网络请求
import execjs  # 调用js代码的模块js = open('demo.js', 'r', encoding='utf-8').read()
ctx = execjs.compile(js)
# 调用js里面的函数 (第一个是函数名, 参数)
result = ctx.call('main', input('请输入你想要下载的歌曲名称/歌手名称:'))
data = {'params': result['encText'],'encSecKey': result['encSecKey']
}
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36',# 用户信息标识'cookie': '_iuqxldmzr_=32; _ntes_nnid=ebf3d77c667fa506d26f9ddb18340c1a,1631792204854; _ntes_nuid=ebf3d77c667fa506d26f9ddb18340c1a; NMTID=00OR9oja7jRdVKsdkWjsSkzfpe6kDoAAAF77mUMdg; WNMCID=xzerkz.1631792205013.01.0; WEVNSM=1.0.0; WM_NI=vBQ2%2Bw17HytDYS1GI3g7DkT7VTr%2B4EXODB%2F33ynkt8Lb7U7Q8x8H6wR%2BOmpKo2yVbM5u9jad1RshFBs0VYnhDdMY6YnieHA%2FXZUX9B0lfGL7deJ0g5xFtC36hy1cLdVJUGs%3D; WM_NIKE=9ca17ae2e6ffcda170e2e6ee82b766aa92b998f05a92b88ab6c84a869f8a84f43af5edfbb0d769989aa7b0c22af0fea7c3b92ab69e9fd3aa7df3e9889af7509b8dffa8cc39a5e98c8cd73d968cbeccb74f9c918ca3ae39f1a7a28cf73490bef9b6b65bfca8f8a9b57d92f5818ef341adeeb7b7e147f7abf78be470f38ebd89c54ab1f09abaed6488bc83bab553aeb7aba9c4259c869bb9bc4af4b4aaa8cf3da8bb86d1e63fbc9abca4b23eaca7ff84cf7096969ba8f237e2a3; WM_TID=GAgBwBSskVpAURVAEAZ73v38OSZWFyaG; __csrf=f3cb47b2b44afb5c7d5b267cc60766cb; MUSIC_U=ef63db2826f2c58d750719abd63a4be1b03d88b788d670ba6fcb33633b202b19993166e004087dd3d78b6050a17a35e705925a4e6992f61dfe3f0151024f9e31; ntes_kaola_ad=1; JSESSIONID-WYYY=RkN1BuKQuGb4%5Csy%5CWRrXIDVpjajXMbdGrsnKDqT%5C9vS2wSxduz%2BcCS4ezpW0%5CCjs3zUBgSUyFA25V1qwv2nYxP%2BzmcKema2fyYpNfdnlpvbkAg%2FcC%2F8giulOPCM4kby5P1u4Xw%2BMXRViAaA4jxtFszXxwSK6MFddUGNo8%2B4dXnFm2NnJ%3A1631797886961; playerid=74269792'
}
url = 'https://music.163.com/weapi/cloudsearch/get/web?csrf_token='
songs = requests.post(url, data=data, headers=headers).json()['result']['songs']
for song in songs:song_name = song['name']    # 歌曲名称song_id = song['id']        # 歌曲idsinger_name = song['ar'][0]['name'] # 歌手名称url = 'https://music.163.com/weapi/song/enhance/player/url/v1?csrf_token=f3cb47b2b44afb5c7d5b267cc60766cb'js = open('demo.js', 'r', encoding='utf-8').read()ctx = execjs.compile(js)# 调用js里面的函数 (第一个是函数名, 参数)result = ctx.call('start', song_id)data = {'params': result['encText'],'encSecKey': result['encSecKey']}headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36',# 用户信息标识'cookie': '_iuqxldmzr_=32; _ntes_nnid=ebf3d77c667fa506d26f9ddb18340c1a,1631792204854; _ntes_nuid=ebf3d77c667fa506d26f9ddb18340c1a; NMTID=00OR9oja7jRdVKsdkWjsSkzfpe6kDoAAAF77mUMdg; WNMCID=xzerkz.1631792205013.01.0; WEVNSM=1.0.0; WM_NI=vBQ2%2Bw17HytDYS1GI3g7DkT7VTr%2B4EXODB%2F33ynkt8Lb7U7Q8x8H6wR%2BOmpKo2yVbM5u9jad1RshFBs0VYnhDdMY6YnieHA%2FXZUX9B0lfGL7deJ0g5xFtC36hy1cLdVJUGs%3D; WM_NIKE=9ca17ae2e6ffcda170e2e6ee82b766aa92b998f05a92b88ab6c84a869f8a84f43af5edfbb0d769989aa7b0c22af0fea7c3b92ab69e9fd3aa7df3e9889af7509b8dffa8cc39a5e98c8cd73d968cbeccb74f9c918ca3ae39f1a7a28cf73490bef9b6b65bfca8f8a9b57d92f5818ef341adeeb7b7e147f7abf78be470f38ebd89c54ab1f09abaed6488bc83bab553aeb7aba9c4259c869bb9bc4af4b4aaa8cf3da8bb86d1e63fbc9abca4b23eaca7ff84cf7096969ba8f237e2a3; WM_TID=GAgBwBSskVpAURVAEAZ73v38OSZWFyaG; __csrf=f3cb47b2b44afb5c7d5b267cc60766cb; MUSIC_U=ef63db2826f2c58d750719abd63a4be1b03d88b788d670ba6fcb33633b202b19993166e004087dd3d78b6050a17a35e705925a4e6992f61dfe3f0151024f9e31; ntes_kaola_ad=1; JSESSIONID-WYYY=RkN1BuKQuGb4%5Csy%5CWRrXIDVpjajXMbdGrsnKDqT%5C9vS2wSxduz%2BcCS4ezpW0%5CCjs3zUBgSUyFA25V1qwv2nYxP%2BzmcKema2fyYpNfdnlpvbkAg%2FcC%2F8giulOPCM4kby5P1u4Xw%2BMXRViAaA4jxtFszXxwSK6MFddUGNo8%2B4dXnFm2NnJ%3A1631797886961; playerid=74269792'}# 如果你买了这首歌 有这首歌的权限 那么就可以下载# 拿到每一首歌的url地址mp3_url = requests.post(url, data=data, headers=headers).json()['data'][0]['url']# 依次请求 歌曲 url# .content: 拿到网页当中的 二进制数据# 音频 图片 视频  二进制数据mp3_data = requests.get(mp3_url, headers=headers).content# 保存with open(f'mp3/{song_name}-{singer_name}.mp3', mode='wb') as f:f.write(mp3_data)print(f'{song_name}-{singer_name}爬取成功!!!')

对于本篇文章有疑问的同学也可以点这里

这篇关于Python爬虫JS逆向案例教学,看看千元以上的外包都是怎么样的(附源码)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/348442

相关文章

Python脚本实现自动删除C盘临时文件夹

《Python脚本实现自动删除C盘临时文件夹》在日常使用电脑的过程中,临时文件夹往往会积累大量的无用数据,占用宝贵的磁盘空间,下面我们就来看看Python如何通过脚本实现自动删除C盘临时文件夹吧... 目录一、准备工作二、python脚本编写三、脚本解析四、运行脚本五、案例演示六、注意事项七、总结在日常使用

Python将大量遥感数据的值缩放指定倍数的方法(推荐)

《Python将大量遥感数据的值缩放指定倍数的方法(推荐)》本文介绍基于Python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处理,并将所得处理后数据保存为新的遥感影像... 本文介绍基于python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处

python管理工具之conda安装部署及使用详解

《python管理工具之conda安装部署及使用详解》这篇文章详细介绍了如何安装和使用conda来管理Python环境,它涵盖了从安装部署、镜像源配置到具体的conda使用方法,包括创建、激活、安装包... 目录pytpshheraerUhon管理工具:conda部署+使用一、安装部署1、 下载2、 安装3

Python进阶之Excel基本操作介绍

《Python进阶之Excel基本操作介绍》在现实中,很多工作都需要与数据打交道,Excel作为常用的数据处理工具,一直备受人们的青睐,本文主要为大家介绍了一些Python中Excel的基本操作,希望... 目录概述写入使用 xlwt使用 XlsxWriter读取修改概述在现实中,很多工作都需要与数据打交

使用Python实现在Word中添加或删除超链接

《使用Python实现在Word中添加或删除超链接》在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能,本文将为大家介绍一下Python如何实现在Word中添加或... 在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能。通过添加超

Golang操作DuckDB实战案例分享

《Golang操作DuckDB实战案例分享》DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性... 目录DuckDB的主要优点环境准备初始化表和数据查询单行或多行错误处理和事务完整代码最后总结Duck

Python MySQL如何通过Binlog获取变更记录恢复数据

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录... 目录python mysql通过Binlog获取变更记录恢复数据1.安装pymysqlreplicat

利用Python编写一个简单的聊天机器人

《利用Python编写一个简单的聊天机器人》这篇文章主要为大家详细介绍了如何利用Python编写一个简单的聊天机器人,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 使用 python 编写一个简单的聊天机器人可以从最基础的逻辑开始,然后逐步加入更复杂的功能。这里我们将先实现一个简单的

基于Python开发电脑定时关机工具

《基于Python开发电脑定时关机工具》这篇文章主要为大家详细介绍了如何基于Python开发一个电脑定时关机工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 简介2. 运行效果3. 相关源码1. 简介这个程序就像一个“忠实的管家”,帮你按时关掉电脑,而且全程不需要你多做

Python实现高效地读写大型文件

《Python实现高效地读写大型文件》Python如何读写的是大型文件,有没有什么方法来提高效率呢,这篇文章就来和大家聊聊如何在Python中高效地读写大型文件,需要的可以了解下... 目录一、逐行读取大型文件二、分块读取大型文件三、使用 mmap 模块进行内存映射文件操作(适用于大文件)四、使用 pand