之前简单学了一下Python,没做过东西,心血来潮来了个idea,就写了一个抓取网页云音乐指定歌手的歌曲和评论数量的脚本。

代码如下,如果缺少包则用pip安装一下,不过AES加密用到的pycrypto包,编译安装需要有c++环境,所以建议下载编译好的版本,我这里是Python35的:https://github.com/nsrathjen/pycrypto-py3.5-win64-binary

代码

import os
import json
import hashlib
import base64
import binascii
from Crypto.Cipher import AES
import requests
import prettytable
default_timeout = 100 #定义超时时间
modulus = ('00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7'
'b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280'
'104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932'
'575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b'
'3ece0462db0a22b8e7')
nonce = '0CoJUm6Qyw8W8jud'
pubKey = '010001'
# 歌曲加密算法, 基于https://github.com/yanunon/NeteaseCloudMusic脚本实现
def encrypted_id(id):
magic = bytearray('3go8&$8*3*3h0k(2)2', 'u8')
song_id = bytearray(id, 'cd u8')
magic_len = len(magic)
for i, sid in enumerate(song_id):
song_id[i] = sid ^ magic[i % magic_len]
m = hashlib.md5(song_id)
result = m.digest()
result = base64.b64encode(result)
result = result.replace(b'/', b'_')
result = result.replace(b'+', b'-')
return result.decode('utf-8')
# 加密算法, 基于https://github.com/stkevintan/nw_musicbox脚本实现
def encrypted_request(text):
text = json.dumps(text)
secKey = createSecretKey(16)
encText = aesEncrypt(aesEncrypt(text, nonce), secKey)
encSecKey = rsaEncrypt(secKey, pubKey, modulus)
data = {'params': encText, 'encSecKey': encSecKey}
return data
def aesEncrypt(text, secKey):
pad = 16 - len(text) % 16
text = text + chr(pad) * pad
encryptor = AES.new(secKey, 2, '0102030405060708')
ciphertext = encryptor.encrypt(text)
ciphertext = base64.b64encode(ciphertext).decode('utf-8')
return ciphertext
def rsaEncrypt(text, pubKey, modulus):
text = text[::-1]
rs = pow(int(binascii.hexlify(text), 16), int(pubKey, 16), int(modulus, 16))
return format(rs, 'x').zfill(256)
def createSecretKey(size):
return binascii.hexlify(os.urandom(size))[:16]
# 此类用了post查询歌曲
class NetEase:
def __init__(self):
self.header = {
'Accept': '*/*',
'Accept-Encoding': 'gzip,deflate,sdch',
'Accept-Language': 'zh-CN,zh;q=0.8,gl;q=0.6,zh-TW;q=0.4',
'Connection': 'keep-alive',
'Content-Type': 'application/x-www-form-urlencoded',
'Host': 'music.163.com',
'Referer': 'http://music.163.com/search/',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.152 Safari/537.36'
}
self.cookies = {'appver': '1.5.2'}
# 搜索单曲(1),歌手(100),专辑(10),歌单(1000),用户(1002) *(type)*
def search(self, s, stype=1, offset=0, total='true', limit=100):
action = 'http://music.163.com/api/search/get/web'
data = {
's': s,
'type': stype,
'offset': offset,
'total': total,
'limit': limit
}
return self.httpRequest('POST', action, data)
###发起一个http请求
def httpRequest(self, method, action, query=None, urlencoded=None, callback=None, timeout=None):
if(method == 'GET'):
url = action if (query == None) else (action + '?' + query)
connection = requests.get(url, headers=self.header, timeout=default_timeout)
else:
connection = requests.post(
action,
data=query,
headers=self.header,
timeout=default_timeout
)
connection.encoding = "UTF-8"
connection = json.loads(connection.text)
return connection
####获取评论数量
def getCommentNum(self, id):
action = 'http://music.163.com/weapi/v1/resource/comments/R_SO_4_'+str(id)+'?csrf_token='
csrf = ''
req = {'csrf_token': csrf}
data = encrypted_request(req)
return self.httpRequest('POST', action, data)
###############################################################################
#配置项
singer = '周杰伦' #歌手
page = 2 #只请求两页数据
limit = 100 #每页的歌曲数量
##########################正文##############################
netEase = NetEase()
musics = netEase.search(singer, stype=1)
songCount = musics['result']['songCount']
#总页数
pageNum =  int(songCount/limit) if songCount%limit==0 else int(songCount/limit)+1
songs = [[]] * (songCount if (page > pageNum) else (page * limit))
number = 0
for currentPage in range(0,pageNum):
if(currentPage>=page):
break
print('正在处理第' + str(currentPage + 1) + '页数据...')
offset = currentPage*limit
musics = netEase.search(singer,stype=1,offset=offset,limit=limit)
count = (songCount-offset) if currentPage==limit else limit
###循环获取歌曲评论数量
for key in range(0,count):
songId = musics['result']['songs'][key]['id']
songName = musics['result']['songs'][key]['name']
result = netEase.getCommentNum(songId)
commentNum = result['total']
songs[number] = [songId,songName,singer,commentNum]
number+=1
songs.sort(key=lambda x:x[3],reverse=True) ##按评论数量逆序
##表格输出结果
table = prettytable.PrettyTable()
table.field_names = ["ID", "歌名", "歌手", "评论数量"]
for number in range(0, 20): ##只展示评论数量前20名的歌曲
table.add_row([songs[number][0],songs[number][1],songs[number][2],songs[number][3]])
print(table)

