java+selenium 网易云音乐刷累计听歌数的方法

背景

应该是在去年的时候,刷知乎看到一个问题,大概是说怎么刷网易云音乐个人累计听歌数,然后有一个高赞回答,贴了一段js代码,直接在浏览器console执行就可以了。当时试了下,直接一下子刷了有好几万。悲剧的是,第二天又回到原来的样子了,很明显这种方式被网易云音乐发现封掉了。而且后续网易云还针对累计听歌数加了一些限制,每天最多增加300首。今天带来一种通过java+selenium的方式,自动播放歌曲,来达到刷累计听歌数的效果。另外借助这个demo,对selenium的使用更加熟悉,也算是爬虫应用中一些有趣的东西了。

思路

登录,有以下两种方式可以选择:

a. 模拟web端的登录过程。优点:这种方式更加通用,便于动态切换账号。缺点:比直接使用cookie稍微麻烦一些,并且有一定几率会出现图形验证码,需要考虑这种情况。

b. 设置cookie。优点:不用处理登录过程,比较简单方便,在cookie的过期时间比较长情况下还是比较方便的,不用频繁切换。缺点:切换账号比较麻烦,不能达到自动化。我这里选择的该方式。

播放:上一个步骤中登录成功后,直接打开歌单列表页面。如下图

,在歌单列表页面可以看到。有3个地方是可以点击播放的,我最先想到是最下面一个播放按钮,然后一直保持底部播放组件的显示,实时获取播放的动态。尝试通过模拟点击播放按钮,始终不成功,最终点击最上面的播放按钮可以播放的。

获取播放动态:为了确定播放是否在正常进行,可以通过实时获取个人home页面的累计听歌数相关信息,用于监控,由于已经有一个页面在播放歌曲了,为了不影响原有播放歌曲的页面,可以打开一个新的tab页来获取个人home页面,打开新的table页,这里采用js的方式window.open('about:blank')

最终都会看到如下类似如下格式日志,那就说明成功了:

2019-03-26 09:25:10,406 INFO [,main] - [com.github.wycm.Music163] - 伊犁河畔-00:00 / 00:00---当前播放第1首歌曲, 累计听歌:20572
2019-03-26 09:25:16,817 INFO [,main] - [com.github.wycm.Music163] - 伊犁河畔-01:00 / 07:19---当前播放第1首歌曲, 累计听歌:20572
2019-03-26 09:25:23,157 INFO [,main] - [com.github.wycm.Music163] - 伊犁河畔-01:06 / 07:19---当前播放第1首歌曲, 累计听歌:20572
2019-03-26 09:25:29,394 INFO [,main] - [com.github.wycm.Music163] - 伊犁河畔-01:13 / 07:19---当前播放第1首歌曲, 累计听歌:20572
2019-03-26 09:25:35,592 INFO [,main] - [com.github.wycm.Music163] - 伊犁河畔-01:19 / 07:19---当前播放第1首歌曲, 累计听歌:20572
2019-03-26 09:25:41,974 INFO [,main] - [com.github.wycm.Music163] - 伊犁河畔-01:25 / 07:19---当前播放第1首歌曲, 累计听歌:20572

完整代码

package com.github.wycm;

import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Created by wycm
 */
public class Music163 {
 private static Logger logger = LoggerFactory.getLogger(Music163.class);

 //拷贝登录成功的浏览器原始cookie
 private final static String RAW_COOKIES = "cookie1=value1; cookie2=value2";
 private final static String CHROME_DRIVER_PATH = "/Users/wangyang/Downloads/chromedriver";
 //歌曲列表id
 private static String startId = "22336453";

 private static String userId = null;
 private static Set<String> playListSet = new HashSet<>();
 private static Pattern pattern = Pattern.compile("<span class=\"j-flag time\"><em>(.*?)</em>(.*?)</span>");
 private static Pattern songName = Pattern.compile("class=\"f-thide name fc1 f-fl\" title=\"(.*?)\"");
 private static ChromeOptions chromeOptions = new ChromeOptions();
 private static WebDriver driver = null;
 static {
  System.setProperty("webdriver.chrome.driver", CHROME_DRIVER_PATH);
  chromeOptions.addArguments("--no-sandbox");
 }
 public static void main(String[] args) throws InterruptedException {
  while (true){
   try {
    driver = new ChromeDriver(chromeOptions);
    playListSet.add(startId);
    invoke();
   } catch (Exception e){
    logger.error(e.getMessage(), e);
   } finally {
    driver.quit();
   }
   Thread.sleep(1000 * 10);
  }
 }

