前言
本文章旨在利用Fiddler抓包工具爬取音乐歌曲,并将程序打包成可执行文件,只用于学习分享。
一、抓包工具
1.1 Fiddler简介
Fiddler是一款免费且功能强大的数据包抓取软件。它通过代理的方式获取程序http通讯的数据,可以用其检测网页和服务器的交互情况,能够记录所有客户端和服务器间的http请求,支持监视、设置断点、甚至修改输入输出数据等功能。fiddler包含了一个强大的基于事件脚本的子系统,并且能够使用.net框架语言扩展。
1.2 Fiddler抓取HTTPS原理
现在APP中的数据传输基本上都使用HTTS传输,传输的数据都是经过加密的,这增加了我们分析数据包的难度,还好Fiddler除了可以抓取HTTP数据包,还可以抓取HTTPS数据包。由于HTTPS传输需要使用到CA证书,所以抓取抓取HTTPS数据包时需要做一些特殊配置。Fiddler截取HTTPS报文的流程大致如下:
1.3 Fiddler的下载和安装
下载链接:www.telerik.com/download/fi…
Download Fiddler→How do you plan to use Fidder? (此处任选一个答案)
→Your email(填写你的邮箱地址) →Country(国家,此处选择China) →勾选“ I accept the Fiddler End User License Agreement” →Download For Windows(点击下载Windows系统最新版本Fidder)
- 双击安装包
- 点击同意
- 选择安装路径,点击安装。
- 安装完毕后,点击关闭
- 安装完之后不会出现桌面快捷方式,找到最近安装的程序,自己添加桌面快捷方式。
1.4 Fiddler的配置
Fiddler抓取HTTPS设置
- 启动Fiddler,打开菜单栏中的 Tools > Telerik Fiddler Options,打开“Fiddler Options”对话框。
- 对Fiddler进行设置:
打开工具栏->Tools->Fiddler Options->HTTPS,
选中Capture HTTPS CONNECTs (捕捉HTTPS连接),
选中Decrypt HTTPS traffic(解密HTTPS通信)
另外我们要用Fiddler获取本机所有进程的HTTPS请求,所以中间的下拉菜单中选中...from allprocesses (从所有进程)
选中下方Ignore server certificate errors(忽略服务器证书错误)
- 为 Fiddler 配置Windows信任这个根证书解决安全警告:Trust Root Certificate(受信任的根证书)。
- Fiddler 主菜单 Tools -> Fiddler Options…-> Connections
选中Allow remote computers to connect(允许远程连接)
Act as system proxy on startup(作为系统启动代理)
- 重启Fiddler,使配置生效(这一步很重要,必须做)。
Fiddler界面
一、请求 (Request) 部分详解
-
Headers
—— 显示客户端发送到服务器的 HTTP 请求的 header,显示为一个分级视图,包含了 Web 客户端信息、Cookie、传输状态等。 -
Textview
—— 显示 POST 请求的 body 部分为文本。 -
WebForms
—— 显示请求的 GET 参数 和 POST body 内容。 -
HexView
—— 用十六进制数据显示请求。 -
Auth
—— 显示响应 header 中的 Proxy-Authorization(代理身份验证) 和 Authorization(授权) 信息. -
Raw
—— 将整个请求显示为纯文本。 -
JSON
- 显示JSON格式文件。 -
XML
—— 如果请求的 body 是 XML 格式,就是用分级的 XML 树来显示它。
二、响应 (Response) 部分详解
Transformer
—— 显示响应的编码信息。Headers
—— 用分级视图显示响应的 header。TextView
—— 使用文本显示相应的 body。ImageVies
—— 如果请求是图片资源,显示响应的图片。HexView
—— 用十六进制数据显示响应。WebView
—— 响应在 Web 浏览器中的预览效果。Auth
—— 显示响应 header 中的 Proxy-Authorization(代理身份验证) 和 Authorization(授权) 信息。Caching
—— 显示此请求的缓存信息。Privacy
—— 显示此请求的私密 (P3P) 信息。Raw
—— 将整个响应显示为纯文本。JSON
- 显示JSON格式文件。XML
—— 如果响应的 body 是 XML 格式,就是用分级的 XML 树来显示它 。
二、爬虫需求
借助抓包工具爬取微信小程序的VIP歌曲,并将程序打包成可执行文件。实现VIP歌曲自由。
三、爬虫歌曲实战
3.1 Fiddler抓包获取搜索链接
首先要打开微信,搜索咕咪音乐小程序,打开Fiddler,可以先按住F12,取消抓包,再将不需要的链接全部删除。
在小程序中搜索歌曲,可以先搜索免费的歌曲(VIP歌曲在小程序中无法播放),获取搜索的链接。
可以看到,在我们搜索歌曲名回车后,Fiddler上的会话窗口就显示了许多链接,而其中某一调链接中的数据中有一个URL,将这个URL复制。
对于这个链接我们知道,最前面的https是这个链接的协议,后面是这个链接的域名和路径,那么,text=后面那一部分是什么呢?
那个其实是一种URL编码,我们可以在浏览器上搜索在线URL转换工具,在这段编码复制,进行解码查看其编码所代表的含义。
解码后可以看到,其结果就是我们所搜索的歌曲的名字,也就是做后面那个部分其实就是搜索关键词,用于匹配数据库中的歌曲、歌手或其他相关内容。那么我们将其URL编码部分改成我们的歌曲名其结果也是一样的。
对于这个链接,我们可以请求一下打印一下响应内容。
import requests
url1 = 'https://c.musicapp.migu.cn/v1.0/content/search_all.do?text=%E5%A5%A2%E9%A6%99%E5%A4%AB%E4%BA%BA&pageNo=1&pageSize=20&isCopyright=1&sort=1&searchSwitch=%7B%22song%22%3A1%2C%22album%22%3A0%2C%22singer%22%3A0%2C%22tagSong%22%3A1%2C%22mvSong%22%3A0%2C%22bestShow%22%3A1%7D'
res1 = requests.get(url1)
print(res1.text)
3.2 Fiddler抓包获取歌曲链接
接下来继续回到Fiddler和小程序,搜索到歌曲后,继续按F12开始抓包,选择第一个歌曲,点进去后就会播放歌曲,播放歌曲后就可以按F12停止抓包了。
将响应的内容使用文本显示,可以看到响应的内容中有一个url链接,将这个url链接复制到浏览器中就可以发现,其实这个链接就是歌曲的播放链接。
将请求的网址复制过来,进行请求。
请求后发现无法获取到响应内容,提示channel不能为空,而Fiddler中的请求部分的数据中恰好就有channel的数据。
import requests
headers = {'channel': '0140210'}
url2 = 'https://c.musicapp.migu.cn/MIGUM3.0/strategy/listen-url/v2.3?copyrightId=69938800638&contentId=600919000009782266&resourceType=2&albumId=1000024223&netType=01&toneFlag=PQ'
res2 = requests.get(url2, headers=headers)
print(res2.text)
3.3 利用正则表达式提取关键ID
将响应的内容打印出来后,我们也是看到了歌曲的播放链接,但也只是这首歌的播放链接,那如何获取其他音乐的链接呢,回顾到请求链接,仔细观察的话可以看到这个链接有几个非常关键的参数。
这三个关键的参数,通过翻译后可以得知:
copyrightId
:版权Id,contentId
:内容Id,albumId
:专辑Id
而这三个Id如何获得呢,这就是第一个请求的响应里的内容了。
直接利用正则表达式,将这三个Id给提取出来就行了。
import requests
import re
headers = {'channel': '0140210'}
song_name = input('请输入歌曲名:')
url1 = f'https://c.musicapp.migu.cn/v1.0/content/search_all.do?text={song_name}&pageNo=1&pageSize=20&isCopyright=1&sort=1&searchSwitch=%7B%22song%22%3A1%2C%22album%22%3A0%2C%22singer%22%3A0%2C%22tagSong%22%3A1%2C%22mvSong%22%3A0%2C%22bestShow%22%3A1%7D'
res1 = requests.get(url1)
copyrightId = re.findall('"copyrightId":"(.*?)",', res1.text)[0]
contentId = re.findall('"contentId":"(.*?)",', res1.text)[0]
albumId = re.findall('"albums":\[{"id":"(.*?)",', res1.text)[0]
# print(res1.text)
url2 = f'https://c.musicapp.migu.cn/MIGUM3.0/strategy/listen-url/v2.3?copyrightId={copyrightId}&contentId={contentId}&resourceType=2&albumId={albumId}&netType=01&toneFlag=PQ'
res2 = requests.get(url2, headers=headers)
print(res2.text)
3.4 正则表达式提取歌曲链接并保存
最后一步就是利用正则表达式提取歌曲的链接,请求,保存歌曲文件。当然,在保存文件时,最好新建一个文件夹,用来保存歌曲,我们可以利用os模块中的mkdir创建一个文件夹,**注意:
**在创建文件夹之前,一定要确保要创建的文件夹不存在,否则会报错。
url2 = f'https://c.musicapp.migu.cn/MIGUM3.0/strategy/listen-url/v2.3?copyrightId={copyrightId}&contentId={contentId}&resourceType=2&albumId={albumId}&netType=01&toneFlag=PQ'
res2 = requests.get(url2, headers=headers)
# print(res2.text)
song_url = re.findall('"url":"(.*?)",', res2.text)[0]
res3 = requests.get(song_url)
path = 'music'
if not os.path.exists(path):
os.mkdir(path)
with open(f'{path}/{song_name}.mp3', 'wb') as f:
f.write(res3.content)
四、完整代码
import requests
import re
import os
headers = {'channel': '0140210'}
song_name = input('请输入歌曲名:')
url1 = f'https://c.musicapp.migu.cn/v1.0/content/search_all.do?text={song_name}&pageNo=1&pageSize=20&isCopyright=1&sort=1&searchSwitch=%7B%22song%22%3A1%2C%22album%22%3A0%2C%22singer%22%3A0%2C%22tagSong%22%3A1%2C%22mvSong%22%3A0%2C%22bestShow%22%3A1%7D'
res1 = requests.get(url1)
copyrightId = re.findall('"copyrightId":"(.*?)",', res1.text)[0]
contentId = re.findall('"contentId":"(.*?)",', res1.text)[0]
albumId = re.findall('"albums":\[{"id":"(.*?)",', res1.text)[0]
# print(res1.text)
url2 = f'https://c.musicapp.migu.cn/MIGUM3.0/strategy/listen-url/v2.3?copyrightId={copyrightId}&contentId={contentId}&resourceType=2&albumId={albumId}&netType=01&toneFlag=PQ'
res2 = requests.get(url2, headers=headers)
# print(res2.text)
song_url = re.findall('"url":"(.*?)",', res2.text)[0]
res3 = requests.get(song_url)
path = 'music'
if not os.path.exists(path):
os.mkdir(path)
with open(f'{path}/{song_name}.mp3', 'wb') as f:
f.write(res3.content)
五、程序打包
打开文件资源管理器,进入到你写的Python代码,在路径处输入cmd回车。
回车后输入
pyinstaller -F -i 音乐.png 爬虫练习-VIP咕咪音乐爬取.py
,-i是打包一个图标文件,图片就是-i后面的那个音乐.png,这个图片要与代码的文件在同一个路径下面,最后就是紧跟代码文件。
回车后,如果出现successful,就说明打包成功了,在你的代码路径下会多出两个文件夹,一个是build,另一个就是dist,可执行文件就在dist这个文件夹里面。
双击就可以直接执行代码了。