前言

考虑到这里有很多人没有接触过Java网络爬虫,所以我会从很基础的Jsoup分析HttpClient获取的网页讲起。了解这些东西可以直接看后面的“正式进入案例”,跳过前面这些基础。我导入的是“Excel转换工具XXL-EXCEL”这个开源项目然后在这个基础上写的这个Demo(下面会详细分析).看了这篇文章还有问题,记得给我留言我会尽力帮你解决。如果文章哪里有问题或者需要改进,也请留言告诉我,共同进步。

项目分析

几天前用HttpClien+Jsoup把网易云音乐的民谣抓取下来,可惜显示效果是下面这样的:

想着如果能像前几天用开源的爬虫爬取知乎后然后导入Excel简单分析也好一点,如下图(下图只是简单的对导入进去的一个人的关注者做了一个排序):

通过查阅文档知道Apache下有一个专门操作office各种文档的API:POI,用这个API的话操作起来原理也很简单,但是很麻烦需要写很多代码,而且条理也不是很清楚。所以去Github上找了找有没有更方便的方法,Github有很多关于这方面的开源项目,经过各种尝试,最终选择了:《Java对象和Excel转换工具XXL-EXCEL》,通过这个框架可以灵活的进行Java对象和Excel文档相互转换。

然后最终就是下面这个效果:

案例基础

①Jsoup解析网页分析

Maven依赖:

org.jsoup

jsoup

1.7.2

请求网页和解析网页,我们都以推酷网:https://www.tuicool.com/为例子。

先看一个实例(本实例获取的是推酷网首页的热门文章的信息):

package news;

import java.io.IOException;

import org.jsoup.Jsoup;

import org.jsoup.nodes.Document;

import org.jsoup.nodes.Element;

import org.jsoup.select.Elements;

public class TuicoolHotArticles {

public static void main(String[] args) throws IOException {

// TODO Auto-generated method stub

String url = "https://www.tuicool.com/";

Document document = Jsoup.connect(url)

.userAgent("Mozilla/5.0 (Windows NT 6.1; rv:30.0) Gecko/20100101 Firefox/30.0").get();

// #id: 通过ID查找元素,比如:#logo

Elements items = document.select(".list_article_item ");

System.out.println(items.size());

for (Element item : items) {

// 标题。(类名title下的 a标签的title属性获取)

String title = item.select(".title a").attr("title");

// 标题图片地址(类名article_thumb_image下的 img标签的src属性获取)

String picture_href = item.select(".article_thumb_image img").attr("src");

// 时间 。(类名tip下的最后一个span标签的文字获取)

String date = item.select(".tip span").last().text();

// 作者 。(类名tip下的第一个span标签的文字获取)

String author = item.select(".tip span").first().text();

System.out.println("标题: " + title);

System.out.println("标题图片地址:" + picture_href);

System.out.println("发布日期 " + date);

System.out.println("作者 " + author);

System.out.println();

System.out.println();

}

}

}

实例结果:

实例分析:

1. 网页元素分析

元素位置->右键->查看元素(Inspent Element)

2. Jsoup解析

通过元素分析我们即可获取所在div类名以及元素的其他属性,通过这些属性我们即可获取该元素。上面代码我已经给你详细的注释,如果还有问题可以留言给我。

如果想了解更详细的Jsoup操作请查看 jsoup中文文档。

②HttpClient请求网页分析

Maven依赖:

org.apache.httpcomponents

httpclient

4.5.4

下面是一个获取推酷首页源代码的例子:

package www.java1234.com.httpclientDemo2;

import java.io.IOException;

import org.apache.http.HttpEntity;

import org.apache.http.client.ClientProtocolException;

import org.apache.http.client.methods.CloseableHttpResponse;

import org.apache.http.client.methods.HttpGet;

import org.apache.http.impl.client.CloseableHttpClient;

import org.apache.http.impl.client.HttpClients;

import org.apache.http.util.EntityUtils;

/**

* TODO 在www.java1234.com.httpclientDemo.HelloWorld2我们获取推酷网热门文章

* 我们这里通过模拟浏览器的方法来重新获取

*

*@date 2017年12月16日

*/

public class GetTuicoolHotArticles {

public static void main(String[] args) throws ClientProtocolException, IOException {

// TODO Auto-generated method stub

CloseableHttpClient httpClient = HttpClients.createDefault(); // 创建httpClient实例

HttpGet httpGet = new HttpGet("https://www.tuicool.com/"); // 创建httpget实例

// 设置请求头信息Uer-Agent模拟浏览器

httpGet.setHeader("User-Agent",

"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0");

CloseableHttpResponse response = httpClient.execute(httpGet); // 执行httpget请求

// 获取响应状态

//System.out.println("响应状态为:" + response.getStatusLine());

HttpEntity entity = response.getEntity(); // 获取返回实体

System.out.println("网页内容:" + EntityUtils.toString(entity, "utf-8"));

// 获取响应内容类型Content-Type

// System.out.println("content-type:" + entity.getContentType());

response.close(); // response关闭

httpClient.close(); // httpClient关闭

}

}