效果

Python抓取网页云音乐指定歌手的歌曲和评论数量相关推荐

  1. 使用Python抓取网易云音乐所有歌手信息

    思路 1. 构造请求页面的URL 每个页面由歌手分类和歌手名字的大写字母值构成,比如,"http://music.163.com/discover/artist/cat?id=1001&am ...

  2. python 抓取网页链接_从Python中的网页抓取链接

    python 抓取网页链接 Prerequisite: 先决条件: Urllib3: It is a powerful, sanity-friendly HTTP client for Python ...

  3. python 抓取网页数据

    python 抓取网页数据 此文解决如何从不同网页爬取数据的问题及注意事项,重点说明requests库的应用. 在开始之前,要郑重说明一下,不是每一个网页都可以爬取数据哦.有的网页涉及个人隐私或其他敏 ...

  4. python抓取网页文章_使用Python从公共API抓取新闻和文章

    python抓取网页文章 Whether you are data scientist, programmer or AI specialist, you surely can put huge nu ...

  5. Python抓取网页中的动态序列化数据

    Python抓取网页中的动态序列化数据 动态序列化数据经常应用于前后端分离的页面.或者通过VUE.JS等HTML页面环境,常规的爬虫抓取方法并不能满足数据采集的要求,因此需要其他的方式进行数据的采集. ...

  6. python抓取网站图片_python抓取图片示例 python抓取网页上图片

    python抓取网页上图片 这个错误时是什么意思 下面是代码 import re import urllib.request imp正则表达式匹配的url有错误 for x in add: print ...

  7. Python爬取网易云音乐所有歌手的名称和链接

    一.需求 Python爬取网易云音乐所有歌手的名称和链接 二.代码实现 import requests from lxml import etree from urllib import reques ...

  8. [爬虫]Python爬取网易云音乐搜索并下载歌曲!

    Python爬取网易云音乐搜索并下载歌曲! 文章目录 Python爬取网易云音乐搜索并下载歌曲! 1.准备工作 2."实地"观察 3.开始码代码! 4.搜索并下载 结束语 1.准备 ...

  9. Python抓取网易云音乐热搜榜热评

    引子 啊~最有个小姐姐要做微信公众号,她需要优质的句子.文章,于是我想到了网易云每首伤感歌曲下面的评论,嗯~很感人,甚至有的时候真的感觉这里就是能触及我心灵最柔软的地方,正好这几天在学习python, ...

最新文章

  1. 什么是 BCH、比特现金新地址?
  2. 极简PaddlePaddle的房价预测Demo
  3. 微信公众平台开发(24) 自定义菜单功能开发
  4. 对数学本质特征的若干认识
  5. tp5 cache缓存简单使用
  6. 第三季-第3课-Coredump程序故障分析
  7. 《深入浅出设计模式》小结
  8. 最高响应比调度算法_高响应比调度算法(c语言程序实现)
  9. 自然语言处理与企业对话系统设计
  10. 突发!图森未来CEO侯晓迪被罢免,公司疑遭SEC、FBI联手调查,市值一夜砍半
  11. TFT-液晶显示屏的结构和原理
  12. 12 款适用于开发人员的最佳 Web 开发软件
  13. 缺陷的概念、优先级、生命周期等
  14. MOB短信验证码开发
  15. C#几行代码实现定时关机/重启 超详细(建议新手练习)
  16. 爬虫初学——爬取京东商品的评论(一)
  17. 【你好,windows】Win10 X86x64 1709.2166企业G纯净版2020.11.27
  18. 有 5 个人坐在一起,问第五个人多少岁?
  19. Git教程 | (9) 自定义Git和使用SourceTree
  20. 交换机和路由器的区别?

热门文章

  1. 【操作系统】第二章--进程的描述与控制--笔记与理解(2)
  2. linux 使用 repotrack 下载 rpm 程序包及其所需依赖
  3. 以合力加速基础软件创新:拆解鲲鹏众智如何繁荣新计算生态
  4. 企业提高客户保持率基本方法
  5. 很受打动的一篇文章,很幽默让人想看完。
  6. Python表白妙招,把情书写进她的照片里
  7. 直播预告 | 哈工大HIT-SCIR实验室专场二
  8. Vue2.0开发之——购物车案例-Footer组件封装-计算商品的总价格(51)
  9. DAVINCI和OMAP架构的区别
  10. Android 屏幕适配 pt暴力适配