Python爬取酷狗音乐

在常见的几个音乐网站里,酷狗可以说是最好爬取的啦,什么弯都没有,也没加密啥的,所以最适合小白入门爬虫

本篇针对爬虫零基础的小白,所以每一步骤我都截图并详细解释了,其实我自己看着都啰嗦,归根到底就是两个步骤的请求,还请大佬绕路勿喷。

  1. 打开酷狗官网,可以看到搜索框,我们要爬取的数据就是搜索歌曲后,酷狗后台返回的歌曲列表以及每首歌的歌曲信息(歌词、作者、url等)


    Xshot-0048.png
  2. 敲F12键进入开发者模式,选择Network - All (这里就是酷狗前后台交互的所有请求列表)


    Xshot-0050.png
  3. 搜索框中输入搜索内容,然后右侧就可以看到会出现很多列表,搜索的列表数据其实就在这里面一条,我已经红色框标注了(找出这个可以根据那个名字song_search,实在不行点开一个个看是不是所要找的内容)


    Xshot-0052.png
  4. 点开这行,上面切换到Preview发现就是搜索结果的json数据,lists就是数据列表


    Xshot-0053.png
  5. 点开一条歌曲,里面就包含歌曲名字,作者,AlbumID,FileHash等歌曲信息


    Xshot-0054.png
  6. 然后我们上面切换到Headers,可以看到RequestURL(就是请求网址),下面箭头可以看到是GET请求


    Xshot-0055.png
  7. 往下滑,可以看到Requset Headers(这个后端会验证heades,一般请求时user-agent都需要写上,有些还验证更偏的,需要看情况处理,酷狗倒是没有验证,不写headers请求也可以)和请求参数(这就是请求的参数,搜索关键词、请求数目等信息)


    Xshot-0056.png
  8. 话不多说,我们直接用python的requests库(这个直接百度装一下就行)构造请求,我的环境是python2.7,python3的注意一下版本差异

#coding=utf-8
import requests

search = '喜欢你' #搜索内容
pagesize = '10'  #请求数目
url = 'https://songsearch.kugou.com/song_search_v2?callback=jQuery11240251602301830425_1548735800928&keyword=%s&page=1&pagesize=%s&userid=-1&clientver=&platform=WebFilter&tag=em&filter=2&iscorrection=1&privilege_filter=0&_=1548735800930' % (search,pagesize)
res = requests.get(url) #requests发起get请求
print res.text #输出响应内容
  1. 输出结果就是这样,可以看到返回json内容全部打印了出来,这就是和刚才在浏览器开发者工具看到的信息一样


    Xshot-0057.png
  2. 接着我们拿到列表后,再转回浏览器,拿到列表每一条歌曲的具体信息,左侧选择第一条点击进入详情页


    Xshot-0058.png
  3. 可以看到跳转到了播放页面,刷新一下页面,重新加载一遍


    Xshot-0059.png
  4. 可以看到右侧红色框圈起来的就是歌曲信息(你可能问我怎么知道哪个才是包含歌曲信息的,当然是观察法了,写多了就有经验了,实在不会一个个点进去看)


    Xshot-0060.png
  5. 我用箭头标注的都是一般需要爬取的有用信息,可以看到作者,歌曲名,歌词,专辑图片,id,play_url都在里面,不信你把play_url复制到地址栏回车播放的肯定是这个歌曲,拿到这个url我们就可以直接下载歌曲了


    Xshot-0061.png
  6. 接着我们再从上方从Preview切换到Headers,可以看到和请求歌曲列表差不多,还是GET请求


    Xshot-0062.png
  7. 这里的query同样还是GET请求的参数,其中hash和album_id就是一首歌曲的信息,我们只需要请求不同歌曲时改这两个参数就行了(第一步请求搜索列表每一行单曲数据包含这个参数了)


    Xshot-0063.png
  8. 直接刚才根据开发者模式里面的RequestURL,构造get请求,请求每首歌曲时换上每首歌对应的id和hash值就行

#coding=utf-8
import requests

#在这里,为了分步演示,直接用刚才第一步搜索时开发者模式获取到的搜索列表第一条的id和hash
#文章最后有整个连贯的代码

id = '557512' #单曲id
hash = '41C2E4AB5660EAE04021C5893E055F50' #单曲hash值
url = 'https://wwwapi.kugou.com/yy/index.php?r=play/getdata&callback=jQuery19107465224671418371_1555932632517&hash=%s&album_id=%s&_=1555932632518' % (hash,id)

res = requests.get(url)

print res.text
  1. 可以看到控制台打印了单曲信息,因为是json数据没有转换,直接输出打印现在看起来有点乱


    Xshot-0064.png
  2. 注意,酷狗返回数据并不直接就是json格式,两端有一些无用字符串,需用正则表达式去除,只保留大括号{}里面(包括大括号)内容,19步骤代码里有说明


    Xshot-0065.png
  1. 我们已经熟悉了上面的两步,最后进行汇总写一个完整的python爬虫,输入搜索歌曲,拿到搜索列表并包括单曲信息
# coding=utf-8
import requests
import json
import re


# 请求搜索列表数据
search = raw_input('音乐名:')  # 控制台输入搜索关键词
pagesize = "10"  # 请求数目
url = 'https://songsearch.kugou.com/song_search_v2?callback=jQuery11240251602301830425_1548735800928&keyword=%s&page=1&pagesize=%s&userid=-1&clientver=&platform=WebFilter&tag=em&filter=2&iscorrection=1&privilege_filter=0&_=1548735800930' % (search, pagesize)
res = requests.get(url)  # 进行get请求

# 需要注意一点,返回的数据并不是真正的json格式,前后有那个多余字符串需要用正则表达式去掉,只要大括号{}包着的内容
# json.loads就是将json数据转为python字典的函数
res = json.loads(re.match(".*?({.*}).*", res.text, re.S).group(1))

list = res['data']['lists']  # 这个就是歌曲列表

#建立List存放歌曲列表信息,将这个歌曲列表输出,别的程序就可以直接调用
musicList = []

#for循环遍历列表得到每首单曲的信息
for item in list:
    #将列表每项的item['FileHash'],item['AlnbumID']拼接请求url2
    url2 = 'https://wwwapi.kugou.com/yy/index.php?r=play/getdata&callback=jQuery191010559973368921649_1548736071852&hash=%s&album_id=%s&_=1548736071853' % (
    item['FileHash'], item['AlbumID'])
    res2 = requests.get(url2)
    res2 = json.loads(re.match(".*?({.*}).*", res2.text).group(1))['data']#同样需要用正则处理一下才为json格式,再转为字典

    #打印一下
    print res2['song_name']+' - '+res2['author_name']
    print res2['play_url']
    print ''

    #将单曲信息存在一个字典里
    dict = {
        'author': res2['author_name'],
        'title': res2['song_name'],
        'id': str(res2['album_id']),
        'type': 'kugou',
        'pic': res2['img'],
        'url': res2['play_url'],
        'lrc': res2['lyrics']
    }

    #将字典添加到歌曲列表
    musicList.append(dict)

  1. 最后控制台输出结果


    Xshot-0066.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,417评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,921评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,850评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,945评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,069评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,188评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,239评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,994评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,409评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,735评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,898评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,578评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,205评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,916评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,156评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,722评论 2 363
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,781评论 2 351

推荐阅读更多精彩内容