最近在研究springboot,就想着结合爬虫做个网易云音乐在线搜索的功能,先上波效果图把

抓取使用的是selenium+chormedriver,也试过phantomsjs,但是对于页面的元素等待好像不支持,加上chromedriver有无界面模式,所以就选择这种搭配方式。抓取的时候首先按是设置chormedriver的路径与无界面模式,需要放在电脑chorme浏览器的安装目录下

 String loadurl = MessageFormat.format("https://music.163.com/#/search/m/?s={0}&type=1", URLEncoder.encode(musicname));String DRIVER_PATH = "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe";System.setProperty("webdriver.chrome.driver",DRIVER_PATH);ChromeOptions opt = new ChromeOptions();//使用谷歌的无头模式 PhantomJS后续高版本不在收到seleunim的支持,且开源暂停开发opt.addArguments("headless");WebDriver driver = new ChromeDriver(opt);

然后访问网易云音乐主页,其中的url是通过构造搜索形式的地址直接访问,type=1是指歌曲搜索,注意网页中的搜索列表内容部分是内嵌的iframe,需要进行浏览器的dom切换

  //切换到内嵌iframe中driver.switchTo().frame("g_iframe");

接下来就是对搜索列表的内容dom结构分析,首先确定外层容器class=srchsongst,里面的各条数据的class为以item开头,后面加标识的div

 List<WebElement> songlist = driver.findElement(By.className("srchsongst")).
findElements(By.cssSelector("div[class^='item']"));

定位到行之后,需要对歌曲的各个列进行元素抽取,首先获取歌曲id,这个id后面有作用,因为歌曲id的div没有特别唯一的class或者其他属性,不能靠常规的css选择来定位,找寻顾虑后,发现id的容器始终是行数据的第1个div,所以可以采用chidren列表的方式取到目标div

 String songid =  song.findElement(By.cssSelector("div:nth-child(1)")).
findElement(By.tagName("a")).getAttribute("data-res-id");

下面还要获取歌曲的url(用来进一步获取评论),歌曲名称,作者,专辑,时间,采用常规的css选择器就可以

String url = URLEncoder.encode(song.
findElement(By.cssSelector("div[class$='w0']")).findElement(By.tagName("a")).getAttribute("href"));
String musciname = song.findElement(By.cssSelector("div[class$='w0']")).
findElement(By.tagName("b")).getAttribute("title");
String author = song.findElement(By.cssSelector("div[class$='w1']")).
findElement(By.className("text")).getText();
String album = song.findElement(By.cssSelector("div[class$='w2']")).
findElement(By.tagName("a")).getText();
String time = song.findElement(By.cssSelector("div:nth-child(6)")).getText();

获取其他三个栏位,歌手专辑,歌单原理差不多,只需要模拟鼠标事件点击tab栏进行切换,看下代码

//歌手driver.findElement(By.cssSelector("a[data-type='100']")).click();//等待页面数据加载完成WebDriverWait wait = new WebDriverWait(driver, 20);//com.google.guava版本问题引起的传入函数条件不满足泛型wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("ul[class^='m-cvrlst']")));List<WebElement> authorinfolist = driver.
findElement(By.cssSelector("ul[class^='m-cvrlst']")).findElements(By.cssSelector("div[class^='u-cover']"));List<AuthorInfo> authorlist = new ArrayList<AuthorInfo>();for(WebElement author:authorinfolist){AuthorInfo authorInfo = new AuthorInfo();String imageurl = author.findElement(By.tagName("img")).getAttribute("src");String authorname = author.findElement(By.tagName("span")).getAttribute("title");authorInfo.setAutorname(authorname);authorInfo.setImageurl(imageurl);authorlist.add(authorInfo);}

其中a[data-type='100']代表的就是栏目标签,type的值不同代表栏位不同,wait.unti方法就是之前所说的等待页面某个元素加载的方法,因为切换栏位可能由于ajax加载或者页面的数据部分刷新,可能数据没有完全展示出来就进行dom分析,导致数据抓不到,其他2个栏目抓取方法大同小异,最后会给大家贴上源码地址。

抓取完毕列表,就可以开始访问歌曲详细页面进行评论抓取了,老规矩,先分析dom结构,这边因为不需要等待元素,所以使用了phantomjs,先进行一系列设置

  //抓取网页DesiredCapabilities dcaps = new DesiredCapabilities();//ssl证书支持dcaps.setCapability("acceptSslCerts", true);//截屏支持dcaps.setCapability("takesScreenshot", true);//css搜索支持dcaps.setCapability("cssSelectorsEnabled", true);//js支持dcaps.setJavascriptEnabled(true);try {//驱动支持dcaps.setCapability(PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY,ResourceUtils.getURL("src/main/resources/static/plugins/phantomjs/").getPath()+"phantomjs.exe");}catch (Exception e){System.out.println("phantomjs error");e.printStackTrace();}//创建无界面浏览器对象PhantomJSDriver driver = new PhantomJSDriver(dcaps);driver.get(url);//切换到内嵌iframe中driver.switchTo().frame("g_iframe");

首先定位外层容器地div class=m-cmmt,再到行数据div class=itm,再定位到最底层容器cntwrap,评论内容是以cnt开头class的div,评论时间是time开头class的div

 String nickname = content.findElement(By.tagName("a")).getText();String commentcontent =content.findElement(By.cssSelector("div[class^='cnt']")).
getText().replace(nickname+":","");String commentdate = content.findElement(By.cssSelector("div[class^='time']")).getText();

上个效果图

