网易云歌曲采集

# -*- coding: utf-8 -*-
import sys
import zlib
import base64
import json
import requests
import random
from lxml import etree
from Crypto.Cipher import AES
import execjs
reload(sys)
sys.setdefaultencoding( "utf-8" )

host="music.163.com"
#猜测接口都是get方式  直接写个方法
#由于网易云限制的ip和ua我们这里ua就不用管
#直接上代理ip
#因为我们这里统一了请求方法 直接带上代理
#这里推荐http://www.ueuz.com 代理足够多 足够自定义
proxies=[]#定义一个代理数组
def getProxies():
    jsona=json.loads(requests.session().get("http://****.com/").content)
    if jsona["code"]==0 :
        proxies=jsona["data"]#此处直接提取一个ip代理列表 
def getHttp(url):
    headers = {'Referer': 'http://music.163.com/',
               'Host': 'music.163.com',
               'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0 Iceweasel/38.3.0',
               'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
               }
    #做个容错处理
    s = requests.session()
    return s.get(url,proxies={'http': random.choice(proxies)}, headers=headers).content #随机从代理池抓取一个保证不重复,前提是代理足够多
#首先组合分类接口
def xList(uid):
    lists = []
    for x in range(65,90):
        url="http://music.163.com/discover/artist/cat?id={0}&initial={1}".format(uid,x)
        lists.append(url)
    return lists
#根据连接获取到歌手列表
info={}
def gList(url):
    html = getHttp(url)
    page = etree.HTML(html)
    hrefs = page.xpath(u"//*[@class='nm nm-icn f-thide s-fc0']")
    for href in hrefs:
        h=href.get('href').split('=')[1]
        t=href.get('title')
        print "id:{0}-name:{1}".format(h,t)
        #
        info[h] = t
#获取专辑id
def Albums(url,listb):
    html = getHttp(url)
    page = etree.HTML(html)
    hrefs=page.xpath("//*[@class='tit s-fc0']")
    for hrefa in hrefs:
        hurl="http://music.163.com"+hrefa.get("href")
        listb.append(hurl)
def appText(name,date):
    f = open('{0}.txt'.format(name), 'a')
    f.write(json.dumps(date))
    f.close()
def main():
    getProxies()#启动首先初始化一个代理池
    # 以下是深度遍历所有歌手的id名字
    urls = [1, 2, 6, 7, 4]
    for u in urls:
        for i in range(1, 3):
            for a in xList("{0}001".format(u)):
                gList(a)

    appText("info", info)  # 将所有歌手id先序列化到本地储存
    # 获取到所有的歌手之后
    # 创建一个信息对象
    obj = {}
    for k, v in info.iteritems():
        url = "http://music.163.com/artist/album?id={0}".format(k)
        html = getHttp(url)
        page = etree.HTML(html)
        hrefs = page.xpath("//*[@class='zpgi']")
        lista = []  # 定义一个专辑数组 用于存放专辑url列表
        for u in hrefs:
            urla = "http://music.163.com" + u.get("href")
            Albums(urla, lista)
        obj[k] = lista  # 利用对象键值对特性储存歌手对应的专辑

    appText("infos", obj)  # 将专辑序列化到本地储存

    # 创建一个歌曲信息对象用于存放歌手对应的所有歌曲
    musics = {}
    for k in obj.iterkeys():
        oby = obj[k]  # 获取某歌手的所有专辑的歌曲
        lsit = []
        for i in oby:
            html = getHttp(i)
            page = etree.HTML(html)
            hrefs = page.xpath("//*[@class='txt']/a")
            for i in hrefs:
                url = "http://music.163.com" + i.get("href")
                lsit.append(url)
        musics[k] = lsit
    appText("date", musics)#序列化到本地所有信息
    #拿到到所有歌手对应的歌曲之后
    #现在有了歌曲id 就可以获取评论了
    #由于评论是参数加密的 有兴趣可以看我这个帖子发的是解密算法
    https://my.oschina.net/KFS/blog/1621950
    
print "完工"





转载于:https://my.oschina.net/KFS/blog/1621952

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值