这个例子有一点需要说明的是因为推酷网设置了简单的反爬所以我们这里必须设置请求头信息Uer-Agent模拟浏览器访问,代码已经注释。

如果想深入学习HttpClient,请查看HttpClient官网。

③Maven的简单使用

网上有很多这面的教程,而且Maven这个工具真的很实用,不会的可以在网上找一找教程。再不会留言找我,我教,��嘿嘿。

正式进入本案例

com.xuxueli

xxl-excel

1.0.0

我一共新建了三个类:

Wangyiyun.java:网易云音乐实体类。

WangyiyunMinyao.java:网易云音乐工具类,用于获取存放歌曲对象打得Arraylist集合。

TestWangyiyun.java:测试类,测试获取网易云音乐民谣信息并且输出到Excel中。

因为一次抓取的是一个页面,所以抓取到控制台有输出,速度可能有点慢。

Wangyiyun.java

package com.xuxueli.poi.excel.test.model;

import org.apache.poi.hssf.util.HSSFColor;

import com.xuxueli.poi.excel.annotation.ExcelField;

import com.xuxueli.poi.excel.annotation.ExcelSheet;

@ExcelSheet(name = "网易云音乐民谣分析", headColor = HSSFColor.HSSFColorPredefined.LIGHT_GREEN)

public class Wangyiyun {

@ExcelField(name = "歌曲介绍")

private String description;

@ExcelField(name = "歌曲链接地址")

private String href;

@ExcelField(name = "歌曲播放次数")

private int playNums;

public Wangyiyun() {

}

public Wangyiyun(String description, String href, int playNums) {

this.description = description;

this.href = href;

this.playNums = playNums;

}

public String getDescription() {

return description;

}

public void setDescription(String description) {

this.description = description;

}

public String getHref() {

return href;

}

public void setHref(String href) {

this.href = href;

}

public int getPlayNums() {

return playNums;

}

public void setPlayNums(int playNums) {

this.playNums = playNums;

}

@Override

public String toString() {

return "Wangyiyun [歌曲介绍=" + description + ", 歌曲链接地址=" + href + ", 歌曲播放次数=" + playNums + "]";

}

}

WangyiyunMinyao.java

package utils;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.util.ArrayList;

import org.apache.http.HttpEntity;

import org.apache.http.HttpResponse;

import org.apache.http.client.ClientProtocolException;

import org.apache.http.client.methods.HttpGet;

import org.apache.http.impl.client.CloseableHttpClient;

import org.apache.http.impl.client.HttpClients;

import org.jsoup.Jsoup;

import org.jsoup.nodes.Document;

import org.jsoup.nodes.Element;

import org.jsoup.select.Elements;

import com.xuxueli.poi.excel.test.model.Wangyiyun;

/**

* TODO 该类用于获取保存在Arraylist中的歌曲对象

*@date 2017年12月21日

*/

