PYTHON 2.7爬虫获取百度音乐文件(按歌手名或歌曲名均可)

有点小错误正在修改!!!!      

 最近学习了关于python的一点点知识,做出一点点小小程序来帮助自己加深印象,如果有需要的朋友也可以借此互相交流和沟通!

一、首先我们先查询指定网站的robots协议信息,如我们今天要爬去的网站:http://music.taihe.com/robots.txt,点击链接跳转到页面发现页面不存在

       如果网站没有对应的robots协议信息,则表示我们可以根据我们的需要理性的对我们需要的数据进行获取[坏笑]。

二、当我们输入歌手名称如:王力宏,之后敲回车键,url地址更新为:

http://music.taihe.com/search?key=王力宏”可以看到页面中的关于歌手王力宏的音乐列表信息如下图:(可以看到其中某些歌曲并不能点击和播放)

三、查看网页对应的html页面(查看网页源代码,查看网页中的数据是否为静态数据填充的)

       右键单击网页中的空白处,选择“查看网页源代码”,可以看到页面对应的基本的html页面组成元素。

       可以在网页中通过歌曲列表中的某一项的名称,在源代码中查找的方式,查看是否存在与源代码中,即可进行简单的确认数据是否为动态加载的数据信息。(如果网页中的列表信息存在源代码中,则证明是静态数据展示,否则为动态加载的数据,然后展示在页面中的)

四、点击某一首列表中的某一首歌曲进入播放界面如下:

(其中我们可以注意到歌曲播放页面的网页url地址为:http://music.taihe.com/song/524453787,当我们进入该网页后,按下键盘上的F12可以查看该页面下的console控制台,选择网络标签,查看请求该页面时,浏览器向服务器发送的请求以及服务器反馈的数据信息)

(通过url地址我们可以知道,每首歌的播放地址其实只有后面歌曲id的不同,因此我们要在上一个web页面中通过这个ID获取到歌曲列表中所有歌曲的id信息,这样我们就可以通过id找到所有的歌曲对应的web页面了。)

       分析上方的网页url我们知道了每首歌曲播放页面只是对应的歌曲id不同,鉴于以上分析得到的结果,我们复制歌曲的id值,回到搜索结果页面,url地址为:http://music.taihe.com/search?key=王力宏,然后在网页中右键单击,选择查看网页源代码,进行全局搜索(按下Ctrl + F ,,调用查找选项,再按下Ctrl + V)将id值放到搜索框中,找到id值所在的位置。

五、通过re正则表达式获取到所有得id值

       从上图中我们可以看到很多可以匹配到一首歌曲的id信息的上下文,我们也需要对各个列表项中的匹配到id值的上下文进行简单的区分,帮助我们可以通过re获取到所有的id信息。

        在此处我使用的是sid":271933815,,因为歌曲id为纯数字信息,所以我通过\d进行匹配,加号表示匹配加号前的数据信息一个或多个。

       正则表达式为:song_ids = re.findall(r'sid":(\d+),', search_html),此处的search_html是歌曲列表页面的网页数据信息,列表形式展示。

六、获取音乐数据的真实的地址,即外链

在歌曲播放页面我们通过F12检查网页,查看网络请求,然后在其中找到其传回的data中包含mp3地址的即可

#encoding=utf-8
#-*- encoding : utf-8 -*-
#/python-pachong/music-baidu/music_spider.py
#爬百度音乐上面的文件信息----------------搜索音乐,并输出前几首,然后由用户指定下载。。。
import requests
import re
import json
import os

# data = {
#     'key': '刘德华'
# }
# search_url = 'http://music.baidu.com/search?key='
key = raw_input("请输入想要获取对应音乐的的歌手:"),

ids = {0,20,40}
data = {
    'key': key,
           #"刘德华"
           #"王力宏"
           #"Declan Galbraith",
    's': 1,
    # 'start': ','.join(str(ids)),
    'start': 0,
    'size': 20,
    'third_type': 0,
}

search_url = 'http://music.taihe.com/search/song'
search_response = requests.get(search_url,params=data)
# print type(search_response)
search_response.encoding="utf-8"

search_html = search_response.text

# print search_html
song_ids = re.findall(r'sid":(\d+),', search_html)
data = {
    'songIds': ','.join(song_ids),
    'hq': 0,
    'type': 'm4a,mp3',
    'pt': 0,
    'flag': -1,
    's2p': -1,
    'prerate': -1,
    'bwt': -1,
    'dur': -1,
    'bat': -1,
    'bp': -1,
    'pos': -1,
    'auto': -1,
}
song_link = 'http://play.taihe.com/data/music/songlink'
song_response = requests.post(song_link, data=data)
# 将返回的数据转换为字典
# print song_response
song_info = song_response.json()
# print song_info
song_info = song_info['data']['songList']
# print song_info
# 遍历数组,获取其中的歌曲名称和链接
i = 1
print "开始下载歌曲..."
for song in song_info:
    print "正在现在第%d首歌曲\t歌曲名称为:%s" % (i, song['songName']),
    i += 1
    song_name = song['songName']
    singer_name = song['artistName']
    song_lrc = song['lrcLink']
    print song_lrc

    #判断歌词文件url是否为空,如果为空,那么将url地址设置为空
    # if (song_lrc == ""):
    #     song_lrc="暂无歌词"

    #创建一个以歌手名称命名的文件夹
    if not os.path.exists('music/%s' %singer_name):
        os.mkdir('music/%s' %key)

    with open('music/%s/%s_%s.mp3' % (singer_name, song_name, singer_name), "wb") as f:
        if song['songLink'] != "":
            response = requests.get(song['songLink'])
            f.write(response.content)
            f.close()
    with open('music/%s/%s_%s.lrc' % (singer_name, song_name, singer_name), 'wb') as f1:
        if song_lrc != '':
            response = requests.get(song_lrc)
            f1.write(response.content)
            f1.close()
        else:
            f1.write('此歌曲暂无歌词')
            f1.close()
    print "%s*********下载完毕" % song['songName']

猜你喜欢

转载自blog.csdn.net/qq_32670879/article/details/81366387