本来是想抓取博客园的博客推荐的页面的,但由于一些博客进去的页面格式都不太相同,一时不想花时间去寻找规律,发现CSDN上面的格式较为单一,就决定以CSDN推荐专家的个人博客信息作为爬虫抓取的目标。

【首先,查看一下CSDN的推荐专家的页面】

【然后再查看一下主页面】

准备用爬虫获取一下几个变量

1.姓名

2.访问量

3.积分

4.等级

5.排名

6.原创

7.转载

8.译文

9.评论

10.链接

11.照片

【工程截图】因为主要用到WebMagic,所有的jar包在WebMagic的git地址,自行下载。

【User.java】便于展示,或者后期存入数据库用

package com.cnblogs.test;

public class User {
private String name; //名字
private String fangwen; //访问数量
private String jifen; //积分
private String dengji; //等级
private String paiming; //排名
private String yuanchuang;//原创
private String zhuanzai; //转载
private String yiwen; //译文
private String pinglun; //评论
private String link; //链接
private String photo; //照片 @Override
public String toString() {
return "\n========================= \n "
+ " 姓名=" + name
+ "\n 访问量=" + fangwen
+ "\n 积分=" + jifen
+ "\n 等级=" + dengji
+ "\n 排名=" + paiming
+ "\n 原创=" + yuanchuang
+ "\n 转载=" + zhuanzai
+ "\n 译文=" + yiwen
+ "\n 评论=" + pinglun
+ "\n 链接="+ link
+ "\n 照片=" + photo
+ "\n==========================\n"
;
}
/*******省略get/Set方法******/
}

【CSDNSpider.java】

package com.cnblogs.test;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;import java.util.regex.Matcher;
import java.util.regex.Pattern; import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.processor.PageProcessor; public class CSDNSpider implements PageProcessor{
private static String keyword="java";
private static int num; //专区网站的相关配置,包括编码、抓取间隔、重试次数等
private Site site=Site.me().setRetryTimes(10).setSleepTime(1000); @Override
public Site getSite() {
return this.site;
} @Override
public void process(Page page) {
//如果url匹配"http://blog.csdn.net/experts.html"
if(page.getUrl().regex("http://blog\\.csdn\\.net/experts\\.html").match()){
//获取div[@class='experts_list_wrap clearfix']内含有的全部链接
List<String> listLink=page.getHtml().xpath("//div[@class='experts_list_wrap clearfix']").links().all();
//因为在首页每个博主都有重复的链接,这里加一个去重的方法,这个方法很好用
HashSet<String> hs=new HashSet<String>(listLink); //通过HashSet剔除重复的链接
listLink.clear();
listLink.addAll(hs); //将去重的的链接结合补充回listStr
//将博主的主页的url加入到待抓取的队列中
page.addTargetRequests(listLink);
}else{ //此时进入了用户详细页面
User user=new User();
//首先获取姓名
String name=page.getHtml().xpath("//div[@id='blog_userface']/span/a[@class='user_name']/text()").get();
//这里获取
String str=page.getHtml().xpath("//ul[@id='blog_rank']").get()+page.getHtml().xpath("//ul[@id='blog_statistics']").get();
//部分变量以 "<sapn>XXXX<sapm>"的格式存在,我们可以使用正则表达式将整个"<sapn>XXXX<sapm>"获取匹配的字符串
String regex="<span>(.*)+</span>";
Pattern p1=Pattern.compile(regex);
Matcher m=p1.matcher(str);
//用来保存"<sapn>XXXX<sapm>"中间的XXXX的集合
List<String> strList=new ArrayList<>();
while(m.find()){
//这里的m.group()的格式为: "<span>403581次</span>" 或 "<span>7526</span>" 或 "<span>第1885名</span>" 的格式
String s=m.group().split("<span>|</span>")[1]; //切割之后为 s[0]="<span>" s[1]="404581次" s[2]="<span>",所以我们取s[1]
strList.add(s); //将s[1]添加至集合中
}
String fangwen=strList.get(0); //访问
String jifen=strList.get(1); //积分
String paiming=strList.get(2); //排名
String yuanchuang=strList.get(3); //原创
String zhuanzai=strList.get(4); //转载
String yiwen=strList.get(5); //译文
String pinglun=strList.get(6); //评论 //等级存放在<img src=http://c.csdnimg.cn/jifen/images/xunzhang/jianzhang/blog6.png>中
//1级对应:blog1.png, 6级对应:blog6.png
String dengji=page.getHtml().xpath("//img[@id='leveImg']/@src").get();
dengji=dengji.substring(dengji.length()-5, dengji.length()-4); //获取倒数第5个字符 //获取当前页的url
String photo=page.getHtml().xpath("//div[@id='blog_userface']/a/img/@src").get(); String link=page.getUrl().toString(); //将所有的数据保存如User对象中
user.setName(name);
user.setFangwen(fangwen);
user.setJifen(jifen);
user.setDengji(dengji);
user.setPaiming(paiming);
user.setYuanchuang(yuanchuang);
user.setZhuanzai(zhuanzai);
user.setYiwen(yiwen);
user.setPinglun(pinglun);
user.setLink(link);
user.setPhoto(photo);
System.out.println(user.toString()); } } public static void main(String[] args) {
//url入口
Spider.create(new CSDNSpider())
.addUrl("http://blog.csdn.net/experts.html")
.thread(5)
.run();
} }

【运行结果】

【注意点】

这两块信息分布在两个ul上,所以就出现了程序里

整合两个ul的情况。

