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

相关文章

人工智能做音乐

0 别人做的音乐demo https://yun.baidu.com/share/link?shareid=1799925478&uk=840708891 1 为什么人工智能能做音乐? 最下面蓝色的部分是你输入的音乐。 从上图可以看出,input是一个个的点,然后通过input来相互结合生成灰色的点,经过几层的连接之后,最后的Output就是新生成的音乐,也就是黄色的点。 把黄色的点

AI与音乐:当技术与艺术发生冲突

AI在创造还是毁掉音乐? 在科技日新月异的今天,人工智能(AI)已经渗透到了我们生活的方方面面,音乐领域也不例外。然而,尽管AI为音乐创作带来了前所未有的便利,我却深感其正在毁掉音乐的本质。 首先,AI的介入使得音乐创作过程变得过于机械化。传统的音乐创作往往需要音乐家们经过长时间的思考、尝试和修改,最终才能创作出触动人心的作品。这一过程不仅体现了音乐家的才华和技艺,更蕴含了他们对生活的感悟和对

Tkinter和selenium结合实现登录UC后台,最后打包成exe

主要实现的功能:小号模式自动登录UC阿里汇川广告后台,屏蔽账号密码输入 主要用的技术:用Tkinter展示所有的广告账号界面,使用selenium控制谷歌浏览器,打开阿里汇川登录页,登录汇川后台。 第一次写,遇到的坑比较多,三天,搞定。给自己一个棒棒~☺️ import Tkinter as tk import osimport sysimport requestsfrom sel

AI与音乐:共创未来还是艺术终结?

随着人工智能技术的不断进步,AI在音乐创作领域的应用已经成为了一个不可忽视的现象。最近一个月,一系列音乐大模型的推出,不仅极大地降低了普通人创作音乐的门槛,也引发了关于音乐产业未来的广泛讨论。AI是否正在创造音乐的新纪元,还是正在逐渐毁掉这一艺术形式?本文将深入探讨人工智能和音乐人的合作模式,讨论AI在音乐创作中的辅助作用,以及如何实现人机共同创作的可能性。 AI与音乐人的合作模式 在探讨

Selenium进行Web自动化测试

Selenium进行Web自动化测试 Selenium+Python实现Web自动化测试一、环境配置 Selenium+Python实现Web自动化测试 一、环境配置 环境基于win10(X64) 安装Python;安装PyCham安装chomedriver chomedriver下载地址 可以查看本地chrome软件版本下载对应的chomedriver,如果没有则下载最新

Node.js版Selenium WebDriver教程

目录 介绍 导言 Selenium基础 环境设置 使用npm安装selenium-webdriver模块 配置和管理浏览器驱动器 下载火狐 下载安装 webDriver 第一个WebDriver脚本 介绍 导言 在当今数字化时代,Web应用程序的质量和性能至关重要。为了确保这些应用的可靠性,自动化测试成为一种不可或缺的工具。Selenium,作为自动化测试领域的瑰宝

selenium Python自动化测试(基本的键盘事件)

#coding=utf-8 ''' Created on 2015-5-10 @author: user ''' ''' 几种常用的键盘指令: send_keys(Keys.BACK_SPACE) 删除键(BackSpace) send_keys(Keys.SPACE) 空格键(Space) send_keys(Keys.TAB) 制表

Selenium使用Page Object实现页面自动测试

原文转自:https://blog.csdn.net/zhenyu5211314/article/details/13632083 Page Object模式是Selenium中的一种测试设计模式,主要是将每一个页面设计为一个Class,其中包含页面中需要测试的元素(按钮,输入框,标题等),这样在Selenium测试页面中可以通过调用页面类来获取页面元素,这样巧妙的避免了当页面元素id或者位置变

Selenium WebDriver 3.0 需要注意的事项

首先,要使用WebDriver 3.0 的话 请使用JAVA 8(必要)   其次,由于W3C标准化以及各大浏览器厂商的积极跟进,自WebDriver 3.0 之后,Selenium不再提供默认的浏览器支持. 也就是说 如果你要使用Firefox, 就需要用到Mozilla自己的驱动实现: geckodriver ,这里是github下载地址 https://github.com/mozil

Selenium Test 自动化测试 入门级学习笔记

1、下载安装Firefox-selenium插件    需要下载插件可以联系,这里暂不提供下载地址。   2、集成Eclipse   需要下载jar包可以联系,这里暂不提供下载地址。   集成Eclipse非常简单,加载进去jar包就OK! 3、通过Selenium IDE 录制脚本     { 点这里就开始录制!} 以上操作是:百度输入hao123,点击搜索。 4、