【爬虫实战入门】:轻松抓取在线音乐(仅供学习使用)

1,544 阅读8分钟

前言

在这里插入图片描述

本文章旨在利用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. 双击安装包 在这里插入图片描述
  2. 点击同意 在这里插入图片描述
  3. 选择安装路径,点击安装。 在这里插入图片描述
  4. 安装完毕后,点击关闭 在这里插入图片描述
  5. 安装完之后不会出现桌面快捷方式,找到最近安装的程序,自己添加桌面快捷方式。

1.4 Fiddler的配置

Fiddler抓取HTTPS设置

  1. 启动Fiddler,打开菜单栏中的 Tools > Telerik Fiddler Options,打开“Fiddler Options”对话框。 在这里插入图片描述
  2. 对Fiddler进行设置

打开工具栏->Tools->Fiddler Options->HTTPS, 选中Capture HTTPS CONNECTs (捕捉HTTPS连接), 选中Decrypt HTTPS traffic(解密HTTPS通信) 另外我们要用Fiddler获取本机所有进程的HTTPS请求,所以中间的下拉菜单中选中...from allprocesses (从所有进程) 选中下方Ignore server certificate errors(忽略服务器证书错误) 在这里插入图片描述

  1. 为 Fiddler 配置Windows信任这个根证书解决安全警告:Trust Root Certificate(受信任的根证书)。 在这里插入图片描述
  2. Fiddler 主菜单 Tools -> Fiddler Options…-> Connections

选中Allow remote computers to connect(允许远程连接) Act as system proxy on startup(作为系统启动代理) 在这里插入图片描述

  1. 重启Fiddler,使配置生效(这一步很重要,必须做)。

Fiddler界面 在这里插入图片描述 一、请求 (Request) 部分详解

  1. Headers —— 显示客户端发送到服务器的 HTTP 请求的 header,显示为一个分级视图,包含了 Web 客户端信息、Cookie、传输状态等。

  2. Textview —— 显示 POST 请求的 body 部分为文本。

  3. WebForms —— 显示请求的 GET 参数 和 POST body 内容。

  4. HexView —— 用十六进制数据显示请求。

  5. Auth —— 显示响应 header 中的 Proxy-Authorization(代理身份验证) 和 Authorization(授权) 信息.

  6. Raw —— 将整个请求显示为纯文本。

  7. JSON - 显示JSON格式文件。

  8. XML —— 如果请求的 body 是 XML 格式,就是用分级的 XML 树来显示它。

二、响应 (Response) 部分详解

  1. Transformer —— 显示响应的编码信息。
  2. Headers —— 用分级视图显示响应的 header。
  3. TextView —— 使用文本显示相应的 body。
  4. ImageVies —— 如果请求是图片资源,显示响应的图片。
  5. HexView —— 用十六进制数据显示响应。
  6. WebView —— 响应在 Web 浏览器中的预览效果。
  7. Auth —— 显示响应 header 中的 Proxy-Authorization(代理身份验证) 和 Authorization(授权) 信息。
  8. Caching —— 显示此请求的缓存信息。
  9. Privacy —— 显示此请求的私密 (P3P) 信息。
  10. Raw —— 将整个响应显示为纯文本。
  11. JSON - 显示JSON格式文件。
  12. 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版权IdcontentId内容IdalbumId专辑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这个文件夹里面在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 双击就可以直接执行代码了。