WebMagic+Selenium爬取网易云音乐

2023-10-19 02:40

本文主要是介绍WebMagic+Selenium爬取网易云音乐,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

**在阅读本文章之前需要您具备一些WebMagic和Selenium的知识

像网易云音乐、QQ音乐等音乐网站,都会对音乐地址进行加密
这里提供给大家一个外链转换的网站
https://link.hhtjim.com/
在这里插入图片描述
找到网易云这一栏
id后面的这一堆数字就是歌曲的id
最后生成的https://link.hhtjim.com/163/5146554.mp3即为该首音乐的外链地址
打开看一看
在这里插入图片描述
果然为音乐的源地址
地址有什么规律呢,我们再输入几个音乐的id
在这里插入图片描述
规律很明显了
歌曲源地址为https://link.hhtjim.com/163/******.mp3
那么我们的思路就很清晰了,通过歌单页面获取音乐id,将id拼接为外链地址,进入该地址下载歌曲

代码走起

一、导入依赖

		<dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>3.4.0</version></dependency><dependency><groupId>us.codecraft</groupId><artifactId>webmagic-core</artifactId><version>0.7.3</version></dependency><dependency><groupId>us.codecraft</groupId><artifactId>webmagic-extension</artifactId><version>0.7.3</version></dependency>

二、解析页面
这里我选取了网易云音乐的top榜单
在这里插入图片描述https://music.163.com/#/discover/toplist
现在开始对音乐列表进行解析,相信了解爬虫的朋友对解析页面丝毫不陌生
F12观察一下这些歌曲在什么地方呢
在这里插入图片描述
原来存放在class=“m-table m-table-rank”的table里,每个tr就是一首歌曲
那么table的xpth为://table[@class=‘m-table m-table-rank’]
验证一下xpth是否正确
在这里插入图片描述
结果竟然为空?是我们的xpth写错了吗?
其实我们并没有错,而是这个table藏在了框架iframe里,导致外部程序找不到他

那我们进入到框架找他不就完事了
这就用到了selenium,它提供了方法可以进入到框架里面

首先确定框架是哪个
在这里插入图片描述
可以通过iframe的id和name确定
也可以用xpth定位到节点

//*****找到歌单列表所在的框架WebElement iframelement = driver.findElement(By.xpath("//iframe[@id='g_iframe']"));//*****进入框架driver.switchTo().frame(iframelement);

进入框架就可以对歌曲信息随意解析了
我们先找到table

		//找到存放歌曲的tableWebElement table= wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//table[@class='m-table m-table-rank']")));

每首歌曲的信息在tr标签里
找到所有tr节点

		//获取所有歌曲所在的tr节点List<WebElement> trs = table.findElements(By.xpath("//tbody/tr"));System.out.println("歌单共有歌曲"+trs.size()+"首");

到了最重要的环节了

  1. 获取歌曲idname
  2. 拼接外链地址https://link.hhtjim.com/163/id.mp3

以第一首歌曲为例
在这里插入图片描述
歌曲id和name太明显了
在这里插入图片描述
标签a的xpth:.//span[@class=‘txt’]/a
歌曲id在a标签的href属性里
同理歌名位于b标签的title属性
上面的"."的含义为“当前”
结合这段代码tr.findElement(By.xpath(".//span[@class='txt']/a"))
他的含义为:当前这个tr里的class为txt的span下的a节点

