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