最后讲下下载功能,网易云有一个外链播放地址http://music.163.com/song/media/outer/url?id=,id后面传之前我们获取到的歌曲id就可以,打开是个外链播放器,直接下载既可以

注:chromedriver和电脑安装的浏览器版本要一致,下面给出对应列表连接

对应列表:https://blog.csdn.net/yoyocat915/article/details/80580066

驱动列表:http://npm.taobao.org/mirrors/chromedriver/

源码地址

前端:https://github.com/grassprogramming/yblog/tree/master/main/resources/static/pages/spider/music

后端:https://github.com/grassprogramming/yblog/tree/master/main/java/com/blog/spider/controller

selenium抓取网易云音乐评论及歌曲信息相关推荐

  1. Selenium爬取网易云音乐评论

    Selenium爬取网易云音乐评论 一.爬取工具 1.1 selenium ​ selenium这是一个第三方库我们可以通过 pip install selenium来安装这个第三方库. ​ Sele ...

  2. 使用selenium抓取网易云音乐数据

    今天通过一个简单的网易云音乐排行榜数据抓取与音乐下载实战案例,带着大家一起来学习如何抓取动态生成的页面内容.网易云音乐排行榜网址:https://music.163.com/#/discover/to ...

  3. 爬虫之js加密破解抓取网易云音乐评论生成词云

    js破解历程 前言 技能点 界面概况 静态网页 动态网页 页面解析 step1: 找参数 step2:分析js函数 step3:分析参数 step4: 校验 step5:转为python代码 编写爬虫 ...

  4. Python爬虫之js加密破解,抓取网易云音乐评论生成词云

    js破解历程 前言 技能点 界面概况 静态网页动态网页 页面解析 step1: 找参数step2:分析js函数step3:分析参数step4: 校验step5:转为python代码 编写爬虫 很多人学 ...

  5. 用python爬取网易云评论10w+的歌曲名_Python爬取网易云音乐评论热门歌曲和ID

    一.构造歌手个人主页的URL 前段时间我们获取了网易云音乐全部歌手的id号,今天我们就利用全部歌手的id号来构造歌手个人主页的URL,从而实现用爬取全部歌手的热门歌曲及其id号的目的.以歌手 薛之谦的 ...

  6. python3爬取网易云歌单数据清洗_网页抓取网易云音乐及评论数据分析

    网页抓取网易云音乐及评论数据分析 游贤 成都理工大学信息科学与技术学院 [摘 要] 摘要:为了分析网易云音乐中哪些歌曲是热门歌曲,哪些歌曲的评论 最多,从而了解到人们对于不同音乐类型的喜爱程度,采用成 ...

  7. python爬虫网易云音乐最热评论并分析_Python3实现爬虫抓取网易云音乐的热门评论分析(图)...

    这篇文章主要给大家介绍了关于Python3实战之爬虫抓取网易云音乐热评的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧. ...

  8. python爬虫网易云音乐评论最多的歌_Python3实战之爬虫抓取网易云音乐的热门评论...

    前言 之前刚刚入门python爬虫,有大概半个月时间没有写python了,都快遗忘了.于是准备写个简单的爬虫练练手,我觉得网易云音乐最优特色的就是其精准的歌曲推荐和独具特色的用户评论,于是写了这个抓取 ...

  9. python3之Scrapy+Selenium切换iframe抓取网易云音乐排行榜

    Scrapy+Selenium切换iframe抓取网易云音乐排行榜 iframe标签 Selenium (WEB自动化工具) Scrapy 框架 iframe标签 了解一下iframe 百度百科介绍的 ...

最新文章

  1. 关于学习Python的一点学习总结(12->字典相关操作)
  2. Android 图片放错位置会拉伸变形
  3. 「后端小伙伴来学前端了」Vuex原理图分析及结合生活案例让大家快速理解
  4. hdu 3367 Pseudoforest (最大生成树 最多存在一个环)
  5. 位,字,字节之间关系及关联知识普及
  6. web安全---XSS利用平台BLUE-LOTUS安装与使用
  7. python猜猜我是几,我在python中猜数游戏的问题
  8. 关于redis的pipline和lua脚本
  9. python编程入门与案例详解-Python零基础必看的入门书藉:Python编程从入门到实践...
  10. fopen java_fopen()函数
  11. 用word怎么做c语言框图作业,在Word中绘制简单C语言流程图精.docx
  12. java windowbuilder下载_Java WindowBuilder 安装及基本使用的教程
  13. 手机无线上网何时进入战国时代?
  14. js国内普通车牌正则验证
  15. BCNF无损分解例题
  16. 【爬虫】谷歌、必应、百度图片爬取用于深度学习
  17. 激荡十年:详谈云计算的过去、现在和未来
  18. API请求获取美句美图等
  19. 微机原理与接口技术[第三版]——第三章课后习题答案
  20. 程序猿面试题:为什么曹操能号令诸侯?

热门文章

  1. 【题解】LeetCode-两数相加(add-two-numbers)
  2. SD卡的SDIO模式/SPI模式设计扫盲
  3. Java内部类序列化
  4. win10输入法设置在哪里?对于输入法设置的图文教程
  5. 去年,今年,明年...
  6. 有合并单元格时的排序问题
  7. 算法设计与分析-分支限界法习题
  8. 第一章:基于 SpringBoot 快速搭建QQ机器人,并监听群事件
  9. 京东众筹:3D手机看片黑科技,画面清晰逼真
  10. 幻塔html5,《幻塔》祝玩家节日快乐,《原神》意外“躺枪”,米哈游这波真冤...