List<WebElement> trs = table.findElements(By.xpath("//tbody/tr"));
for (WebElement tr : trs) {//获取歌曲idString id = tr.findElement(By.xpath(".//span[@class='txt']/a")).getAttribute("href").split("=")[1];//获取歌曲nameString name = tr.findElement(By.xpath(".//span[@class='txt']/a/b")).getAttribute("title").replace("\n", "");//拼接外链地址String realUrl="https://link.hhtjim.com/163/" + id + ".mp3";//****将外链地址加入到url队列中,等待被解析page.addTargetRequest(realUrl);//将歌曲id与name存入mapmap.put(id,name);}

通过上述代码我们获取到了音乐id和name,并且将外链地址加入到了请求队列中。

最后就是解析存在于请求队列中的每个url页面
只要是外链地址所在的url则进行下载
完整代码

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.processor.PageProcessor;import java.io.*;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class Music163 implements PageProcessor {//定义存放音乐id和name的字典Map<String,String> map=new HashMap<>();/*** 用于下载音乐的方法* @param page page*/public void download(Page page){//在桌面创建盛放音乐的文件夹File directory = FileSystemView.getFileSystemView().getHomeDirectory();File file = new File(directory.getPath()+"\\网易云音乐Top");if(!file.exists()){file.mkdirs();}byte[] bytes = page.getBytes();//将页面数据转换为二进制数据存入byte数组FileOutputStream outputStream=null;try {String url = page.getUrl().toString();/*通过字符串截取得到url的音乐id部分例如:https://link.hhtjim.com/163/123456.mp3最后得到的id为123456*/String id=url.substring(url.lastIndexOf("/")+1,url.lastIndexOf("."));//通过id确定歌名String name=map.get(id);//获取输入流outputStream = new FileOutputStream(file.getAbsolutePath()+"\\"+name+".mp3");outputStream.write(bytes);outputStream.flush();System.out.println("《"+name+"》下载完成");} catch (Exception e) {e.printStackTrace();}finally {if(outputStream!=null){try {outputStream.close();} catch (IOException e) {e.printStackTrace();}}}}/*** 解析页面* 用于获取音乐id和名称* 通过id构造音乐外链地址* @param page page*/public void addRealMusicUrl(Page page){//创建谷歌浏览器驱动WebDriver driver = new ChromeDriver();//进入页面driver.get(page.getUrl().toString());//*****找到歌单列表所在的框架WebElement iframelement = driver.findElement(By.xpath("//iframe[@id='g_iframe']"));//*****进入框架driver.switchTo().frame(iframelement);/*实际场景中可能会发生页面节点没有加载出来但是程序已经跑完的情况可以利用显示等待,等待节点加载出来程序继续运行但是不能无限等待这里设置等待时长为5秒超过这个时间就会抛出异常*/WebDriverWait wait = new WebDriverWait(driver, 5);//等待存放歌曲的table节点出现WebElement table = wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//table[@class='m-table m-table-rank']")));//获取所有歌曲所在的tr节点List<WebElement> trs = table.findElements(By.xpath("//tbody/tr"));System.out.println("歌单共有歌曲"+trs.size()+"首");for (WebElement tr : trs) {//获取歌曲idString id = tr.findElement(By.xpath(".//span[@class='txt']/a")).getAttribute("href").split("=")[1];//获取歌曲nameString name = tr.findElement(By.xpath(".//span[@class='txt']/a/b")).getAttribute("title").replace("\n", "");System.out.println(id);//拼接外链地址String realUrl="https://link.hhtjim.com/163/" + id + ".mp3";//****将外链地址加入到请求队列中,等待被解析page.addTargetRequest(realUrl);//将歌曲id与name存入mapmap.put(id,name);}}
/*** 实现WebMagic框架的process方法* 每次解析队列中的请求都会调用该方法* @param page*/public void process(Page page) {//网易云外连格式https://link.hhtjim.com/163/音乐Id.mp3if(page.getUrl().toString().contains("mp3")){//如果页面的url含有mp3,则为音乐源地址,下载download(page);}else {//解析歌单页面addRealMusicUrl(page);}}/*对爬虫进行配置设置超时时间和编码方式*/private Site site=Site.me().setTimeOut(5000).setCharset("utf8");public Site getSite() {return site;}public static void main(String[] args) {String startUrl="https://music.163.com/#/discover/toplist";//起始歌单的url//启动爬虫Spider.create(new Music163()).addUrl(startUrl).run();}
}

最后瞅一瞅文件夹
在这里插入图片描述
果然爬到了!!

总结一下

  1. 导入WebMgic和Selenium依赖
  2. 解析页面,找到音乐的id进行外链地址拼接,然后将外链地址加入到请求队列中
  3. 将url为外链地址的页面进行下载并保存为MP3格式

第一次写文章没有经验,如果有不足之处望批评指正。

这篇关于WebMagic+Selenium爬取网易云音乐的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/236753

相关文章

Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)

《Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)》本文介绍了如何使用Python和Selenium结合ddddocr库实现图片验证码的识别和点击功能,感兴趣的朋友一起看... 目录1.获取图片2.目标识别3.背景坐标识别3.1 ddddocr3.2 打码平台4.坐标点击5.图

UniApp实现漂亮的音乐歌词滚动播放效果

