一个小游戏:网易云音乐资源爬取(登录+评论)
2020/3/11 5:01:28
本文主要是介绍一个小游戏:网易云音乐资源爬取(登录+评论),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
如何爬取网易云音乐的评论呢?
推荐:微信小游戏大全
1.文本以华晨宇的《我的滑板鞋2016》为例
http://music.163.com/#/song?i...
2.使用浏览器的工具,查找获取评论的url
http://music.163.com/weapi/v1...
3.不难发现,此API是通过POST请求获得我们想要的评论信息的,需要POST的参数有params和encSecKey,网易为了反爬虫,加密了这2个参数,不过不要紧,下面有加密过程
4.POST请求成功后,会得到一个JSON字符串,里面就包含了各种评论信息
5.下面就用JAVA来实现评论的获取
AES加密工具类
import java.util.Base64; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; public class EncryptTools { //AES加密 public static String encrypt(String text, String secKey) throws Exception { byte[] raw = secKey.getBytes(); SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); // "算法/模式/补码方式" Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); // 使用CBC模式,需要一个向量iv,可增加加密算法的强度 IvParameterSpec iv = new IvParameterSpec("0102030405060708".getBytes()); cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv); byte[] encrypted = cipher.doFinal(text.getBytes()); return Base64.getEncoder().encodeToString(encrypted); } //字符填充 public static String zfill(String result, int n) { if (result.length() >= n) { result = result.substring(result.length() - n, result.length()); } else { StringBuilder stringBuilder = new StringBuilder(); for (int i = n; i > result.length(); i--) { stringBuilder.append("0"); } stringBuilder.append(result); result = stringBuilder.toString(); } return result; } }
推荐:微信小游戏大全
评论获取
public void commentAPI() throws Exception { //私钥,随机16位字符串(自己可改) String secKey = "cd859f54539b24b7"; String text = "{\"username\": \"\", \"rememberLogin\": \"true\", \"password\": \"\"}"; String modulus = "00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7"; String nonce = "0CoJUm6Qyw8W8jud"; String pubKey = "010001"; //2次AES加密,得到params String params = EncryptTools.encrypt(EncryptTools.encrypt(text, nonce), secKey); StringBuffer stringBuffer = new StringBuffer(secKey); //逆置私钥 secKey = stringBuffer.reverse().toString(); String hex = Hex.encodeHexString(secKey.getBytes()); BigInteger bigInteger1 = new BigInteger(hex, 16); BigInteger bigInteger2 = new BigInteger(pubKey, 16); BigInteger bigInteger3 = new BigInteger(modulus, 16); //RSA加密计算 BigInteger bigInteger4 = bigInteger1.pow(bigInteger2.intValue()).remainder(bigInteger3); String encSecKey= Hex.encodeHexString(bigInteger4.toByteArray()); //字符填充 encSecKey= EncryptTools.zfill(encSecKey, 256); //评论获取 Document document = Jsoup.connect("http://music.163.com/weapi/v1/resource/comments/R_SO_4_437859519/").cookie("appver", "1.5.0.75771") .header("Referer", "http://music.163.com/").data("params", params).data("encSecKey", encSecKey) .ignoreContentType(true).post(); System.out.println("评论:" + document.text()); }
那么如何登录网易云音乐呢?
1.查找登录的API地址(在浏览器登录一次,在network中查看url)
2.查看登录时post需要提交的参数
3.是不是很熟悉?和刚才获取评论的时候一样,该如何做呢?看看下面的示例代码
在上面AES加密工具类中添加MD5加密方法
public static String md5(String pwd) { try { MessageDigest digest = MessageDigest.getInstance("md5"); byte[] bs = digest.digest(pwd.getBytes()); String hexString = ""; for (byte b : bs) { int temp = b & 255; if (temp < 16 && temp >= 0) { hexString = hexString + "0" + Integer.toHexString(temp); } else { hexString = hexString + Integer.toHexString(temp); } } return hexString; } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return ""; }
登录请求
public void loginAPI(String username, String password) throws Exception { password = EncryptTools.md5(password); // 私钥,随机16位字符串(自己可改) String secKey = "cd859f54539b24b7"; String text = "{\"username\": \"" + username + "\", \"rememberLogin\": \"true\", \"password\": \"" + password + "\"}"; String modulus = "00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7"; String nonce = "0CoJUm6Qyw8W8jud"; String pubKey = "010001"; // 2次AES加密,得到params String params = EncryptTools.encrypt(EncryptTools.encrypt(text, nonce), secKey); StringBuffer stringBuffer = new StringBuffer(secKey); // 逆置私钥 secKey = stringBuffer.reverse().toString(); String hex = Hex.encodeHexString(secKey.getBytes()); BigInteger bigInteger1 = new BigInteger(hex, 16); BigInteger bigInteger2 = new BigInteger(pubKey, 16); BigInteger bigInteger3 = new BigInteger(modulus, 16); // RSA加密计算 BigInteger bigInteger4 = bigInteger1.pow(bigInteger2.intValue()).remainder(bigInteger3); String encSecKey = Hex.encodeHexString(bigInteger4.toByteArray()); // 字符填充 encSecKey = EncryptTools.zfill(encSecKey, 256); // 登录请求 Document document = Jsoup.connect("http://music.163.com/weapi/login/").cookie("appver", "1.5.0.75771") .header("Referer", "http://music.163.com/").data("params", params).data("encSecKey", encSecKey) .ignoreContentType(true).post(); System.out.println("登录结果:" + document.text()); }
参考资料
本文由博客群发一文多发等运营工具平台 OpenWrite 发布
这篇关于一个小游戏:网易云音乐资源爬取(登录+评论)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-10-01基于Python+Vue开发的医院门诊预约挂号系统
- 2024-10-01基于Python+Vue开发的旅游景区管理系统
- 2024-10-01RestfulAPI入门指南:打造简单易懂的API接口
- 2024-10-01初学者指南:了解和使用Server Action
- 2024-10-01Server Component入门指南:搭建与配置详解
- 2024-10-01React 中使用 useRequest 实现数据请求
- 2024-10-01使用 golang 将ETH账户的资产平均分散到其他账户
- 2024-10-01JWT用户校验课程:从入门到实践
- 2024-10-01Server Component课程入门指南
- 2024-09-30Dnd-Kit学习:新手快速入门指南