当前位置 博文首页 > 小小鱼儿小小林的博客:[附完整代码]2020年博客之星大赛爬取Top2

    小小鱼儿小小林的博客:[附完整代码]2020年博客之星大赛爬取Top2

    作者:[db:作者] 时间:2021-09-18 10:03

    目录

    前言?

    二、博客之星票数排行

    抓包:

    获取接口数据demo:

    Top200候选人票数demo:

    Top200候选人票数排序代码demo:

    完整项目地址:


    ?

    前言?

    2020年的csdn博客之星大赛前200名候选人已经产生,目前正在火热的进行投票中,我有幸进入前200名,大家可以帮我投投票,序号是【177】。

    投票地址:https://bss.csdn.net/m/topic/blog_star2020/detail?username=qq_27471405

    每天都可以投票,大家的票数不止1票,根据大家的博客等级,大家的票数1-10票之间,所以大家可以多投机票哈

    帮我投票的小伙伴们,将来如果有任何问题,都可以随时私聊我,我看到了会立即回复


    二、博客之星票数排行

    言归正传,这次官方投票首页地址是:https://bss.csdn.net/m/topic/blog_star2020

    页面居然没有排序功能,可能官方大大也想到了,如果有排序的话,那第一一直都在第一了,后面的就一直都在后面了,可能会显得不公平。

    那没有排序,我们怎么知道自己在第几名呢?

    我们是程序员,抓个包,把数据拿下来,自己写个程序,然后排个序,不就可以了吗

    ?

    抓包:

    抓包很简单,用工具:fiddler 就可以完成,想要下载的话或者不知道怎么使用的,可以网搜搜索一下,教程很多的。

    通过fiddler工具,访问首页地址,可以看到有这么一个接口

    通过上述圈起来的接口地址,我们可以拿到所有的数据,看来是前后端分离的,那就更简单了,我们都不需要写正则去解析html代码,直接拿到接口的数据,然后进行排序即可

    ?

    获取接口数据demo:

    public String getRankingInfo(){
            Map<String, Object> mapReturn = new HashMap(); //返回结果
            mapReturn.put("returnCode","-1");
            mapReturn.put("content","");
            try {
                String url="https://bss.csdn.net/m/topic/blog_star2020/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("https://bss.csdn.net/m/topic/blog_star2020");
                httpPojo.setHttpOrigin("https://bss.csdn.net");
                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;
        }

    执行结果:

    通过模拟请求,我们已经可以获取到数据了,那接下来就是将获取到的结果进行解析,使结果更加直观一点

    ?

    Top200候选人票数demo:

    public String getRankingInfo(){
            Map<String, Object> mapReturn = new HashMap(); //返回结果
            mapReturn.put("returnCode","-1");
            mapReturn.put("content","");
            try {
                String url="https://bss.csdn.net/m/topic/blog_star2020/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("https://bss.csdn.net/m/topic/blog_star2020");
                httpPojo.setHttpOrigin("https://bss.csdn.net");
                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;
        }

    执行结果:

    现在的数据都是和官网实时的,可是这样,都从序号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="https://bss.csdn.net/m/topic/blog_star2020/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("https://bss.csdn.net/m/topic/blog_star2020");
                httpPojo.setHttpOrigin("https://bss.csdn.net");
                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;
        }

    执行结果:

    截止到目前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,将结果封装成接口,供页面调用啦,这里我在博客里就不赘述了,我已经在代码里都写好了,已经上传了,大家可以直接下载下来,就可以使用

    ?

    三、完整项目地址:

    git地址:https://codechina.csdn.net/qq_27471405/csdnStar

    download地址:https://download.csdn.net/download/qq_27471405/14124062

    ?

    最后,再唠叨一下,大家不要忘记帮我投投票哈

    投票地址:https://bss.csdn.net/m/topic/blog_star2020/detail?username=qq_27471405

    cs