我自己为了练习爬虫写了一个某千音乐的爬取项目,可以爬取一个歌手的所有歌
首先是通过chrome的network寻找url地址
在播放器页面播放时会访问一个有固定格式的URL,后面有一个标示性的xcode
接下来就是寻找这个url地址的来源
通过寻找XCODE可以找到一个网站的API
用requests.get请求,它会返回对应歌曲的信息,就包括它的播放地址
找到API后,下一步就是去找歌曲ID
在翻页的时候,并不是访问一个新的URL地址,而是js加载的。
加载的信息来源于"http://music.taihe.com/data/user/getsongs?start=0&size=15&ting_uid=2517"
每次都会返回15首歌曲,当然这规律也就显而易见了!
UID是歌手的ID
其中要注意的是:返回的结果有一个errorcode用来判断是否翻页到尽头!通过正则来获取即可
class MusicSpider(scrapy.Spider):
name = 'music'
allowed_domains = ['music.taihe.com']
start_urls = ["http://music.taihe.com/data/user/getsongs?start=0&size=15&ting_uid=2517"]
i=0
def parse(self, response):
mp3_url = "http://play.taihe.com/data/music/songlink"
a=re.findall('''data-songid=\\\\\"(\d+)\\\\\"''',response.text,re.S)#需要二次转义、、、、、
a=list(set(a))
print(a,end=" ")
print()
my_data = {
'songIds': ",".join(a),
'hq': '0',
'type': 'm4a,mp3',
'rate': "",
'pt': '0',
'flag': '-1',
's2p': '-1',
'prerate': '-1',
'bwt': '-1',
'dur': '-1',
'bat': '-1',
'bp': '-1',
'pos': '-1',
'auto': '-1'
}
response2 = requests.post(url=mp3_url, headers=my_headers, data=my_data)
music_infos = response2.json()['data']['songList']
for music_info in music_infos:
a=HomeworkItem()
a["songLink"] = music_info["songLink"]
a["songName"]= music_info["songName"]
yield a
self.i+=15
url = "http://music.taihe.com/data/user/getsongs?start=" + str(self.i) + "&size=15&ting_uid=2517"
res=requests.get(url=url, headers=my_headers)
errorCode=re.findall('''"errorCode":(\d+),"''',response.text,re.S)
if errorCode[0]!="22001":
yield scrapy.Request(
"http://music.taihe.com/data/user/getsongs?start=" + str(self.i) + "&size=15&ting_uid=2517",
callback=self.parse
)
保存就放在pipelines.py中完成!
现在这个代码还很短,是个一个刚入门练手的项目。现在不同播放器拥有的歌曲版权不同,未来我会补充其他音乐网站的爬虫,期望输入一个歌手名就可以全网下载他的歌曲。
程序使用:
在歌手的个人主页上,找到对应歌手的ID,填写在start_urld中的uid=后面。
然后在工程目录下,使用cmd命令 scrapy crawl music
网易云爬虫参考了ymbcxb的文章 代码结构还需修改