一、导入依赖

 <!--webmagic依赖-->
<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-core</artifactId>
<version>0.7.3</version>
</dependency>
<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-extension</artifactId>
<version>0.7.3</version>
</dependency>

二、参考网站

适用博客:博客园、CSDN博客、简书

框架参考文档:http://webmagic.io/docs/zh/

X Path语法:http://www.w3school.com.cn/xpath/xpath_syntax.asp

三、核心代码

 import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.model.OOSpider;
import us.codecraft.webmagic.processor.PageProcessor; import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map; /**
* @author zsh
* @site qqzsh.top
* @company wlgzs
* @create 2019-04-08 20:59
* @Description
*/
public class CnBlogProcessor implements PageProcessor { // 抓取网站的相关配置,包括:编码、抓取间隔、重试次数等
private Site site = Site.me().setCharset("utf-8").setRetryTimes(5).setSleepTime(1000);
// 文章数量
private static int size = 0;
// 文章集合
private static List<CnBlogs> cnBlogses = new ArrayList<>(); // 抽取逻辑类
public void process(Page page) {
CnBlogs cnBlogs = new CnBlogs();
//博客园博客
if (page.getUrl().regex("https://www.cnblogs.com/.*").match()) {
// 标题
//暂时发现3个样式
String title = page.getHtml().xpath("//div[@class='entrylistPosttitle']/a/text()").get();
if (title != null){
cnBlogs.setTitle(title);
}else {
title = page.getHtml().xpath("//div[@class='postTitle']/a/text()").get();
if (title != null){
cnBlogs.setTitle(title);
}else {
title = page.getHtml().xpath("//div[@class='post']/h5/a/text()").get();
cnBlogs.setTitle(title);
}
} // 作者
cnBlogs.setAuthor(page.getHtml().xpath("//a[@id='Header1_HeaderTitle']/text()").get()); // 发布日期
String datatime = page.getHtml().xpath("//div[@class='entrylistItemPostDesc']/a/text()").get();
if (datatime != null){
cnBlogs.setDateTime(datatime);
}else {
datatime = page.getHtml().xpath("//div[@class='postDesc']/text()").get();
if (datatime != null){
int qian = datatime.indexOf("@");
int hou = datatime.indexOf(cnBlogs.getAuthor());
datatime = datatime.substring(qian+2,hou-1);
cnBlogs.setDateTime(datatime);
}else {
datatime = page.getHtml().xpath("//p[@class='postfoot']/a/text()").get();
cnBlogs.setDateTime(datatime);
}
}
// URL
String url = page.getHtml().xpath("//div[@class='entrylistPosttitle']/a/@href").get();
if (url != null){
cnBlogs.setUrl(url);
}else {
url = page.getHtml().xpath("//div[@class='postTitle']/a/@href").get();
if (url != null){
cnBlogs.setUrl(url);
}else {
url = page.getHtml().xpath("//div[@class='post']/h5/a/@href").get();
cnBlogs.setUrl(url);
}
}
cnBlogses.add(cnBlogs);
}else if (page.getUrl().regex("https://blog.csdn.net/.*").match()){ //csdn博客
// 标题
String title = page.getHtml().xpath("//div[@class='article-item-box csdn-tracking-statistics']/h4/a/text()").all().get(1);
if (title != null){
cnBlogs.setTitle(title);
}
// 作者
cnBlogs.setAuthor(page.getHtml().xpath("//a[@id='uid']/text()").get()); // 发布日期
String datatime = page.getHtml().xpath("//span[@class='date']/text()").all().get(1);
if (datatime != null){
cnBlogs.setDateTime(datatime);
} // URL
String url = page.getHtml().xpath("//div[@class='article-item-box csdn-tracking-statistics']/h4/a/@href").all().get(1);
if (url != null){
cnBlogs.setUrl(url);
}
cnBlogses.add(cnBlogs);
}else if (page.getUrl().regex("https://www.jianshu.com/.*").match()){ //简书
// 标题
String title = page.getHtml().xpath("//div[@class='content']/a/text()").get();
if (title != null){
cnBlogs.setTitle(title);
}
// 作者
cnBlogs.setAuthor(page.getHtml().xpath("//a[@class='name']/text()").all().get(1)); // 发布日期
String datatime = page.getHtml().xpath("//span[@class='time']/@data-shared-at").get();
if (datatime != null){
cnBlogs.setDateTime(datatime);
} // URL
String url = "https://www.jianshu.com"+page.getHtml().xpath("//div[@class='content']/a/@href").get();
if (url != null){
cnBlogs.setUrl(url);
}
cnBlogses.add(cnBlogs); }else {
cnBlogses.add(cnBlogs);
}
} public Site getSite() {
return site;
} public static void main(String[] args) throws IOException {
//1.先去小组官网抓取人员名单
Spider.create(new Test()).addUrl("http://wlgzs.org/blog.html").thread(5).run();
//2.根据抓取的名单来获取博客
Map<String, String> map = POITest.readExcel();
List<String> name = new ArrayList<>();
List<String> url = new ArrayList<>();
for (Map.Entry<String, String> entry : map.entrySet()) {
//Map.entry<Integer,String> 映射项(键-值对) 有几个方法:用上面的名字entry
//entry.getKey() ;entry.getValue(); entry.setValue();
//map.entrySet() 返回此映射中包含的映射关系的 Set视图。
System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
name.add(entry.getKey());
url.add(entry.getValue());
if (!entry.getKey().equals("计科182 杨惠涵")){
Spider.create(new CnBlogProcessor()).addUrl(entry.getValue()).thread(10).run();
}else {
CnBlogProcessor.cnBlogses.add(new CnBlogs());
}
}
POITest.printExcel2(name,url,CnBlogProcessor.cnBlogses);
}
}