在现代的音乐播放应用中,歌词的展示和滚动播放已经成为了一个非常常见的功能。今天,我们将通过UniApp来实现一个漂亮的歌词滚动播放功能。我们将使用UniApp提供的组件和API来完成这个任务。 页面结构 在页面的模板部分,我们需要创建一个音频播放器和歌词展示区域。使用<scroll-view>组件来实现歌词的滚动效果。 <template><view class="audio-co

如何使用Selenium捕获控制台日志

Selenium是一个流行的开源工具,用于自动化Web浏览器。其中一个关键功能是能够与浏览器的开发者控制台交互。本文将向您展示如何在Selenium中使用Java获取控制台日志。这些日志对于调试和解决Selenium脚本的问题非常有用。 如何查看任何网页的控制台日志 首先,打开浏览器的开发者控制台。在大多数浏览器中,您可以通过右键点击页面并选择“检查”来做到这一点。我们将在我们的测试网站——h

大厂算法例题解之网易2018秋招笔试真题 (未完)

1、字符串碎片 【题目描述】一个由小写字母组成的字符串可以看成一些同一字母的最大碎片组成的。例如,“aaabbaaac” 是由下面碎片组成的:‘aaa’,‘bb’,‘c’。牛牛现在给定一个字符串,请你帮助计算这个字符串的所有碎片的 平均长度是多少。 输入描述: 输入包括一个字符串 s,字符串 s 的长度 length(1 ≤ length ≤ 50),s 只含小写字母(‘a’-‘z’) 输出描述

0基础学习爬虫系列:网页内容爬取

1.背景 今天我们来实现,监控网站最新数据爬虫。 在信息爆炸的年代,能够有一个爬虫帮你,将你感兴趣的最新消息推送给你,能够帮你节约非常多时间,同时确保不会miss重要信息。 爬虫应用场景: 应用场景主要功能数据来源示例使用目的搜索引擎优化 (SEO)分析关键词密度、外部链接质量等网站元数据、链接提升网站在搜索引擎中的排名市场研究收集竞品信息、价格比较电商网站、行业报告制定更有效的市场策略舆情

QT项目实战之音乐播放器2.0版本

该版本相较于1.0版本最主要的不同在于连接数据库实现类似于歌曲收藏和取消收藏的功能。 详细情况看我的这篇文章http://t.csdnimg.cn/WS5s8。 效果展示 VSMyMusicShow2.0 define.h UseMySQL.h   musicInfo.h   VSMyMusicPlayer.h

《黑神话:悟空》专题合集MOD/修改器/壁纸/音乐/CG剧情

《黑神话:悟空》专题合集」 链接:https://pan.quark.cn/s/d67857f4e308 包含内容: 《黑神话:悟空》MOD合集 《黑神话:悟空》修改器(风灵月影) 《黑神话:悟空》壁纸合集 《黑神话:悟空》3小时CG完整剧情合集 4K120帧最高画质!国语 简中字幕 附:4K 结尾动画合集 ​​​国语 简中字幕 《黑神话:悟空》主题曲 《黑神话

python网络爬虫(五)——爬取天气预报

1.注册高德天气key   点击高德天气,然后按照开发者文档完成key注册;作为爬虫练习项目之一。从高德地图json数据接口获取天气,可以获取某省的所有城市天气,高德地图的这个接口还能获取县城的天气。其天气查询API服务地址为https://restapi.amap.com/v3/weather/weatherInfo?parameters,若要获取某城市的天气推荐 2.安装MongoDB

selenium的webdriver三种等待方式(显式等待WebDriverWait+implicitly_wait隐式等待+sleep强制等待)

隐式等待是等页面加载,不是等元素!!! 1、显式等待  一个显式等待是你定义的一段代码,用于等待某个条件发生然后再继续执行后续代码。显式等待是等元素加载!!! from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import

28.8K Star,音乐新体验,开启你的高颜值音乐之旅

Hi,骚年,我是大 G,公众号「GitHub 指北」会推荐 GitHub 上有趣有用的项目,一分钟 get 一个优秀的开源项目,挖掘开源的价值,欢迎关注。 导语 音乐是生活中不可或缺的调味品,一个好的音乐播放器能够极大地提升我们的听觉享受。今天,我要向大家推荐一个名为 YesPlayMusic 的第三方网易云音乐播放器,它不仅拥有高颜值的界面设计,还支持跨平台使用,让你的音乐体验更上一层楼