Python抓取百度音乐。

今天挑战下百度音乐抓取,先用Chrome分析下请求的链接。

135332_fEzT_925404.png

最关键的就是这个链接

http://play.baidu.com/data/music/songlink

请求这个带上songid就能返回给你音乐的json,那么怎么来获取songid呢?

点开 http://music.baidu.com/tag,找个标签进去。然后查看页面源码。发现有以下片段。

135842_0WYc_925404.png

在每首歌曲的li元素的data-songitem里面恰巧包含我们需要的sid。ok,目标明确了,首先请求百度音乐的音乐标签页,然后获得sid。然后请求

http://play.baidu.com/data/music/songlink

并且带上我们组装好的sid。最后根据返回json获取我们需要的信息。

代码如下(刚学Python,写的不是太好):

#!/usr/bin/python
#coding=utf-8
__author__ = 'zhm'
import urllib
import urllib2
import re
from json import *
#
SONG_TAG_URL = 'http://music.baidu.com/tag/%E7%BB%8F%E5%85%B8%E8%80%81%E6%AD%8C'
SONG_LINK_URL = 'http://play.baidu.com/data/music/songlink'
def getContent(url,pattern):
    try:
        f=urllib2.urlopen(url)
        result =  f.read();
        content = re.compile(pattern, re.DOTALL)
        style = content.search(result)
        if style:
            result = style.group(0)
            return result
        else:
            return None
    except Exception ,e:
        print e

if  __name__=="__main__":
    for i in range(0,1000,25):
        #根据给出的百度音乐分类地址解析出songid
        result = getContent(SONG_TAG_URL+'?start='+unicode(i)+'&size=25&third_type=0','<ul>.*?</ul>')
        sids = []
        sidPattern = re.findall("&quot;sid&quot;:.*?,&quot;",result)
        for sid in sidPattern:
            sids.append(re.sub(',&quot;','',re.sub('&quot;sid&quot;:','',sid)))
        # print sids
        #将songid构造成post请求参数
        formdata = { "songIds" : ",".join(sids)}
        data_encoded = urllib.urlencode(formdata)
        # print data_encoded
        songList = urllib2.urlopen(SONG_LINK_URL,data_encoded)
        songListJson = songList.read()
        # print songListJson
         #json 转字典
        song_dict = JSONDecoder().decode(songListJson)
        #获取songList
        song_data_dict = song_dict.get("data").get("songList")
        for sond_data in song_data_dict:
            song_name = sond_data.get('songName')
            song_artistName = sond_data.get('artistName')
            song_format = sond_data.get('format')
            song_link = sond_data.get('songLink')
            if song_name is None or \
                            song_artistName is None or \
                            song_format is None or \
                            song_link is None:
                continue
            print song_name+'--'+song_artistName+'.'+song_format+u'     下载链接为:'+song_link
            #下载方法此处就省略了。


转载于:https://my.oschina.net/zhmlvft/blog/472466

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值