四、项目源码地址

https://gitee.com/ZhangShunHai/webmagic

result.xls文件是从工作室官网抓取的成员名单

result2.xls是抓取的最近一篇博客的链接

webmagic爬虫抓取工作室成员博客的更多相关文章

  1. Scrapy爬取自己的博客内容

    python中常用的写爬虫的库有urllib2.requests,对于大多数比较简单的场景或者以学习为目的,可以用这两个库实现.这里有一篇我之前写过的用urllib2+BeautifulSoup做的一 ...

  2. [Python学习] 简单网络爬虫抓取博客文章及思想介绍

            前面一直强调Python运用到网络爬虫方面很有效,这篇文章也是结合学习的Python视频知识及我研究生数据挖掘方向的知识.从而简介下Python是怎样爬去网络数据的,文章知识很easy ...

  3. Python爬虫小实践:爬取任意CSDN博客所有文章的文字内容(或可改写为保存其他的元素),间接增加博客访问量

    Python并不是我的主业,当初学Python主要是为了学爬虫,以为自己觉得能够从网上爬东西是一件非常神奇又是一件非常有用的事情,因为我们可以获取一些方面的数据或者其他的东西,反正各有用处. 这两天闲 ...

  4. 利用爬虫将Yuan先生的博客文章爬取下来

    由于一次巧遇,我阅读了Yuan先生的一篇博客文章,感觉从Yuan先生得博客学到很多东西,很喜欢他得文章.于是我就关注了他,并且想阅读更多出自他手笔得博客文章,无奈,可能Yuan先生不想公开自己得博客吧 ...

  5. 通过爬虫代理IP快速增加博客阅读量——亲测CSDN有效!

    写在前面 题目所说的并不是目的,主要是为了更详细的了解网站的反爬机制,如果真的想要提高博客的阅读量,优质的内容必不可少. 了解网站的反爬机制 一般网站从以下几个方面反爬虫: 1. 通过Headers反 ...

  6. [Python爬虫笔记][随意找个博客入门(一)]

    [Python爬虫笔记][随意找个博客入门(一)] 标签(空格分隔): Python 爬虫 2016年暑假 来源博客:挣脱不足与蒙昧 1.简单的爬取特定url的html代码 import urllib ...

  7. 爬虫抓取页面数据原理(php爬虫框架有很多 )

    爬虫抓取页面数据原理(php爬虫框架有很多 ) 一.总结 1.php爬虫框架有很多,包括很多傻瓜式的软件 2.照以前写过java爬虫的例子来看,真的非常简单,就是一个获取网页数据的类或者方法(这里的话 ...

  8. nodejs爬虫--抓取CSDN某用户全部文章

    最近正在学习node.js,就像搞一些东西来玩玩,于是这个简单的爬虫就诞生了. 准备工作 node.js爬虫肯定要先安装node.js环境 创建一个文件夹 在该文件夹打开命令行,执行npm init初 ...

  9. Python爬虫,看看我最近博客都写了啥,带你制作高逼格的数据聚合云图

    转载请标明出处: http://blog.csdn.net/forezp/article/details/70198541 本文出自方志朋的博客 今天一时兴起,想用python爬爬自己的博客,通过数据 ...

随机推荐

  1. 长连接锁服务优化实践 C10K问题 nodejs的内部构造 limits.conf文件修改 sysctl.conf文件修改

    小结: 1. 当文件句柄数目超过 10 之后,epoll 性能将优于 select 和 poll:当文件句柄数目达到 10K 的时候,epoll 已经超过 select 和 poll 两个数量级. 2 ...

  2. 源码编译vim

    目录 获取最新版 vim 源码 1 git仓库clone 2, 源码包下载,里面有各个版本的vim压缩包 vim 配置选项 配置示例 参考文章 tip 获取最新版 vim 源码 1 git仓库clon ...

  3. mysql distinct()用法

    在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所 ...

  4. Java基础 JDBC

    一,前言 数据库是开发中必不可少的一个工具,那么java如何操作数据库呢,那就是我们的JDBC了,接下来我们将会好好聊一下这个JDBC. 二,JDBC 2.1 JDBC概述 JDBC(Java Dat ...

  5. LeetCode 15 输入无序、有重复,输出排重版 3-Sum

    V1 粗暴的遍历,时间复杂度O(N³) func threeSumClosest(nums []int, target int) int { min := 0 result := 0 for i := ...

  6. sublime There are no packages available for installation 问题的解决办法

    这个是因为IPv6的原因, 因此我们需要修改我们的 /etc/hosts文件. 第一步: 执行: nm-tool 获取DNS的信息 例如: DNS: 192.168.1.11 第二步: 在/etc/h ...

  7. ubuntu下zip文件操作

    转自 https://blog.csdn.net/hpu11/article/details/71524013 .zip $ zip -r myfile.zip ./* 将当前目录下的所有文件和文件夹 ...

  8. 从零开始一起学习SLAM | 掌握g2o顶点编程套路

    点"计算机视觉life"关注,置顶更快接收消息! ## 小白:师兄,上一次将的g2o框架<从零开始一起学习SLAM | 理解图优化,一步步带你看懂g2o代码>真的很清晰 ...

  9. C# 数组在内存中的存储

    C# 数组是引用类型,那么在内存中是如何存储的呢? 在VS中调试C#程序,如何查看内存.寄存器.反汇编 在这篇文章里看到了如何在VS 中查看内存 先断点打在数组创建后语句那里,点debug->W ...

  10. springboot引入AOP

    AOP是Aspect Oriented Programming的缩写,意为面向切面编程.通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是spring框架的一个重要内容,她通过对 ...