天天看點

[附完整代碼]2020年部落格之星大賽爬取Top200候選人,并按票數進行排序

目錄

​​前言 ​​

​​二、部落格之星票數排行​​

​​抓包:​​

​​擷取接口資料demo:​​

​​Top200候選人票數demo:​​

​​Top200候選人票數排序代碼demo:​​

​​完整項目位址:​​

前言 

[附完整代碼]2020年部落格之星大賽爬取Top200候選人,并按票數進行排序

2020年的csdn部落格之星大賽前200名候選人已經産生,目前正在火熱的進行投票中,我有幸進入前200名,大家可以幫我投投票,​

每天都可以投票,大家的票數不止1票,根據大家的部落格等級,大家的票數1-10票之間,是以大家可以多投機票哈

幫我投票的小夥伴們,将來如果有任何問題,都可以随時私聊我,我看到了會立即回複

[附完整代碼]2020年部落格之星大賽爬取Top200候選人,并按票數進行排序

二、部落格之星票數排行

言歸正傳​

頁面居然沒有排序功能,可能官方大大也想到了,如果有排序的話,那第一一直都在第一了,後面的就一直都在後面了,可能會顯得不公平。

那沒有排序,我們怎麼知道自己在第幾名呢?

我們是程式員,抓個包,把資料拿下來,自己寫個程式,然後排個序,不就可以了嗎

抓包:

抓包很簡單,用工具:fiddler 就可以完成,想要下載下傳的話或者不知道怎麼使用的,可以網搜搜尋一下,教程很多的。

通過fiddler工具,通路首頁位址,可以看到有這麼一個接口

[附完整代碼]2020年部落格之星大賽爬取Top200候選人,并按票數進行排序

通過上述圈起來的接口位址,我們可以拿到所有的資料,看來是前後端分離的,那就更簡單了,我們都不需要寫正則去解析html代碼,直接拿到接口的資料,然後進行排序即可

擷取接口資料demo:

public String getRankingInfo(){
Map<String, Object> mapReturn = new HashMap(); //傳回結果
mapReturn.put("returnCode","-1");
mapReturn.put("content","");
try {
String url="javascript:void(0)/getUsers";
//模拟請求
HttpPojo httpPojo = new HttpPojo();
httpPojo.setHttpHost("bss.csdn.net");
httpPojo.setHttpAccept("*/*");
httpPojo.setHttpConnection("keep-alive");
httpPojo.setHttpUserAgent("Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36");
httpPojo.setHttpReferer("javascript:void(0)");
httpPojo.setHttpOrigin
JSONObject paramObj = new JSONObject();
paramObj.put("number",""); //空表示全部
//請求 擷取所有top200的使用者資訊:頭像、id、票數、昵稱等等
String htmlResult = HttpClientUtil.httpsClientSendPost(url,paramObj.toJSONString(),httpPojo,"UTF-8");
System.out.println(htmlResult);



        }catch (Exception e){
e.printStackTrace();

        }


return null;
    }      

執行結果:

[附完整代碼]2020年部落格之星大賽爬取Top200候選人,并按票數進行排序

通過模拟請求,我們已經可以擷取到資料了,那接下來就是将擷取到的結果進行解析,使結果更加直覺一點

Top200候選人票數demo:

public String getRankingInfo(){
Map<String, Object> mapReturn = new HashMap(); //傳回結果
mapReturn.put("returnCode","-1");
mapReturn.put("content","");
try {
String url="javascript:void(0)/getUsers";
//模拟請求
HttpPojo httpPojo = new HttpPojo();
httpPojo.setHttpHost("bss.csdn.net");
httpPojo.setHttpAccept("*/*");
httpPojo.setHttpConnection("keep-alive");
httpPojo.setHttpUserAgent("Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36");
httpPojo.setHttpReferer("javascript:void(0)");
httpPojo.setHttpOrigin
JSONObject paramObj = new JSONObject();
paramObj.put("number",""); //空表示全部
//請求 擷取所有top200的使用者資訊:頭像、id、票數、昵稱等等
String htmlResult = HttpClientUtil.httpsClientSendPost(url,paramObj.toJSONString(),httpPojo,"UTF-8");
System.out.println(htmlResult);
//解析json,拿到使用者的票數,進行倒序排序
//如果你想用緩存,可以使用redisTemplate.opsForZSet() 功能直接進行排序
//這裡我就不用緩存了,直接用TreeSet排序
JSONObject dataJson = JSONObject.parseObject(htmlResult);
String code = dataJson.getString("code");
if ("200".equals(code)) { //表示成功擷取到資料
JSONArray dataArray = dataJson.getJSONArray("data");
for (int i = 0, size = dataArray.size(); i < size; i++) {
JSONObject userObj = JSONObject.parseObject(dataArray.get(i).toString());
String id = userObj.getString("id");//使用者id
String vote_num = userObj.getString("vote_num");//票數
String nick_name = userObj.getString("nick_name");//昵稱
String number = userObj.getString("number");//序号
String avatar = userObj.getString("avatar");//頭像
String article_count = userObj.getString("article_count");//原創數量
System.out.println("使用者" + number + "【" + nick_name + "】的票數是:" + vote_num + "票");

                }
            }

        }catch (Exception e){
e.printStackTrace();

        }

return null;
    }      
[附完整代碼]2020年部落格之星大賽爬取Top200候選人,并按票數進行排序

現在的資料都是和官網實時的,可是這樣,都從序号001-200的票數,并沒有按照票數從高到低的來排序

解決方法有兩個

1、如果你想用緩存,可以使用redisTemplate.opsForZSet() 功能直接進行排序 

2、使用TreeSet排序

這裡我就用第二種,直接通過TreeSet排序

Top200候選人票數排序代碼demo:

public String getRankingInfo(){
Map<String, Object> mapReturn = new HashMap(); //傳回結果
mapReturn.put("returnCode","-1");
mapReturn.put("content","");
try {
String url="javascript:void(0)/getUsers";
//模拟請求
HttpPojo httpPojo = new HttpPojo();
httpPojo.setHttpHost("bss.csdn.net");
httpPojo.setHttpAccept("*/*");
httpPojo.setHttpConnection("keep-alive");
httpPojo.setHttpUserAgent("Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36");
httpPojo.setHttpReferer("javascript:void(0)");
httpPojo.setHttpOrigin
JSONObject paramObj = new JSONObject();
paramObj.put("number",""); //空表示全部
//請求 擷取所有top200的使用者資訊:頭像、id、票數、昵稱等等
String htmlResult = HttpClientUtil.httpsClientSendPost(url,paramObj.toJSONString(),httpPojo,"UTF-8");
System.out.println(htmlResult);
//解析json,拿到使用者的票數,進行倒序排序
//如果你想用緩存,可以使用redisTemplate.opsForZSet() 功能直接進行排序
//這裡我就不用緩存了,直接用TreeSet排序
JSONObject dataJson = JSONObject.parseObject(htmlResult);
String code = dataJson.getString("code");
if ("200".equals(code)) { //表示成功擷取到資料
Set<JSONObject> userSet = new TreeSet<JSONObject>(new CsdnComparator());

JSONArray dataArray = dataJson.getJSONArray("data");
for (int i = 0, size = dataArray.size(); i < size; i++) {
JSONObject userObj = JSONObject.parseObject(dataArray.get(i).toString());
String id = userObj.getString("id");//使用者id
String vote_num = userObj.getString("vote_num");//票數
String nick_name = userObj.getString("nick_name");//昵稱
String number = userObj.getString("number");//序号
String avatar = userObj.getString("avatar");//頭像
String article_count = userObj.getString("article_count");//原創數量
System.out.println("使用者" + number + "【" + nick_name + "】的票數是:" + vote_num + "票");

userSet.add(userObj);
                }

//排序後的結果
System.out.println("================================");
System.out.println("===========排序後的結果==========");
int xuhao = 1; //序号
for (JSONObject user: userSet) {
String id = user.getString("id");//使用者id
String vote_num = user.getString("vote_num");//票數
String nick_name = user.getString("nick_name");//昵稱
String number = user.getString("number");//序号
String avatar = user.getString("avatar");//頭像
String article_count = user.getString("article_count");//原創數量

System.out.println(xuhao+".使用者"+number+"【"+nick_name+"】的票數是:"+vote_num+"票");

xuhao++;
                }
            }

        }catch (Exception e){
e.printStackTrace();

        }

return null;
    }      
