CSDN爬虫(四)——博客专家(所有)爬取+数据分析

CSDN爬虫(四)——博客专家(所有)爬取+数据分析

说明

  • 开发环境:jdk1.7+myeclipse10.7+win74bit+mysql5.5+webmagic0.5.2+jsoup1.7.2
  • 爬虫框架:webMagic
  • 建议:建议首先阅读webMagic的文档,再查看此系列文章,便于理解,快速学习: http://webmagic.io/
  • 开发所需jar下载(不包括数据库操作相关jar包): 点我下载
  • 该系列文章会省略webMagic文档已经讲解过的相关知识。

概述

  • 我们会从博客专家首页 http://blog.csdn.net/experts.html#list 分析页面,从中到找到所有专家所在的“接口”(需要分析网页源码),从中爬取所用专家用户,保存到本地数据库。
  • 根据专家id也即用户id去爬取他们的博客列表(第二篇文章已经讲解过该部分)。
  • 因为,博客专家是CSDN的核心用户,文章相对而言质量也比较高,优先考虑爬取这一部分用户即其文章。
  • 根据博客专家的文章总浏览量、关注数、博文单的阅读数、评论数进行排序,找出“最有价值”的文章以及博客专家。

博客专家爬虫代码预览

    package com.wgyscsf.spider;
    
    import org.jsoup.nodes.Element;
    import org.jsoup.select.Elements;
    
    import us.codecraft.webmagic.Page;
    import us.codecraft.webmagic.Site;
    import us.codecraft.webmagic.Spider;
    import us.codecraft.webmagic.processor.PageProcessor;
    
    import com.wgyscsf.utils.MyStringUtils;
    
    /**
     * @author wgy</n> 编写日期 2016-9-24下午7:25:36</n> 邮箱 wgyscsf@163.com</n> 博客
     *         http://blog.csdn.net/wgyscsf</n> TODO</n>
     */
    public class CsdnExpertListSpider implements PageProcessor {
        // 这个是列表页
        public static final String EXPERTS_LIST = "http://blog\\.csdn\\.net/peoplelist\\.html\\?channelid=0\\&page="
                + "\\w+";
        private static final String TAG = "CsdnExpertListSpider";
        // 博客详情页
        // public static final String EXPERTS_DETAILS =
        // "http://blog.csdn.net/\\w+";// \\w+是一个匹配符,可以匹配任意字段
        private Site site = Site
                .me()
                .setDomain("blog.csdn.net")
                .setSleepTime(300)
                .setUserAgent(
                        "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31");
    
        @Override
        public void process(Page page) {
            // 列表页: 这里进行匹配,匹配出列表页进行相关处理。
            if ((page.getUrl()).regex(EXPERTS_LIST).match()) {
                // 遍历出div[@class=\"page_nav\"]节点下的所有超链接,这里的超链接是分页的超链接,可以进行分页。
                page.addTargetRequests(page.getHtml()
                        .xpath("//div[@class=\"page_nav\"]").links()
                        .regex(EXPERTS_LIST).all());// 是一个正则规则,校验使用,可以省略。
    
                // 获取专家列表元素
                Elements expertList_elements = page.getHtml().getDocument()
                        .getElementsByClass("experts_list");
    
                for (Element element : expertList_elements) {
                    // 两个根节点
                    Element tag_dt = element.getElementsByTag("dt").get(0);
                    Element tag_dd = element.getElementsByTag("dd").get(0);
                    // 获取用户id
                    String id_expert = MyStringUtils.getLastSlantContent(tag_dt
                            .getElementsByTag("a").get(0).attributes().get("href"));
                    // 获取用户头像
                    String headImg = tag_dt.getElementsByTag("a").get(0)
                            .getElementsByClass("expert_head").get(0).attributes()
                            .get("src");
                    // 获取用户名
                    String name = tag_dd.getElementsByTag("a").get(0).text();
                    String address_job = tag_dd.getElementsByTag("div").get(0)
                            .text();
                    // 获取地址
                    String localtion = MyStringUtils
                            .getBeforeVercitalLine(address_job);
                    // 获取职位
                    String job = MyStringUtils.getAfterVercitalLine(address_job);
                    // 获取文章数
                    String articleNums = tag_dd.getElementsByTag("div").get(1)
                            .getElementsByTag("div").get(1).getElementsByTag("b")
                            .get(0).text();
                    // 获取阅读数
                    // TODO:这里逻辑不太对呀,但是结果正确
                    String readNums = tag_dd.getElementsByTag("div").get(1)
                            .getElementsByTag("div").get(2).getElementsByTag("b")
                            .get(0).text();
    
                    // 开始组装数据
                    System.out.println(TAG + ":" + "专家id:" + id_expert + ",专家名字:"
                            + name + ",地区:" + localtion + ",职业:" + job + ",文章总阅读数:"
                            + readNums + ",文章数:" + articleNums);
    
                }
    
            }
        }
        @Override
        public Site getSite() {
            return site;
        }
    
        public static void main(String[] args) {
            Spider.create(new CsdnExpertListSpider())
                    .addUrl("http://blog.csdn.net/peoplelist.html?channelid=0&page=1")
                    .addPipeline(null).thread(5).run();
        }
    
    }

