1. 程式人生 > >Java提取網站後臺數據進行處理並排名

Java提取網站後臺數據進行處理並排名

出現 -a exce 源碼下載 amr 處理 排名 left find()

Java提取網站後臺數據進行處理並排名

一、網頁分析

截取的網站鏈接為:https://www.tiobe.com/tiobe-index/

打開網站後,可以看到這個網站的編程語言排名情況。我們選擇下圖中的圖表,這個圖表中有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

Java提取網站後臺數據進行處理並排名