[附完整代碼]2020年部落格之星大賽爬取Top200候選人,并按票數進行排序

截止到目前2021.01.12 18:00 時候的,完整排序結果如下

1.使用者014【敖 丙】的票數是:2076票
2.使用者070【Hollis在csdn】的票數是:1200票
3.使用者051【第三女神程憶難】的票數是:1140票
4.使用者127【帥地】的票數是:1120票
5.使用者179【小林coding】的票數是:1079票
6.使用者062【谷哥的小弟】的票數是:884票
7.使用者173【小傅哥】的票數是:720票
8.使用者182【1_bit】的票數是:696票
9.使用者005【Alice菌】的票數是:554票
10.使用者118【qq2648008726】的票數是:499票
11.使用者001【谙憶】的票數是:486票
12.使用者097【李銳博恩】的票數是:478票
13.使用者082【Jack-Cui】的票數是:460票
14.使用者039【carl-zhao】的票數是:428票
15.使用者194【中間件興趣圈】的票數是:424票
16.使用者146【ThinkWon】的票數是:419票
17.使用者141【TrueDei】的票數是:361票
18.使用者185【藝博東】的票數是:314票
19.使用者046【程式猿小亮】的票數是:303票
20.使用者091【lovelife110】的票數是:296票
21.使用者184【一個處女座的程式猿】的票數是:292票
22.使用者055【Engineer-Bruce_Yang】的票數是:280票
23.使用者085【考古學家lx】的票數是:262票
24.使用者124【riemann_】的票數是:251票
25.使用者025【Bubbliiiing】的票數是:249票
26.使用者063【公衆号-JavaEdge】的票數是:247票
27.使用者166【雪松研究所】的票數是:241票
28.使用者164【小山豬的沙塔】的票數是:240票
29.使用者028【沉默王二】的票數是:239票
30.使用者191【ztenv】的票數是:218票
31.使用者170【許進進】的票數是:216票
32.使用者096【劉早起】的票數是:209票
33.使用者177【小小魚兒小小林】的票數是:199票
34.使用者094【LaoYuanPython】的票數是:193票
35.使用者104【牧小農】的票數是:190票
36.使用者020【半顆心髒】的票數是:181票
37.使用者095【劉一哥GIS】的票數是:156票
38.使用者080【記得誠】的票數是:155票
39.使用者040【cutercorley】的票數是:153票
40.使用者135【恬靜的小魔龍】的票數是:151票
41.使用者101【Mculover666】的票數是:150票
42.使用者017【白玉梁】的票數是:149票
43.使用者007【AI 菌】的票數是:140票
44.使用者153【王義凱_Rick】的票數是:138票
45.使用者052【段智華】的票數是:130票
46.使用者074【花狗Fdog_】的票數是:126票
47.使用者075【江南、董少】的票數是:125票
48.使用者053【Data-Mining】的票數是:123票
49.使用者086【看,未來】的票數是:121票
50.使用者145【Trent1985】的票數是:113票
51.使用者167【xindoo】的票數是:111票
52.使用者107【夢想橡皮擦】的票數是:102票
53.使用者108【滿天星._】的票數是:101票
54.使用者002【✎ℳ๓₯㎕...雲淡風輕】的票數是:99票
55.使用者013【阿華田512】的票數是:98票
56.使用者035【程式員cxuan】的票數是:97票
57.使用者087【科皮子菊】的票數是:96票
58.使用者198【_陳哈哈】的票數是:95票
59.使用者199【_江南一點雨】的票數是:94票
60.使用者143【TRHX &bull; 鮑勃】的票數是:92票
61.使用者026【不脫發的程式猿】的票數是:91票
62.使用者038【程式員哆啦A夢】的票數是:90票
63.使用者069【後端技術漫談】的票數是:89票
64.使用者044【cv調包俠】的票數是:86票
65.使用者043【Charzous】的票數是:85票
66.使用者010【Albert Yang】的票數是:82票
67.使用者067【灰小猿】的票數是:79票
68.使用者181【一顆小樹x】的票數是:77票
69.使用者073【華為雲】的票數是:76票
70.使用者019【布客飛龍】的票數是:73票
71.使用者012【Android_zhu_jiang】的票數是:71票
72.使用者162【小王曾是少年】的票數是:69票
73.使用者003【奮飛】的票數是:67票
74.使用者183【雲 祁】的票數是:65票
75.使用者130【shiter】的票數是:62票
76.使用者150【webmote】的票數是:59票
77.使用者131【善良勤勞勇敢而又聰明的老楊】的票數是:58票
78.使用者045【程式新視界】的票數是:57票
79.使用者004【淼叔】的票數是:56票
80.使用者024【bigbirdit】的票數是:55票
81.使用者011【anlian523】的票數是:53票
82.使用者175【向彪-blockchain】的票數是:52票
83.使用者008【傲驕鹿先生】的票數是:51票
84.使用者056【飛哥說】的票數是:47票
85.使用者147【vv_小蟲】的票數是:46票
86.使用者021【beyondma】的票數是:45票
87.使用者066【herosunly】的票數是:42票
88.使用者060【flydean程式那些事】的票數是:41票
89.使用者189【張志翔】的票數是:40票
90.使用者099【六鬥米折腰】的票數是:39票
91.使用者029【CG國斌】的票數是:38票
92.使用者015【BoCong-Deng】的票數是:37票
93.使用者102【碼農架構】的票數是:36票
94.使用者032【村中少年】的票數是:34票
95.使用者059【Felaim】的票數是:33票
96.使用者119【輕狂書生FS】的票數是:32票
97.使用者186【YourBatman】的票數是:30票
98.使用者192【zzzzls~】的票數是:29票
99.使用者037【caimouse】的票數是:28票
100.使用者009【AlbertS】的票數是:27票
101.使用者023【Baret-H】的票數是:26票
102.使用者110【nineheaded_bird】的票數是:25票
103.使用者077【技術大咖秀】的票數是:24票
104.使用者158【文宇肅然】的票數是:23票
105.使用者133【雙子孤狼】的票數是:22票
106.使用者006【阿飛雲】的票數是:21票
107.使用者058【範桂飓】的票數是:20票
108.使用者016【半吊子全棧工匠】的票數是:19票
109.使用者022【笨_鳥_不_會_飛】的票數是:17票
110.使用者027【辰兮要努力】的票數是:16票
111.使用者128【十年呵護】的票數是:15票
112.使用者068【紅色石頭Will】的票數是:14票
113.使用者033【chunqiuwei】的票數是:13票
114.使用者083【坤昱】的票數是:12票
115.使用者163【謝公子】的票數是:10票
116.使用者072【紅胖子(AAA紅模仿)】的票數是:9票
117.使用者048【大熊貓侯佩】的票數是:8票
118.使用者030【超人汪小建(seaboat)】的票數是:7票
119.使用者018【不才Jerry】的票數是:6票
120.使用者034【CrazyMo_】的票數是:5票
121.使用者065【海轟Pro】的票數是:4票
122.使用者041【cofisher】的票數是:3票
123.使用者088【kaiyuan_sjtu】的票數是:2票
124.使用者071【huangjinjin520】的票數是:1票
125.使用者154【whik1194】的票數是:0票      

最後,當然是寫一下controller,寫一些傳回code,将結果封裝成接口,供頁面調用啦,這裡我在部落格裡就不贅述了,我已經在代碼裡都寫好了,已經上傳了,大家可以直接下載下傳下來,就可以使用

繼續閱讀