关键代码解释

  • 以上代码涉及分页爬虫、jsoup方式解析爬虫、正则匹配,具体请参考前三篇文章。
  • 涉及到一个“接口” "http://blog.csdn.net/peoplelist.html?channelid=0&page=1" ,这个接口是分析博客专家首页 http://blog.csdn.net/experts.html#list 网页源码后得到的,极大的方便了博客专家的爬取过程。正是由于有了这个“接口”,才使得爬取博客专家特别方便。

爬取结果预览

这里写图片描述

数据分析

注: 博客专家(全部专家):1255人,博客总量(部分数据): 298057,统计时间:10/7/2016 6:28:34 PM

  • 博客专家按博文浏览量排名前十名
总浏览量排名专家Id专家名称地址职位文章量总阅读量博客地址个人中心
1v_JULY_v周磊15811651669
http://blog.csdn.net/v_JULY_vhttp://my.csdn.net/v_JULY_v
2luopingfeng罗平峰广东省深圳市驱动工程师4811335406
http://blog.csdn.net/luopingfenghttp://my.csdn.net/luopingfeng
3tianlesoftware戴明明杭州DBA109210306025
http://blog.csdn.net/tianlesoftwarehttp://my.csdn.net/tianlesoftware
4lmj623565791张鸿洋陕西西安研究生19510204783
http://blog.csdn.net/lmj623565791http://my.csdn.net/lmj623565791
5sunboy_2050杨刚北京高级工程师8649437469
http://blog.csdn.net/sunboy_2050http://my.csdn.net/sunboy_2050
621aspnet黄鸣16808816125
http://blog.csdn.net/21aspnethttp://my.csdn.net/21aspnet
7Luoshengyang罗升阳上海客户端开发1778643601
http://blog.csdn.net/Luoshengyanghttp://my.csdn.net/Luoshengyang
8luozhuang罗莊10917857322
http://blog.csdn.net/luozhuanghttp://my.csdn.net/luozhuang
9david_lv吕建伟北京北京5147665707
http://blog.csdn.net/david_lvhttp://my.csdn.net/david_lv
10Augusdi高庆地南京研发工程师40827327363
http://blog.csdn.net/Augusdihttp://my.csdn.net/Augusdi

这里写图片描述

  • 博客专家按博文创作量排名前十名
总博文量排名专家Id专家名称地址职位文章量总阅读量博客地址个人中心
1yuanmeng001袁萌40957117504
http://blog.csdn.net/yuanmeng001http://my.csdn.net/yuanmeng001
2Augusdi高庆地南京研发工程师40827327363
http://blog.csdn.net/Augusdihttp://my.csdn.net/Augusdi
3SmartTony邓斌中国上海市执行董事27923619000
http://blog.csdn.net/SmartTonyhttp://my.csdn.net/SmartTony
4jdsjlzx李治现北京Android开发工程师23146496619
http://blog.csdn.net/jdsjlzxhttp://my.csdn.net/jdsjlzx
5jackyrongvip廖煜嵘广州IT开发工程师22541287146
http://blog.csdn.net/jackyrongviphttp://my.csdn.net/jackyrongvip
6shanyou张善友21721324942
http://blog.csdn.net/shanyouhttp://my.csdn.net/shanyou
7metababy花纯春成都成都20584456469
http://blog.csdn.net/metababyhttp://my.csdn.net/metababy
8hu_zhenghui胡争辉20242492625
http://blog.csdn.net/hu_zhenghuihttp://my.csdn.net/hu_zhenghui
9sxhelijian贺利坚烟台教师19784459980
http://blog.csdn.net/sxhelijianhttp://my.csdn.net/sxhelijian
10matrix67顾森1899814777
http://blog.csdn.net/matrix67http://my.csdn.net/matrix67

这里写图片描述

  • 博文评论量最多前十名
