该爬虫代码是根据教程学习得来,算不得原创,利用论坛写下思路和踩下的坑吧。
该网站不要求登录、无验证码、无反爬,适合我这种纯小白练习。
思路:
1、分析网站网址变换规律,一般首页的格式可根据后面几页的url推算得来;
2、利用requests库请求网站源码,利用正则表达式获取到源码中的歌曲名称、序号及网址必要的组成部分;
3、进行字符串拼接,得到可用的、真实的歌曲资源地址;
4、利用循环逐页下载保存即可。
总结:
1、.content与.text有区别。
response.text 得到的是文本 str类型,默认编码格式是ISO-8859-1。出现乱码要encoding以下,如:response.encoding = "utf-8"response.content 得到的是 视频 ,图片等 byte ,二进制类型。因此,下音乐时不能用content。2、爬虫要预留一个暂停时间,不要给对方服务器压力,避免被屏蔽3、网络链接规则有时会改变,因此爬虫需要维护。
[Python] 纯文本查看 复制代码 # 文件路径C:/Users/Kai/Music/import requests
import time
import re
# analyse the url of list
# http://www.htqyy.com/top/hot 1st page
# http://www.htqyy.com/top/musicList/hot?pageIndex=1&pageSize=20 2nd page# 开发者模式中找
# http://www.htqyy.com/top/musicList/hot?pageIndex=2&pageSize=20 3rd page
# http://www.htqyy.com/top/musicList/hot?pageIndex=3&pageSize=20 4th page
# the url of songs
# http://www.htqyy.com/play/33 #真实URL地址
# http://www.htqyy.com/play/62
# 分析发现,真正的播放资源在http://f2.htqyy.com/play7/33/mp3/5这样地方的
headers = {
"User-Agent":"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) \
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129\
Mobile Safari/537.36"
}
songID = []
songName = []
page = int(input("请输入你要爬取的页数,每页20首:"))
for i in range(0,page):
url = "http://www.htqyy.com/top/musicList/hot?pageIndex=" + str(i) + "&pageSize=20"
# 获取网页信息
html = requests.get(url)
strr = html.text
#print(html.text)
# 从<a href="/play/33" target="play" title="清晨" sid="33">清晨</a> 提取33组成音乐资源链接
part1 = r'title="(.*?)" sid='
part2 = r'sid="(.*?)"'
Titlelist = re.findall(part1, strr)
Idlist = re.findall(part2,strr)
#print(Titlelist,Idlist)
songName.extend(Titlelist)
songID.extend(Idlist)
# print(songName,songID)
for i in range(0,len(songID)):
songUrl = "http://f2.htqyy.com/play7/" + str(songID[i]) + "/mp3/5" # 歌曲资源网址变化的地方只在songID处
songname = songName[i]
data = requests.get(songUrl).content
print("正在下载第", i + 1, "首")
with open("C:/Users/Kai/Music/{}.mp3".format(songname),"wb") as f:
f.write(data)
time.sleep(0.5)
|