 /**
  * 初始化cookies
  */
 private static void initCookies(){
  Arrays.stream(RAW_COOKIES.split("; ")).forEach(rawCookie -> {
   String[] ss = rawCookie.split("=");
   Cookie cookie = new Cookie.Builder(ss[0], ss[1]).domain(".163.com").build();
   driver.manage().addCookie(cookie);
  });
 }
 private static void invoke() throws InterruptedException {
  driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
  driver.manage().timeouts().pageLoadTimeout(15, TimeUnit.SECONDS);
  String s = null;
  driver.get("http://music.163.com/");
  initCookies();
  driver.get("http://music.163.com/");
  s = driver.getPageSource();
  userId = group(s, "userId:(\\d+)", 1);
  driver.get("https://music.163.com/#/playlist?id=" + startId);
  driver.switchTo().frame("contentFrame");
  WebElement element = driver.findElement(By.cssSelector("[id=content-operation]>a:first-child"));
  element.click();
  ((JavascriptExecutor) driver).executeScript("window.open('about:blank')");
  ArrayList<String> tabs = new ArrayList<String>(driver.getWindowHandles());
  driver.switchTo().window(tabs.get(0));
  driver.switchTo().defaultContent();
  int i = 0;
  String lastSongName = "";
  int count = 0;
  while (true){
   if(i > Integer.MAX_VALUE - 2){
    break;
   }
   i++;
   s = driver.getPageSource();
   driver.switchTo().window(tabs.get(1)); //switches to new tab
   String songs = null;
   try{
    driver.get("https://music.163.com/user/home?id=" + userId);
    driver.switchTo().frame("contentFrame");
    songs = group(driver.getPageSource(), "累积听歌(\\d+)首", 1);
   } catch (TimeoutException e){
    logger.error(e.getMessage(), e);
   }
   driver.switchTo().window(tabs.get(0));
   Matcher matcher = pattern.matcher(s);
   Matcher songNameMatcher = songName.matcher(s);
   if (matcher.find() && songNameMatcher.find()){
    String songNameStr = songNameMatcher.group(1);
    if (!songNameStr.equals(lastSongName)){
     count++;
     lastSongName = songNameStr;
    }
    logger.info(songNameStr + "-" + matcher.group(1) + matcher.group(2) + "---当前播放第" + count + "首歌曲, 累计听歌:" + songs);
   } else {
    logger.info("解析歌曲播放记录或歌曲名失败");
   }
   Thread.sleep(1000 * 30);
  }
 }
 public static String group(String str, String regex, int index) {
  Pattern pattern = Pattern.compile(regex);
  Matcher matcher = pattern.matcher(str);
  return matcher.find() ? matcher.group(index) : "";
 }
}

运行注意事项

  • 修改自己相关chromedriver路径配置
  • 登录自己的web端网易云音乐:https://music.163.com/
  • 复制自己登录成功的原始cookies,至代码中的RAW_COOKIES字段
  • 切换歌单,如果默认的歌单播放完成后,可以搜索一些没有播放过的歌单,类似https://music.163.com/#/playlist?id=22336453的url,提取出id,直接替换代码中的startId字段。

总结

  • 大家可能会有疑问,我想把这个任务放到自己的服务器上直接后台运行。这就是服务器上搭建selenium运行环境的问题了,可以参考我上一篇文章。阿里云和腾讯云最低配的服务器都能够跑起来的。
  • 另外这里为啥采用selenium的方式,有没有其他更简单的方式,直接通过简单的Http请求的方式达到刷的效果。我个人尝试过像通过纯http 请求的方式,找到增加个人累计听歌数的请求,由于网银云的请求都做了加密,最终没有找到。所以就用selenium的方式来代替。

最后

完整工程代码见:https://github.com/wycm/crawler-set/tree/master/music163

