Java提取网站后台数据进行处理并排名
一、网页分析
打开网站后,可以看到这个网站的编程语言排名情况。我们选择下图中的图表,这个图表中有2001-2019年的编程语言每个月的使用率,我需要它的数据。
二、数据提取
在网页点右键,点击查看源码:首先我们要编程把源码下载到记事本里,看一下核心代码
URL url = new URL(website);
// 根据链接(字符串格式),生成一个URL对象
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
// 打开URL
BufferedReader reader =new
BufferedReader(new InputStreamReader(urlConnection.getInputStream(), encoding));
// 得到输入流
Save.saveStr("",file,false);
//清空记事本文件的内容
while ((str = reader.readLine())!= null) {
????//每次读取一行,放入记事本中
Save.saveStr(str,file,true);
Save.saveStr("\r\n",file,true);
}
?
下载完成后,我们打开这个文件,看一看这个文件里的内容,只截取一部分
?
?
?
三、数据处理
首先找到我们需要的数据(对应上图的排名的数据),利用正则表达式将数据提取出来。
上图是对应的数据,现在利用正则表达式来提取核心代码如下:
//正则表达式要匹配的数据
Pattern dataCompile = Pattern.compile("Date.UTC[(]\\d{4}, \\d{1,2}, \\d{1,2}[)],\\d{1,2}.\\d{3}|name : ‘\\w++(\\W{0,2})? ( \\w++)(\\w++)?‘,data");
String s;
try {
????//读入后放入记事本文档中
System.out.println("处理数据中......");
Save.saveStr("",file,false);
while ((s = in.readLine())!=null){
Matcher dataNeed = dataCompile.matcher(s);
while (dataNeed.find()){
Save.saveStr(dataNeed.group(),file,true);
Save.saveStr("\r\n",file,true);
}
catch (Exception e){
e.printStackTrace();
}
?
处理完成后,打开保存的文件,可以看到一下结果,这里仍然只截取一小部分。
?
?
?
?
?
这个数据中有时间和使用率,这些是我绘图所需要的,这里依然使用正则表达式将他们全部读取出来放入一个类中。
看一下这个类的核心代码
public class Data{
????private String language; //存放语言名称
????private double data;???????? //存放使用率
private String month;???????? //存放月
//省略字段的属性
}
?
用这个类来存放数据,用着则表达式来提取文本中的数据,将数据放在这个类实例化的对象中。分别存放这个语言的名字和某一个时间的排名,每一个对象存放一个数据,提取后把这些对象放进10行12列的数组中。然后根据数据的大小进行排序,比如我绘制2002年的数据,排好序了之后的情况如图
?
?
?
?
?
?
这是对应的使用率
?
?
?
?
?
0代表这个时间的数据缺失,由于网站数据的问题,会缺少某一时间的数据,这里设置了一个循环标记,用标记来匹配正则表达式匹配到的月份,如果两个结果不相等则代表这个月数据缺失,当发现数据缺失的时候,会自动为这个月的使用率补0。
另外有看到有两个jav,其实下面的jav是JavaScript语言,我只截取了名字的三个长度,方便清楚的看到排名情况。这里简单的解释一下。
????主窗口的设计省略,在选择不同的信息时会出现不同控件。
????下面说绘图,绘图在Java的JPanel中绘图。我们要想自由绘图,就需要重写JPanel类中的public void paintComponent(Graphics g)方法然后调用g.drawLine( )函数,对排好序的数据进行绘制。图形是根据他们在某一时间固定的排名进行绘制的。
四、程序运行结果
????算法实现后首先来看一下运行结果,我还是绘制2002年的排名结果,以便更好对应上图中的排名情况。横轴是月份,竖轴是排名,看效果。
?
?
?
?
?
?
?
?
x轴以月为单位时,可以绘制2001 – 2019 年的数据,某一时刻缺少数据时,可以自动跳过。
x轴以年为单位时,可以绘制2001 – 2019 年每一年年平均使用率排名或者每一年每一个月的排名情况。
?
首先来看2001-2019年年平均使用率情况
?
?
?
?
?
?
?
?
?
?
?
?
?
?
这个是数组里的使用率数据。
?
?
?
?
?
然后我们看一下具体某个月份的排名情况
有一些数据空缺是因为某一年的3月份没有数据,我们把排名情况的数据截图下来,可以看到,2001、2008年这两年3月的数据都是0,上文已经说过,0代表数据缺少。
?
?
?
?
?
?
?
?
?
?
?
可以看到,上图中没有绘制数据的的时间的使用率均为0。
五、实现保存功能
当点击保存按钮时可以把自己绘制的图形保存至计算机中,首先来看核心代码:
?
//文件选择框,点击确定时,返回选择文件的路径。
public static String fileSave(Component parent,String name) {
JFileChooser fileChooser = new JFileChooser();
fileChooser.setSelectedFile(new File(name));
int result = fileChooser.showSaveDialog(parent);
if (result == JFileChooser.APPROVE_OPTION) {
File file = fileChooser.getSelectedFile();
return file.getAbsolutePath();
}
else
return null;
}
这部分的是实现文件保存,但是我们需要路径,所以用JfileChooser类来选择路径,选择好路径并且完成命名后返回路径的字符串给上部分代码中的file,考虑到重名问题,做了一些处理,比如我要保存名字为"hello.jpg"的文件,当文件存在时,会自动保存为"hello1.jpg"。
?
?
?
?
?
?
?
?
?
?
?
来看一下保存的结果。
打开它
?
?
?
?
?
?
?
?
?
完成。
源代码连接为:https://github.com/LiangMengnan/Data-statistics
原文:https://www.cnblogs.com/Nanner/p/10880720.html