去哪兒網(wǎng)站開(kāi)發(fā)中國(guó)國(guó)家培訓(xùn)網(wǎng)靠譜嗎
相信訓(xùn)練模型時(shí)數(shù)據(jù)集的獲取也是一個(gè)很頭疼的事情,搞cv領(lǐng)域的可以扛著攝像頭架起三腳架拍攝獲取(以前干過(guò)),但是如果是nlp領(lǐng)域的呢,特別是chatgpt等大模型出來(lái)后對(duì)這類(lèi)文本等數(shù)據(jù)的需求更大,如果沒(méi)有現(xiàn)成的數(shù)據(jù)集的話(huà)基本上很難自己創(chuàng)造數(shù)據(jù),所以爬取視為其中一個(gè)手段獲取數(shù)據(jù)(但是提醒一下要合法獲取數(shù)據(jù)哦)。
那么下面就以簡(jiǎn)單的批量獲取mp3文件為例。
假設(shè)我們要獲取網(wǎng)易云飆升榜的所有音樂(lè)文件:
地址為:https://music.163.com/#/discover/toplist?id=19723756
首先f(wàn)12打開(kāi)開(kāi)發(fā)者工具:
選擇network,然后根據(jù)歌曲名復(fù)制到搜索框,然后點(diǎn)擊清理按鍵清理所有的請(qǐng)求信息。
然后點(diǎn)擊刷新頁(yè)面,可以看到出現(xiàn)了很多新的請(qǐng)求信息,這里打開(kāi)抓包再開(kāi)始請(qǐng)求是因?yàn)閯偛诺恼?qǐng)求信息可能是有延遲的請(qǐng)求信息,并不全,這里重新獲取的比較全面。
在左邊搜索框搜索出來(lái)的點(diǎn)擊就可以看到定位到的位置,在li標(biāo)簽的a標(biāo)簽里面,接下來(lái)我們先查看請(qǐng)求信息get獲取一下信息打印出來(lái)看看:
選擇headers,要獲取兩個(gè)信息,一個(gè)是url,一個(gè)是request headers底下的user agent。復(fù)制這兩個(gè)信息開(kāi)始下面的代碼:
import requests
import re # 正則表達(dá)式的庫(kù)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)
運(yùn)行后打印出獲取到的信息,接下來(lái)開(kāi)始從中提取想要的內(nèi)容,ctrl f定位到歌名可以看到是包裹在li標(biāo)簽中,因?yàn)槲覀兿胍螺d的是mp3格式的文件,看到mp3的下載地址的組成包括id,而id就是和歌名一一對(duì)應(yīng)的,所以我們for循環(huán)獲取每個(gè)歌名及id來(lái)下載對(duì)應(yīng)的mp3文件:
我們先拿這個(gè)“雙星”舉例,他的組成是這樣的:<li><a href="/song?id=2068206782">雙星</a></li>
,所以我們可以用正則表達(dá)式來(lái)通用表示所有的歌名的標(biāo)簽組成:<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).contentwith open("/home/alpha/桌面/results/" + title + ".mp3", mode="wb") as f: # 下載每個(gè)mp3文件f.write(music_content)print(num_id, title)
運(yùn)行結(jié)果:
這樣就爬取下當(dāng)前頁(yè)面下全部的mp3文件了。