三滑稽甲苯 发表于 2021-8-1 17:37

一次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)
```
# 效果

三滑稽甲苯 发表于 2021-8-2 06:58

人云亦云yi 发表于 2021-8-2 01:49
学习了
说了那么多,F12后,链接本来就有对吗
不是,索引页面上的链接与需要的链接不完全相同,但是其中的参数可以利用;mp3播放页面上确实有直链

Aven 发表于 2021-8-1 18:04

非常牛啊

白衣国度 发表于 2021-8-1 18:11

值得借鉴的好思路

18208900096 发表于 2021-8-1 18:30


值得借鉴的好思路

skywalk1979 发表于 2021-8-1 18:46

这个是有为青年啊!

studentguo 发表于 2021-8-1 19:07

学习。。。

neverrabbit 发表于 2021-8-1 19:55

学习一下:lol

Milu79 发表于 2021-8-1 20:43

学习学习

yxn4065 发表于 2021-8-1 20:46

感谢楼主,对于准备四六级的我来说太有用l

去你的吧 发表于 2021-8-1 21:23

页: [1] 2
查看完整版本: 一次Python爬取听力mp3过程的简析