一、导入依赖

 <!--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. 记录智能合约solidity编译的坑

    在Linux环境下入门写一段solidity编译遇到error和warning,经过一番研究后才得其缘由,下面以一段demo总结一下. pragma solidity ^; // 指定所需的编译器版本 ...

  2. mysql 外键约束及表关联

    一.MYSQL中的约束 1.主键:primary key 唯一非空的特性并且可以优化查询速度 2.外键:foreign key 外键的作用保证2个或2个以上的数据表的数据一致性和完整性 3.唯一:un ...

  3. python遍历文件(替换)

    #!/usr/local/bin/python # -*- coding: UTF-8 -*- #coding:gbk import re import os w_str="" x ...

  4. html转markdown网站

    戳下面的链接,可以直接复制富文本粘贴编程markdown: https://euangoddard.github.io/clipboard2markdown/

  5. action,func简洁用法

     new Action(() => { }).Invoke();new Action(() => { })();    new Func<int, int>(s => { ...

  6. 7、Flutter banner_view 轮播图的使用

    1.前言 实现轮播图,效果如下: 2.实现 将采用 banner_view 实现:资源库地址 2.1.yaml 引入依赖 在 pubspec.yaml 声明需要引用的库,执行命令 flutter pa ...

  7. Python 进阶 异步async/await

    一,前言 本文将会讲述Python 3.5之后出现的async/await的使用方法,我从上看到一篇不错的博客,自己对其进行了梳理.该文章原地址https://www.cnblogs.com/dhcn ...

  8. VMware密匙

    5A02H-AU243-TZJ49-GTC7K-3C61N 新版本密室:FF31K-AHZD1-H8ETZ-8WWEZ-WUUVA

  9. Shadow DOM及自定义标签

    参考链接:点我 一.什么是Shadow DOM Shadow DOM,直接翻译的话就是 影子 DOM,可以理解为潜藏在 DOM 结构中并且我们无法直接控制操纵的 DOM 结构.类似于下面这种结构 Sh ...

  10. ubuntu16.04利用deb包安装mysql

    https://blog.csdn.net/zht741322694/article/details/79013093