python——爬取喜马拉雅FM
昨天,小编学习了爬取喜马拉雅的音频,特来分享(涉及到了反爬)????
涉及到的库requests os
requests:用于请求网页,获取网页数据
os: 用于创建文件夹的,进行增删改除
import requests
import os
#构造请求头,模拟浏览器访问网址
#url为请求访问的网址
url = “https://www.ximalaya.com/revision/play/album?albumId=291718&pageNum=1&sort=1&pageSize=30”
response = requests.get(url, headers=header).json()
print(response)
会发现报错,如图:
并且,我们发现,在网页的html数据中,并未发现音乐链接,??????
那么音乐链接在哪呢??
这可能是遇到了反爬虫,浏览器在访问网址时,一定携带了什么特殊的东西,
User-Agent, xm-sign Referer等
要想获得数据,需要模仿浏览器,拿到数据,一个请求包括:请求的网址,请求的方法,请求头,请求体.
所以我们 即需要构造请求头,即headers
header = {
“User-Agent”: “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome
/75.0.3770.142 Safari/537.36”,
“xm-sign”: “d53fbbbdd6634fc24b44034eeb0b5840(27)1564125374748(14)1564125374796”
}
注意,这个xm-sign即时网站用来防爬的. 需要我们动态实时获取:
拿到响应头数据后,下面思考下一个问题:
我们想要音乐链接的话,需要从最开始的地方,即服务器返回返回响应头(preview)开始分析.
需要我们定位元素,获取文件链接
audio_data = response[“data”][“tracksAudioPlay”]
for audio in audio_data:
music_src = audio[“src”]
music_name = audio[“trackName”]
# 创建音乐文件
with open(“music” + “\” + music_name + “.mp3”, “wb”) as f:
f.write(requests.get(music_src).content)
下面上完整代码:
import requests
import os
#构造请求头,模拟浏览器访问网址
header = {
“User-Agent”: “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome
/75.0.3770.142 Safari/537.36”,
“xm-sign”: “d53fbbbdd6634fc24b44034eeb0b5840(27)1564125374748(14)1564125374796”
}
#url为请求访问的网址
url = “https://www.ximalaya.com/revision/play/album?albumId=291718&pageNum=1&sort=1&pageSize=30”
response = requests.get(url, headers=header).json()
#print(response)
#创建目录 music
if not os.path.exists(“music”):
os.mkdir(“music”)
#锁定30个音乐链接
audio_data = response[“data”][“tracksAudioPlay”]
for audio in audio_data:
music_src = audio[“src”]
music_name = audio[“trackName”]
# 创建音乐文件
with open(“music” + “\” + music_name + “.mp3”, “wb”) as f:
f.write(requests.get(music_src).content)
希望对大家有帮助!! 我会继续努力爬虫的???????