webmagic爬虫抓取工作室成员博客
一、导入依赖
<!--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爬虫抓取工作室成员博客的更多相关文章
- Scrapy爬取自己的博客内容
python中常用的写爬虫的库有urllib2.requests,对于大多数比较简单的场景或者以学习为目的,可以用这两个库实现.这里有一篇我之前写过的用urllib2+BeautifulSoup做的一 ...
- [Python学习] 简单网络爬虫抓取博客文章及思想介绍
前面一直强调Python运用到网络爬虫方面很有效,这篇文章也是结合学习的Python视频知识及我研究生数据挖掘方向的知识.从而简介下Python是怎样爬去网络数据的,文章知识很easy ...
- Python爬虫小实践:爬取任意CSDN博客所有文章的文字内容(或可改写为保存其他的元素),间接增加博客访问量
Python并不是我的主业,当初学Python主要是为了学爬虫,以为自己觉得能够从网上爬东西是一件非常神奇又是一件非常有用的事情,因为我们可以获取一些方面的数据或者其他的东西,反正各有用处. 这两天闲 ...
- 利用爬虫将Yuan先生的博客文章爬取下来
由于一次巧遇,我阅读了Yuan先生的一篇博客文章,感觉从Yuan先生得博客学到很多东西,很喜欢他得文章.于是我就关注了他,并且想阅读更多出自他手笔得博客文章,无奈,可能Yuan先生不想公开自己得博客吧 ...
- 通过爬虫代理IP快速增加博客阅读量——亲测CSDN有效!
写在前面 题目所说的并不是目的,主要是为了更详细的了解网站的反爬机制,如果真的想要提高博客的阅读量,优质的内容必不可少. 了解网站的反爬机制 一般网站从以下几个方面反爬虫: 1. 通过Headers反 ...
- [Python爬虫笔记][随意找个博客入门(一)]
[Python爬虫笔记][随意找个博客入门(一)] 标签(空格分隔): Python 爬虫 2016年暑假 来源博客:挣脱不足与蒙昧 1.简单的爬取特定url的html代码 import urllib ...
- 爬虫抓取页面数据原理(php爬虫框架有很多 )
爬虫抓取页面数据原理(php爬虫框架有很多 ) 一.总结 1.php爬虫框架有很多,包括很多傻瓜式的软件 2.照以前写过java爬虫的例子来看,真的非常简单,就是一个获取网页数据的类或者方法(这里的话 ...
- nodejs爬虫--抓取CSDN某用户全部文章
最近正在学习node.js,就像搞一些东西来玩玩,于是这个简单的爬虫就诞生了. 准备工作 node.js爬虫肯定要先安装node.js环境 创建一个文件夹 在该文件夹打开命令行,执行npm init初 ...
- Python爬虫,看看我最近博客都写了啥,带你制作高逼格的数据聚合云图
转载请标明出处: http://blog.csdn.net/forezp/article/details/70198541 本文出自方志朋的博客 今天一时兴起,想用python爬爬自己的博客,通过数据 ...
随机推荐
- [crypto][ipsec] 简述ESP协议的sequence number机制
预备 首先提及一个概念叫重放攻击,对应的机制叫做:anti-replay https://en.wikipedia.org/wiki/Anti-replay IPsec协议的anti-replay特性 ...
- ListView添加图片文字项
1)listview 控件 结合 imagelist 控件 实现类似效果. 2)添加 imagelist 控件 images 属性,点击后面的... 添加相应图片. 3)点listview,查看其属性 ...
- 本地浏览器Websql数据库操作
前几天看到一个小姐姐问我一个添加修改的我看了一下案例弄了一个出来.... 参考案例:HTML5本地数据库(WebSQL)[转] - 狂流 - 博客园 https://www.cnblogs.com/ ...
- list的基本操作实现
有关list的相关实现,主函数没有写很多,每个部分目前没发现有问题: #include <iostream> #include <stdio.h> using namespac ...
- ElasticSearch - 信息聚合系列之聚合过滤
摘要 聚合范围限定还有一个自然的扩展就是过滤.因为聚合是在查询结果范围内操作的,任何可以适用于查询的过滤器也可以应用在聚合上. 版本 elasticsearch版本: elasticsearch-2. ...
- 自学传说中的php接口编写
一个前端学php,感觉不可思议,但实际上面试中都会问你后台会不会.这时候php就派上用场了. 下面的是我自己百度研究的一个些心得分享一下: html代码 <!DOCTYPE html> & ...
- 如何成功安装旧版本火狐,成功安装firebug和firepath插件
很久不用火狐了,为了练习selenium定位浏览器等操作,下载了火狐浏览器,新版火狐已经没有firebug和firepath等插件,无法使用,只有安装老版本的火狐:*****安装好之后立刻设置不让他自 ...
- Linq中join多字段匹配
错误示范: var projectSubmitInfos = (from project in db.T_PM_Project join member in db.T_PM_Member on pro ...
- Lists.newArrayList的一个小坑
把一个用户ID转换成List存储,最开始我使用的方法是: // 用户ID Integer userId = 120; // id 转 List List<integer> userIds ...
- leafLet入门教程兼leafLet API中文文档参考
英文文档参考:https://leafletjs.com/reference-1.3.4.html#popup 博客参考:https://blog.csdn.net/qq_36595013/artic ...