一次Python爬取听力mp3过程的简析
本帖最后由 三滑稽甲苯 于 2021-8-1 17:43 编辑# 起因
lz马上就要上大学了,老师建议我学点英语,争取在开学考取得好成绩,分到更好的班级进行教学。于是,买了本英语四级真题,准备练习听力。准备下载时,发现打包下载和单独下载音频都要登录或下载app...这怎么能忍?
# 过程
## 目录页面的分析
### 法一
进入[网址](https://mp.xdfsjj.com/qr.html?crcode=120DLY6G16F),老办法F12,发现没有链接,感觉有点棘手了
但是,我怎么能放弃呢?仔细观察点开的播放音频的链接
```
/share/audio.htm?rid=29822410&sign=82e981&bid=124114&cid=22859080
/share/audio.htm?rid=29822413&sign=7ca709&bid=124114&cid=22859080
/share/audio.htm?rid=29822412&sign=bd5fe8&bid=124114&cid=22859080
```
不难发现,出了rid与sign外,其他的值是不变的
那么就在源码里搜索吧
往下翻,马上找到了可疑部分
这里有所有书的播放网址,不难发现resId对应rid, resIdSign对应sign
把数据复制下来,`true`改为`True`以防报错,丢到代码里
正则匹配,问题解决~
```
match = search(r'resId=(\d+)&resIdSign=(.*)&mediaType=3', item['content'])
```
### 法二
在写这篇文章的时候,发现在各个div里就有信息
其中rs-id对应rid, sign就是sign
具体方法不展开,因为~~懒~~法一更简单
## 音频页面的分析
这个比较简单
随便打开一个播放页面,查看源代码,搜索`.mp3`
局势明朗啊~
直接用正则匹配即可
```
src = search(r'<audio id="audio_media" height="0" width="0" preload="auto" src="(https://ali-media\.xdfsjj\.com/.*\.mp3)"></audio>', html).groups()
```
## 代码整合
```
from requests import Session # Session保持连接,加快下载速度
from re import search # 导入正则匹配函数
items = [ # 丢进来的数据,已格式化,为了控制篇幅仅列举一项
{
"bookId": 124114,
"bookName": "(21下)大学英语四级考试超详解真题+模拟",
"canDown": True,
"canShare": True,
"content": "/resourceservice/mediaplay.do?resId=29822410&resIdSign=82e981&mediaType=3",
"createUser": 7345927,
"dirId": 29822409,
"downUrl": "/resourceservice/mediaplay.do?resId=29822410&resIdSign=82e981&mediaType=3", # resId: rid, resIdSign: sign
"fkId": 3002989,
"gmtCreate": 1625205456000,
"gmtModified": 1625205542000,
"id": 29822410,
"idSign": "82e981",
"isDelete": 0,
"length": 18219091,
"mediaType": 3,
"pcrId": 22859080,
"pcrName": "真题听力音频",
"pv": 323,
"status": 1,
"thumbnails": "https://cdnqn-user.xdfsjj.com/7345927_352468E47886D235F25FD74A22E5B3FC.png?fix=no&imageView2/0/w/312/h/462",
"times": 1518,
"title": "2019年12月四级真题(第一套)",
"type": 2,
"viewCount": 323
}
]
x = Session() # 实例化Session
for item in items: # 遍历items里的数据
name = item['title'] # 标题
match = search(r'resId=(\d+)&resIdSign=(.*)&mediaType=3', item['content']) # 正则匹配rid与sign
rid, sign = match.groups() # 赋值rid与sign
html = x.get(f'https://mp.xdfsjj.com/share/audio.htm?bid=124114&cid=22859080&rid={rid}&sign={sign}').text # 拼接并访问音频播放页网址
src = search(r'<audio id="audio_media" height="0" width="0" preload="auto" src="(https://ali-media\.xdfsjj\.com/.*\.mp3)"></audio>', html).groups() # 正则匹配mp3直链
print(name, src) # 输出相关信息,提示下载进度
with open(f'mp3/{name}.mp3', 'wb') as f: # 在`/mp3`目录下写入音频
f.write(x.get(src).content)
```
# 效果
人云亦云yi 发表于 2021-8-2 01:49
学习了
说了那么多,F12后,链接本来就有对吗
不是,索引页面上的链接与需要的链接不完全相同,但是其中的参数可以利用;mp3播放页面上确实有直链 非常牛啊 值得借鉴的好思路
值得借鉴的好思路 这个是有为青年啊! 学习。。。 学习一下:lol 学习学习 感谢楼主,对于准备四六级的我来说太有用l
页:
[1]
2