# -*- 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