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周磊 15811651669http://blog.csdn.net/v_JULY_vhttp://my.csdn.net/v_JULY_v
2luopingfeng罗平峰广东省深圳市 驱动工程师4811335406http://blog.csdn.net/luopingfenghttp://my.csdn.net/luopingfeng
3tianlesoftware戴明明杭州 DBA109210306025http://blog.csdn.net/tianlesoftwarehttp://my.csdn.net/tianlesoftware
4lmj623565791张鸿洋陕西西安 研究生19510204783http://blog.csdn.net/lmj623565791http://my.csdn.net/lmj623565791
5sunboy_2050杨刚北京 高级工程师8649437469http://blog.csdn.net/sunboy_2050http://my.csdn.net/sunboy_2050
621aspnet黄鸣 16808816125http://blog.csdn.net/21aspnethttp://my.csdn.net/21aspnet
7Luoshengyang罗升阳上海 客户端开发1778643601http://blog.csdn.net/Luoshengyanghttp://my.csdn.net/Luoshengyang
8luozhuang罗莊 10917857322http://blog.csdn.net/luozhuanghttp://my.csdn.net/luozhuang
9david_lv吕建伟北京北京5147665707http://blog.csdn.net/david_lvhttp://my.csdn.net/david_lv
10Augusdi高庆地南京 研发工程师40827327363http://blog.csdn.net/Augusdihttp://my.csdn.net/Augusdi

这里写图片描述
* 博客专家按博文创作量排名前十名

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

这里写图片描述
* 博文评论量最多前十名

评论数排名博主id评论数浏览量博文标题博客详情地址发表日期置顶与否
1xiaominghimi984107300 Himi浅谈游戏开发de自学历程!(仅供参考) http://blog.csdn.net/xiaominghimi/article/details/62490052011/3/14 10:181
2zhmxy555974180921 【Visual C++】游戏开发笔记之一——API函数、DirectX的关键系统 http://blog.csdn.net/poem_qianmo/article/details/73182642012/3/4 8:591
3yincheng0181019303 年少痴狂,怀恋曾经的创业岁月,语音识别的应用远远未到高潮,本人的软件源码开源,需要的留下Email,我给大家发 http://blog.csdn.net/itcastcpp/article/details/41464942009/5/3 21:570
4chgaowei78562174 给部分培训学生的建议 http://blog.csdn.net/chgaowei/article/details/60135542010/11/16 22:490
5wdaming198678491414 Android闹钟最终版【android源码闹钟解析】 http://blog.csdn.net/wdaming1986/article/details/74610432012/4/14 18:140
6jirigala78043372 技术水平的确很高,正规公司为什么还是不录用这些人(技术水平不高的更不可能) http://blog.csdn.net/jirigala/article/details/55651582010/5/6 11:020
721aspnet749510256 C#精髓 第四讲 GridView 72般绝技 http://blog.csdn.net/21aspnet/article/details/15403012007/3/25 4:361
8shimiso74539352 Android精品开源项目整理_V20140221(持续更新中..) http://blog.csdn.net/shimiso/article/details/197719152014/2/23 22:060
9sinyu89080767694932 历时一年,我的著作《第一行代码——Android》已出版! http://blog.csdn.net/sinyu890807/article/details/263659132014/7/17 9:131
10sxhelijian6358933 写给菜鸟:发CSDN博文常见问题处理 http://blog.csdn.net/sxhelijian/article/details/80425072012/10/6 8:080

这里写图片描述
* 博文浏览量最多前十名

浏览数排名博主id评论数浏览量博文标题博客详情地址发表日期置顶与否
1lmj6235657911611528773 Android 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:590
3sunboy_2050504831516 Android APK反编译详解(附图) http://blog.csdn.net/sunboy_2050/article/details/67275812011/8/28 22:420
4luopingfeng1777893 《Linux Device Drivers》第十五章 内存映射和DMA——note http://blog.csdn.net/luopingfeng/article/details/241739852014/10/9 8:410
5luopingfeng1777855 《Linux Device Drivers》第十六章 块设备驱动程序——note http://blog.csdn.net/luopingfeng/article/details/241740452014/10/11 16:530
6luopingfeng2777674 《Linux Device Drivers》第八章 分配内存——note http://blog.csdn.net/luopingfeng/article/details/241735952014/9/28 9:260
7luozhuang28656975 RapeLay(电车之狼R)的结局介绍 (隐藏结局攻略) http://blog.csdn.net/luozhuang/article/details/25958162008/6/29 14:480
8metababy0630052 时更新 在线观察纸黄金价格 24小时黄金走势图使用现货买入价格 黄金价格历史走势图 全天显示黄金,银,钯 和 铂以及原油期货,美元指数的最新价格 http://blog.csdn.net/metababy/article/details/14887972007/1/20 21:340
9alex19796338611795 历年奥斯卡获奖影片(1927—2015) http://blog.csdn.net/oracle_microsoft/article/details/44369742009/8/12 9:041
10t12x345667534164 Android 网络通信框架Volley简介(Google IO 2013) http://blog.csdn.net/t12x3456/article/details/92216112013/7/2 9:150

这里写图片描述

操作代码

点我下载

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值