java 处理排名_Java提取网站后台数据进行处理并排名

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值