public class WangyiyunMinyao {

/**

* 该方法爬取了歌曲标题和链接地址并且调用了GetTheNumberOfPlays()方法用于获取歌曲链接地址页面的详细播放次数

*

*@param url_str

*@param charset

*@throws ClientProtocolException

*@throws IOException

*/

public static ArrayList Crawl(String url_str, String charset)

throws ClientProtocolException, IOException {

// 获取

CloseableHttpClient hc=HttpClients.createDefault();

//HttpClient hc = new DefaultHttpClient();

HttpGet hg = new HttpGet(url_str);

HttpResponse response = hc.execute(hg);

HttpEntity entity = response.getEntity();

InputStream htm_in = null;

ArrayList arrayList = new ArrayList<>();

if (entity != null) {

htm_in = entity.getContent();

String htm_str = InputStream2String(htm_in, charset);

Document doc = Jsoup.parse(htm_str);

Elements links = doc.select("div[class=g-bd]").select("div[class=g-wrap p-pl f-pr]")

.select("ul[class=m-cvrlst f-cb]").select("div[class=u-cover u-cover-1");

for (Element link : links) {

Elements lin = link.select("a");

// 歌曲描述

String description = lin.attr("title");

// 歌曲链接地址

String href = lin.attr("href");

href = "http://music.163.com" + href;

/*

* System.out.print(re_title + " ");

* System.out.print(re_url + " "); int nums =

* GetTheNumberOfPlays(re_url, charset);

*/

int nums =GetTheNumberOfPlays(href, charset);

Wangyiyun wangyiyun = new Wangyiyun(description, href, nums);

arrayList.add(wangyiyun);

}

}

return arrayList;

}

/**

* 该方法爬取歌曲链接地址页面的播放次数

*

*@param url_str

*@param charset

*@throws ClientProtocolException

*@throws IOExceptionGet

* the number of plays

*/

public static int GetTheNumberOfPlays(String url_str, String charset) throws ClientProtocolException, IOException {

CloseableHttpClient hc=HttpClients.createDefault();

HttpGet hg = new HttpGet(url_str);

HttpResponse response = hc.execute(hg);

HttpEntity entity = response.getEntity();

InputStream htm_in = null;

int nums = 0;

if (entity != null) {

htm_in = entity.getContent();

String htm_str = InputStream2String(htm_in, charset);

Document doc = Jsoup.parse(htm_str);

String links = doc.select("div[class=u-title u-title-1 f-cb]").select("div[class=more s-fc3]")

.select("strong").text();

nums = Integer.parseInt(links);

}

return nums;

}

/*

* public static void saveHtml(String filepath, String str) {

*

* try { OutputStreamWriter outs = new OutputStreamWriter(new

* FileOutputStream(filepath, true), "utf-8");

* outs.write("http://www.dailystrength.org" + str + "\r\n"); outs.close();

* } catch (IOException e) { System.out.println("Error at save html...");

* System.out.println(str); e.printStackTrace(); } }

*/

public static String InputStream2String(InputStream in_st, String charset) throws IOException {

BufferedReader buff = new BufferedReader(new InputStreamReader(in_st, charset));

StringBuffer res = new StringBuffer();

String line = "";

while ((line = buff.readLine()) != null) {

res.append(line);

}

return res.toString();

}

}

TestWangyiyun.java

package com.xuxueli.poi.excel.test;

import java.io.IOException;

import java.util.ArrayList;

import org.apache.http.client.ClientProtocolException;

import com.xuxueli.poi.excel.ExcelExportUtil;

import com.xuxueli.poi.excel.test.model.Wangyiyun;

import utils.WangyiyunMinyao;

public class TestWangyiyun {

public static void main(String[] args) throws ClientProtocolException, IOException {

int page = 0;

// 这里只爬取了3页数据

ArrayList wangyiyunArraylist=new ArrayList<>();

for (int i = 0; i < 3; i++) {

// 爬取

String url_str = "http://music.163.com/discover/playlist/?order=hot&cat=民谣&limit=35&offset=" + page;

ArrayList arrayList = WangyiyunMinyao.Crawl(url_str, "utf-8");

wangyiyunArraylist.addAll(arrayList);

for (Wangyiyun wangyiyun : arrayList) {

System.out.println(wangyiyun);

}

/**

* Excel导出:Object 转换为 Excel

*/

// page参数加35(这个35是分析民谣栏)

page = page + 35;

}

String filePath = "wangyiyun.xls";

ExcelExportUtil.exportToFile(filePath, wangyiyunArraylist, wangyiyunArraylist);

}

}

容易出现的错误

导入Maven依赖或者导入我的Maven项目后项目上会有感叹号,这种情况应该是Jar包下载出错。(笔主在这里卡了很长时间)

解决办法:

查看错误->找到出错的Jar->找到对应jar包存放位置->删除该jar包->去官网自己下载。

补充

刚才知道大家可能因为jar包下载错误或者各种问题有问题。

下面是我的项目的效果图。目前已经更新到Github。实在还有问题的可以把我的项目拷贝下来看看。

完整源码下载:https://github.com/Snailclimb/Spider(包含导入Excel的工具源码)