版权声明
作者:wycm
出处:https://my.oschina.net/wycm/blog/3023967

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java selenium教程环境搭建方法

    webdriver 就是selenium 2.    webdriver 是一款优秀的,开源的,自动化测试框架. 支持很多语言.  本文描述的是用java Eclipse 如何搭建环境 阅读目录 首先下载好Eclipse 和配置好Java 环境变量 方法一 添加jar包 方法二 直接引用selenium-server-standalone.jar  首先下载好Eclipse 和配置好Java 环境变量: http://www.jb51.net/article/87443.htm 方法一 添加ja

  • java selenium教程环境搭建基于Maven

    现在Java的大部分项目都是基于Maven,  在Maven项目中使用Selenium2. 非常简单. 首先你需要配置好Maven的环境 可以参考Maven安装以及eclipse配置maven的方法: http://www.jb51.net/softjc/416034.html 官方的文档 http://docs.seleniumhq.org/download/maven.jsp 新建一个Maven的Project 添加如下到你的POM.XML, 就可以了 <dependency> <g

  • java selenium教程之selenium详细介绍

    Selenium 是目前用的最广泛的Web UI 自动化测试框架. 本系列文章,将深入简出来讲解selenium 的用法 阅读目录 selenium 的命名 selenium 的意思是 硒   (有点QTP 杀手的意思) QTP mercury 是水银     硒可以对抗水银 QTP 目前的价格是  三个单机版 十万人民币左右, 越来越少的人用QTP了 什么是selenium 一套软件工具,用来支持不同的自动化测试方法 开源软件:可以根据需要来增加重构工具的某些功能 跨平台:linux , wi

  • java selenium操作弹出对话框示例讲解

    Web 开发人员通常需要利用JavaScript弹出对话框来给用户一些信息提示, 包括以下几种类型 阅读目录 对话框类型 测试页面 Selenium 操作对话框的代码 对话框类型 1.  警告框: 用于提示用户相关信息的验证结果, 错误或警告等 2. 提示框: 用于提示用户在当前对话框中输入数据,一般需要用户单击取消或者确认按钮 3. 确认框: 用于提示用户确认或者取消某个操作,一般需要用户单击取消或者确认按钮 测试页面 用如下页面为例进行讲解, 包括了警告框,提示框,确认框 http://si

  • java selenium Selenium IDE介绍及用法

    Selenium IDE 是Firefox 浏览器的一个插件, 它会记录你对Firefox的操作,并且可以回放它的操作. 用法简单,不过我觉得这个没多大的用处 阅读目录 Selenium IDE 介绍 Selenium IDE 的作用 Selenium IDE 在线安装方法一 Selenium IDE 安装方法二 (本地安装) Selenium IDE  安装不上的原因. 打开Selenium Selenium IDE 的使用方法 界面介绍 导出脚本 Selenium IDE 介绍 Seleni

  • java selenium元素定位大全

    页面元素定位是自动化中最重要的事情, selenium Webdriver 提供了很多种元素定位的方法.  测试人员应该熟练掌握各种定位方法. 使用最简单,最稳定的定位方法. 阅读目录 自动化测试步骤 定位方法大全 如何定位 通过ID查找元素: By.id() 通过Name查找元素:By.name() 通过TagName查找元素: By.tagName() 通过ClassName 查找元素 By.className 通过LinkText查找元素 By.linkText(); 通过PartialL

  • java selenium处理Iframe中的元素示例

    java selenium  处理Iframe 中的元素 有时候我们定位元素的时候,发现怎么都定位不了. 这时候你需要查一查你要定位的元素是否在iframe里面 阅读目录 什么是iframe iframe 就是HTML 中,用于网页嵌套网页的. 一个网页可以嵌套到另一个网页中,可以嵌套很多层. selenium 中提供了进入iframe 的方法 // 进入 id 叫frameA 的 iframe dr.switchTo().frame("frameA"); // 回到主窗口 dr.sw

  • java+selenium 网易云音乐刷累计听歌数的方法

    背景 应该是在去年的时候,刷知乎看到一个问题,大概是说怎么刷网易云音乐个人累计听歌数,然后有一个高赞回答,贴了一段js代码,直接在浏览器console执行就可以了.当时试了下,直接一下子刷了有好几万.悲剧的是,第二天又回到原来的样子了,很明显这种方式被网易云音乐发现封掉了.而且后续网易云还针对累计听歌数加了一些限制,每天最多增加300首.今天带来一种通过java+selenium的方式,自动播放歌曲,来达到刷累计听歌数的效果.另外借助这个demo,对selenium的使用更加熟悉,也算是爬虫应用

  • Vuejs仿网易云音乐实现听歌及搜索功能

    前言 前端时间学了vue,一开始看了vue1.0,后来实在觉得技术总得实践,就直接上手vue2.0.然后花了将近一周时间做了一个网易云音乐的小项目.一开始觉得项目比较小,没必要用vuex所以就没有使用,但是后来发现数据流传输有点麻烦,后续会使用vuex. 技术栈 vue+vue-router(核心框架) better-scroll(使移动端滑动体验更加流畅) vue-lazyload(用户图片懒加载) nprogress(用于加载过渡) axios(请求) 功能分析与设计 首先我先参考了现有的一

  • 详解python selenium 爬取网易云音乐歌单名

    目标网站: 首先获取第一页的数据,这里关键要切换到iframe里 打印一下 获取剩下的页数,这里在点击下一页之前需要设置一个延迟,不然会报错. 结果: 一共37页,爬取完毕后关闭浏览器 完整代码: url = 'https://music.163.com/#/discover/playlist/' from selenium import webdriver import time # 创建浏览器对象 window = webdriver.Chrome('./chromedriver') win

  • Scrapy+Selenium自动获取cookie爬取网易云音乐个人喜爱歌单

    此货很干,跟上脚步!!! Cookie cookie是什么东西? 小饼干?能吃吗? 简单来说就是你第一次用账号密码访问服务器 服务器在你本机硬盘上设置一个身份识别的会员卡(cookie) 下次再去访问的时候只要亮一下你的卡片(cookie) 服务器就会知道是你来了,因为你的账号密码等信息已经刻在了会员卡上 需求分析 爬虫要访问一些私人的数据就需要用cookie进行伪装 想要得到cookie就得先登录,爬虫可以通过表单请求将账号密码提交上去 但是在火狐的F12截取到的数据就是, 网易云音乐先将你的

  • 用Python实现网易云音乐的数据进行数据清洗和可视化分析

    目录 Python实现对网易云音乐的数据进行一个数据清洗和可视化分析 对音乐数据进行数据清洗与可视化分析 对音乐数据进行数据清洗与可视化分析 歌词文本分析 总结 Python实现对网易云音乐的数据进行一个数据清洗和可视化分析 对音乐数据进行数据清洗与可视化分析 关于数据的清洗,实际上在上一一篇文章关于抓取数据的过程中已经做了一部分,后面我又做了一下用户数据的抓取 歌曲评论: 包括后台返回的空用户信息.重复数据的去重等.除此之外,还要进行一些清洗:用户年龄错误.用户城市编码转换等. 关于数据的去重

  • vue仿网易云音乐播放器界面的简单实现过程

    由于工作项目的需要,需要使用到歌曲播放,参考多方资料,写了一个仿网易云音乐播放界面,能完整的实现音乐播放功能. 前端简单的使用vue组件和audio标签实现了播放器界面,后端则是调用网易云的API获取对应的歌曲信息.  废话不多说上代码 歌曲播放界面(musicPlay.vue) <template> <div class="main-page"> <audio :src="songInfo.url" id="music&qu

  • Python爬取网易云音乐热门评论

    最近在研究文本挖掘相关的内容,所谓巧妇难为无米之炊,要想进行文本分析,首先得到有文本吧.获取文本的方式有很多,比如从网上下载现成的文本文档,或者通过第三方提供的API进行获取数据.但是有的时候我们想要的数据并不能直接获取,因为并不提供直接的下载渠道或者API供我们获取数据.那么这个时候该怎么办呢?有一种比较好的办法是通过网络爬虫,即编写计算机程序伪装成用户去获得想要的数据.利用计算机的高效,我们可以轻松快速地获取数据. 那么该如何写一个爬虫呢?有很多种语言都可以写爬虫,比如Java,php,py

  • Android控件RecyclerView实现混排效果仿网易云音乐

    前言 最近在使用网易云音乐的时候,看到如下图的排版效果图,自己也想实现一个 这里采用网上用法最多的方式,而且是比较简单的方式实现的,想要做项目的同学也可以快速入手搞定首页界面,可以在最快的时间内模仿出来,且效果达到90%以上的相似 效果演示 至于图片的加载你们可以根据网上的Api获取相应的图片加载到对应的位置,这里只是采用本地图片来演示 实现分析 这里是采用RecyclerView的GridLayoutManager的一个SpanSize这么一个东西,从下图很容易知道其意思 项目结构 项目结构可

  • python爬取网易云音乐排行榜实例代码

    目录 网易云音乐排行榜歌曲及评论爬取 一.模拟登录 二.排行榜数据爬取 三.排行榜评论获取 总结 网易云音乐排行榜歌曲及评论爬取 主要注意问题:selenium 模拟登录.iframe标签定位.页面元素提取. 在利用selenium定位元素并取值的过程中遇到问题.比如xpath正确但无法定位,在进行翻页提取评论的过程中,利用selenium似乎不能提取不同页的数据,比如,明明定位的第三页的评论数据,而只能返回第一页的评论数据. 一.模拟登录 selenium 定位元素模拟人的操作进行登录,直接上

  • 微信小程序实战之网易云音乐歌曲详情页实现代码

    这里记录一下做网易云小程序的音乐播放详情页面的代码. 音乐播放界面的主要的重点有几个: 1.磁盘和摇杆的旋转效果,这里运用了css的动画属性 2.音乐播放和暂停,下一首/上一首等播放效果的实现 3.进度条的样式和控制 4.和上一页音乐推荐列表页通信,利用订阅与发布Pubsub HTML代码及要点 <!--pages/songDetail/songDetail.wxml--> <view class="songDetailContainer"> <view

随机推荐