另外,注意下这几个处理方式不同

【总结】

知识点一:List<String>去重的方法:

知识点二:正则表达式从一个长字符串中获取符合要求的字符串数组(多个满足条件,就组成数组喽)

知识点三:截取某一段字符串的后面几位(之前有点忘记了,现在记下)

总之WebMagic还是挺好上手的,当然正则表达式巧妙的利用会事半功倍。

另外就是WebMagic的单独的知识点,后面再总结补充。

02_使用WebMagic爬虫获取CSDN推荐专家的个人博客信息的更多相关文章

  1. 开发记录_自学Python写爬虫程序爬取csdn个人博客信息

    每天刷开csdn的博客,看到一整个页面,其实对我而言,我只想看看访问量有没有上涨而已... 于是萌生了一个想法: 想写一个爬虫程序把csdn博客上边的访问量和评论数都爬下来. 打算通过网络各种搜集资料 ...

  2. python网络爬虫进入(一)——简单的博客爬行动物

    最近.对于图形微信公众号.互联网收集和阅读一些疯狂的-depth新闻和有趣,发人深思文本注释,并选择最佳的发表论文数篇了.但看着它的感觉是一个麻烦的一人死亡.寻找一个简单的解决方案的方法,看看你是否可 ...

  3. java提取(获取)博客信息(内容)

    package com.wbg.my.service; import java.io.*; import java.net.HttpURLConnection; import java.net.URL ...

  4. CSDN怎么转载别人的博客

    在参考"如何快速转载CSDN中的博客"后,由于自己不懂html以及markdown相关知识,所以花了一些时间来弄明白怎么转载博客,以下为转载CSDN博客步骤和一些知识小笔记. 参考 ...

  5. CSDN如何转载别人的博客

    前言   对于喜欢逛CSDN的人来说,看别人的博客确实能够对自己有不小的提高,有时候看到特别好的博客想转载下载,但是不能一个字一个字的敲了,这时候我们就想快速转载别人的博客,把别人的博客移到自己的空间 ...

  6. WordPress多站点获取当前博客信息

    http://www.utubon.com/1495/wordpress-multisite-get-current-bolg-info global $current_blog; 它的返回结果是: ...

  7. CSDN也有我的博客啦

    我的CSDN:https://blog.csdn.net/qq_40875849

  8. Python爬虫学习之正则表达式爬取个人博客

    实例需求:运用python语言爬取http://www.eastmountyxz.com/个人博客的基本信息,包括网页标题,网页所有图片的url,网页文章的url.标题以及摘要. 实例环境:pytho ...

  9. JAVA爬虫挖取CSDN博客文章

    开门见山,看看这个教程的主要任务,就去csdn博客,挖取技术文章,我以<第一行代码–安卓>的作者为例,将他在csdn发表的额博客信息都挖取出来.因为郭神是我在大学期间比较崇拜的对象之一.他 ...

随机推荐

  1. C#调用VC DLL堆栈不对称

    今天在调程序时,C#调用VC 编译的dll出现堆栈不对称,查了一下资料,转载在这里供大家参考. 问题描述:对 PInvoke 函数“xxFunction()”的调用导致堆栈不对称.原因可能是托管的 P ...

  2. 【转】Vim 常用命令总结

    使用 Vim 的时间不长,但如今已经离不开熟悉的 Vim 编辑模式了. Vim 的学习曲线是非常陡的,一开始学习的时候,面对很多的操作命令要去记住,常常望而却步. 其实,只要记住一些常用的命令,加之在 ...

  3. log4j输出信息到mongodb

    官网     http://log4mongo.org/display/PUB/Log4mongo+for+Java 保存主机信息,方法等      http://my.oschina.net/chi ...

  4. php数组相加 两个数组键名相同 后者不能覆盖前者

    array(“a”)+array(“b”)结果还是array(“a”) array(“a”)+array(“b”)的结果是 array(“a”) 因为,它们等效于array(“0″=>”a”)+ ...

  5. C++/C#/java开发支持求解

    本人大一学C语言,大二学VB,大三学VC,毕业后工作前两年用C++,接着两年用C#,最近几个月Android开发用Java. 以下本人总结以下,有些疑惑希望大师帮忙解答. 1. C语言,精简,灵活,适 ...

  6. 算法之旅,直奔<algorithm>之十三 fill

    fill(vs2010) 引言 这是我学习总结<algorithm>的第十三篇,fill是一个很好的初始化工具.大学挺好,好好珍惜... 作用 fill  的作用是 给容器里一个指定的范围 ...

  7. Cocos2d-x MultipleTouch & CCControllButton's confusion

    在cocos2dx的程序设计中有时候会遇到需要多点触摸的功能,下面先介绍一下在cocos2dx中多点触摸的一般规则,然后介绍我遇到的一个有关多点触摸的情景的解决方案. (一)使用多点触摸规则: 关于多 ...

  8. 如何减少不能重现的Bug

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:如何减少不能重现的Bug.

  9. 横竖屏事件响应(viewWillLayoutSubviews和通知)两种方式

    转载:http://blog.csdn.net/nogodoss/article/details/17246489 最近搞横竖屏,获得一些心得,特记录下来. 做横竖屏最重要的是确定横竖屏响应的接口.目 ...

  10. PS Studio打包程序 .net版本依赖

    PS Studio打包好的程序(Win7下),拿到Windows Server 2003(PS2.0),如果提示”.Net framework初始化错误“,则需要安装 .net 3.0 如果是PS3. ...