评论数排名博主id评论数浏览量博文标题博客详情地址发表日期置顶与否
1xiaominghimi984107300Himi浅谈游戏开发de自学历程!(仅供参考)
http://blog.csdn.net/xiaominghimi/article/details/62490052011/3/14 10:18
1
2zhmxy555974180921【Visual C++】游戏开发笔记之一——API函数、DirectX的关键系统
http://blog.csdn.net/poem_qianmo/article/details/73182642012/3/4 8:59
1
3yincheng0181019303
年少痴狂,怀恋曾经的创业岁月,语音识别的应用远远未到高潮,本人的软件源码开源,需要的留下Email,我给大家发
http://blog.csdn.net/itcastcpp/article/details/41464942009/5/3 21:57

0
4 | chgaowei | 785 | 62174 | 给部分培训学生的建议 |
http://blog.csdn.net/chgaowei/article/details/6013554 | 2010/11/16 22:49 |
0
5 | wdaming1986 | 784 | 91414 | Android闹钟最终版【android源码闹钟解析】 |
http://blog.csdn.net/wdaming1986/article/details/7461043 | 2012/4/14 18:14
| 0
6 | jirigala | 780 | 43372 | 技术水平的确很高,正规公司为什么还是不录用这些人(技术水平不高的更不可能) |
http://blog.csdn.net/jirigala/article/details/5565158 | 2010/5/6 11:02 | 0
7 | 21aspnet | 749 | 510256 | C#精髓 第四讲 GridView 72般绝技 |
http://blog.csdn.net/21aspnet/article/details/1540301 | 2007/3/25 4:36 | 1
8 | shimiso | 745 | 39352 | Android精品开源项目整理_V20140221(持续更新中…) |
http://blog.csdn.net/shimiso/article/details/19771915 | 2014/2/23 22:06 |
0
9 | sinyu890807 | 676 | 94932 | 历时一年,我的著作《第一行代码——Android》已出版! |
http://blog.csdn.net/sinyu890807/article/details/26365913 | 2014/7/17 9:13
| 1
10 | sxhelijian | 635 | 8933 | 写给菜鸟:发CSDN博文常见问题处理 |
http://blog.csdn.net/sxhelijian/article/details/8042507 | 2012/10/6 8:08 |
0

这里写图片描述

  • 博文浏览量最多前十名
浏览数排名博主id评论数浏览量博文标题博客详情地址发表日期置顶与否
1lmj6235657911611528773Android Https相关完全解析 当OkHttp遇到Https
http://blog.csdn.net/lmj623565791/article/details/481294052015/9/12
11:250
2tingsking1811228563简单即时贴:python输出A到Z
http://blog.csdn.net/tingsking18/article/details/43304142009/7/8 10:59

0
3 | sunboy_2050 | 504 | 831516 | Android APK反编译详解(附图) |
http://blog.csdn.net/sunboy_2050/article/details/6727581 | 2011/8/28 22:42
| 0
4 | luopingfeng | 1 | 777893 | 《Linux Device Drivers》第十五章
内存映射和DMA——note | http://blog.csdn.net/luopingfeng/article/details/24173985
| 2014/10/9 8:41 | 0
5 | luopingfeng | 1 | 777855 | 《Linux Device Drivers》第十六章
块设备驱动程序——note | http://blog.csdn.net/luopingfeng/article/details/24174045 |
2014/10/11 16:53 | 0
6 | luopingfeng | 2 | 777674 | 《Linux Device Drivers》第八章 分配内存——note |
http://blog.csdn.net/luopingfeng/article/details/24173595 | 2014/9/28 9:26
| 0
7 | luozhuang | 28 | 656975 | RapeLay(电车之狼R)的结局介绍 (隐藏结局攻略) |
http://blog.csdn.net/luozhuang/article/details/2595816 | 2008/6/29 14:48 |
0
8 | metababy | 0 | 630052 | 时更新 在线观察纸黄金价格 24小时黄金走势图使用现货买入价格 黄金价格历史走势图
全天显示黄金,银,钯 和 铂以及原油期货,美元指数的最新价格 |
http://blog.csdn.net/metababy/article/details/1488797 | 2007/1/20 21:34 |
0
9 | alex197963 | 38 | 611795 | 历年奥斯卡获奖影片(1927—2015) |
http://blog.csdn.net/oracle_microsoft/article/details/4436974 | 2009/8/12
9:04 | 1
10 | t12x3456 | 67 | 534164 | Android 网络通信框架Volley简介(Google IO 2013)
| http://blog.csdn.net/t12x3456/article/details/9221611 | 2013/7/2 9:15 |
0

这里写图片描述

操作代码

点我下载

个人公众号,及时更新技术文章(请移步公众号,文章会被官方删除)

在这里插入图片描述


版权声明:本文为wx1871428原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。