网易云音乐java爬虫_Java爬取网易云音乐民谣并导入Excel分析相关推荐

  1. python爬虫爬取音乐_利用python爬虫实现爬取网易云音乐热歌榜

    利用python爬虫实现爬取网易云音乐热歌榜 发布时间:2020-11-09 16:12:28 来源:亿速云 阅读:102 作者:Leah 本篇文章给大家分享的是有关利用python爬虫实现爬取网易云 ...

  2. python听歌识曲爬虫_Python爬取网易云音乐热门评论的搜索结果-阿里云开发者社区...

    网易云音乐评论爬虫(三):爬取歌曲的全部评论 用过网易云音乐听歌的朋友都知道,网易云音乐每首歌曲后面都有很多评论,热门歌曲的评论更是接近百万或者是超过百万条.现在我就来分享一下如何爬取网易云音乐歌曲的 ...

  3. python爬取音乐并保存_Python爬取网易云音乐上评论火爆的歌曲

    前言 网易云音乐这款音乐APP本人比较喜欢,用户量也比较大,而网易云音乐之所以用户众多和它的歌曲评论功能密不可分,很多歌曲的评论非常有意思,其中也不乏很多感人的评论.但是,网易云音乐并没有提供热评排行 ...

  4. java爬虫京东商品,Java爬虫实现爬取京东上的手机搜索页面 HttpCliient+Jsoup

    1.需求及配置 需求:爬取京东手机搜索页面的信息,记录各手机的名称,价格,评论数等,形成一个可用于实际分析的数据表格. 使用maven项目,log4j记录日志,日志仅导出到控制台. maven依赖如下 ...

  5. Python爬虫之爬取酷狗音乐歌曲

    Python爬虫之爬取酷狗音乐歌曲 1.安装第三方库 在Python的语言库中, 分为Python标准库和Python的第三方库. Python标准库是在你安装Python的时候已经包含在了安装目录下 ...

  6. 来跟我学爬虫,爬取网易云音乐的邓紫棋歌单MP3,注意:VIP歌曲不可以爬取

    @Author:Runsen 我又回来了写几个爬虫案例了,这次是写一个简单的爬虫,我来教你如何爬取网易云音乐的歌单MP3,正所谓下载一个mp3很麻烦,你们的女朋友想听歌,秀即使帮她爬取所有MP3,从此 ...

  7. python爬虫之爬取网易云音乐的歌曲图片和歌词

    0.目录 1.分析页面 2.获取歌曲的id 3.获取歌曲信息 4.获取歌曲图片url 5.获取歌词 6.总结 7.完整代码 1.分析页面 这一次我们来爬取网易云音乐,爬取歌单内的所有歌曲的图片和歌词, ...

  8. python音乐相册_python爬虫之爬取网易云音乐的歌曲图片和歌词

    0.目录 1.分析页面 2.获取歌曲的id 3.获取歌曲信息 4.获取歌曲图片url 5.获取歌词 6.总结 7.完整代码 1.分析页面 这一次我们来爬取网易云音乐,爬取歌单内的所有歌曲的图片和歌词, ...

  9. [爬虫]Python爬取网易云音乐搜索并下载歌曲!

    Python爬取网易云音乐搜索并下载歌曲! 文章目录 Python爬取网易云音乐搜索并下载歌曲! 1.准备工作 2."实地"观察 3.开始码代码! 4.搜索并下载 结束语 1.准备 ...

  10. Python爬虫——selenium爬取网易云评论并做词云

    大家好!我是霖hero 到点了上号网易云,很多人喜欢到夜深人静的时候,在网易云听音乐发表评论,正所谓:自古评论出人才,千古绝句随口来,奈何本人没文化,一句卧槽行天下!评论区集结各路大神,今天我们来爬取 ...

最新文章

  1. Oracle维护常用SQL语句
  2. NoSQL and Redis
  3. box-shadow比较美观的阴影
  4. DGA域名可以是色情网站域名
  5. 设计模式03------单例模式
  6. 句柄与指针的区别与联系
  7. boost::spirit模块实现将由某个分隔符分隔的任意键/值对解析为 std::map的测试程序
  8. __cplusplus、extern “C”关键字意义
  9. mysql5.7主从复制--在线变更复制类型【转】
  10. Spring MVC 解读——context:component-scan/
  11. 重磅!Apache Flink 1.11 功能前瞻来啦
  12. 《实用软件工程》复习知识点
  13. TortoiseSVN打分支、合并分支、切换分支
  14. SlickEdit 之--配置传承
  15. PageRank算法(Dead ends、Spider Traps问题)
  16. Python中main函数
  17. win10怎么查看外接显示器的型号
  18. python自然语言分析_Python自然语言处理-分析句子结构
  19. ssm共享充电宝管理系统计算机毕业设计
  20. python命名规则数字开头的成语_day01 Python基础

热门文章

  1. 「熊猫」变「长臂猿」,「乌龟」变「来复枪」,深度学习模型被攻击,破解之道有哪些?
  2. python取出字典重复值_从字典中提取重复值
  3. 计算机显卡怎么拨下来,电脑主机显卡怎么拆|电脑显卡的拆卸方法
  4. 单片机基础知识大总结
  5. 机器翻译评价指标BLEU介绍
  6. Ubuntu16.04如何设置静态IP地址
  7. 《人类简史》笔记——认知革命和农业革命背后的思考
  8. 【深度学习笔记】理解Bicubic,双三次插值
  9. C#中获得汉字的首拼音(加强版)
  10. git输入 ssh-keygen -t rsa 后只显示Generating public/private rsa key pair. 然后就直接跳出了