相信训练模型时数据集的获取也是一个很头疼的事情,搞cv领域的可以扛着摄像头架起三脚架拍摄获取(以前干过),但是如果是nlp领域的呢,特别是chatgpt等大模型出来后对这类文本等数据的需求更大,如果没有现成的数据集的话基本上很难自己创造数据,所以爬取视为其中一个手段获取数据(但是提醒一下要合法获取数据哦)。
那么下面就以简单的批量获取mp3文件为例。
假设我们要获取网易云飙升榜的所有音乐文件:
地址为:https://music.163.com/#/discover/toplist?id=19723756
首先f12打开开发者工具:
选择network,然后根据歌曲名复制到搜索框,然后点击清理按键清理所有的请求信息。
然后点击刷新页面,可以看到出现了很多新的请求信息,这里打开抓包再开始请求是因为刚才的请求信息可能是有延迟的请求信息,并不全,这里重新获取的比较全面。
在左边搜索框搜索出来的点击就可以看到定位到的位置,在li标签的a标签里面,接下来我们先查看请求信息get获取一下信息打印出来看看:
选择headers,要获取两个信息,一个是url,一个是request headers底下的user agent。复制这两个信息开始下面的代码:
import requests
import re # 正则表达式的库
url = "https://music.163.com/discover/toplist?id=19723756"
headers = {
"user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"
}
response = requests.get(url=url, headers=headers)
print(response.text)
运行后打印出获取到的信息,接下来开始从中提取想要的内容,ctrl f定位到歌名可以看到是包裹在li标签中,因为我们想要下载的是mp3格式的文件,看到mp3的下载地址的组成包括id,而id就是和歌名一一对应的,所以我们for循环获取每个歌名及id来下载对应的mp3文件:
我们先拿这个“双星”举例,他的组成是这样的:<li><a href="/song?id=2068206782">双星</a></li>
,所以我们可以用正则表达式来通用表示所有的歌名的标签组成:<li><a href="/song\?id=(\d+)">(.*?)</a>
,代码如下:
html_data = re.findall('<li><a href="/song\?id=(\d+)">(.*?)</a>', response.text)
# print(html_data)
for num_id, title in html_data:
music_url = f"http://music.163.com/song/media/outer/url?id={num_id}.mp3" # mp3文件地址
music_content = requests.get(url=music_url, headers=headers).content
with open("/home/alpha/桌面/results/" + title + ".mp3", mode="wb") as f: # 下载每个mp3文件
f.write(music_content)
print(num_id, title)
运行结果:
这样就爬取下当前页面下全部的mp3文件了。