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爬爬自己的博客,通过数据 ...
随机推荐
- IEnumerable、IEnumerator、ICollection、IList、List的继承关系及简单使用
IEnumerable和IEnumerable<T>接口在.NET中是非常重要的接口,它允许开发人员定义foreach语句功能的实现并支持非泛型方法的简单的迭代,IEnumerable和I ...
- Multi-Projector Based Display Code ------- Home
Overview This project provides you with the tools and techniques you need to create your own large-a ...
- css3工具
随着CSS3的出现,CSS3讨论的话题越来越多了,现在各种教程也是多如牛毛,不比一年前的时候,找个资料要捞遍整个互联网,而且还很难找到自己需要的参考资料.从侧面也说明,CSS3对于前端工程师来说,越来 ...
- webpack4.0.1安装问题和webpack.config.js的配置变化
The CLI moved into a separate package: webpack-cli. Please install 'webpack-cli' in addition to webp ...
- [elk]验证mapping字段数和数据字段数关系
验证一个mapping下字段缺少或者超过 结论: 没有什么不可以. 1.如果数据字段不在mapping里,则动态会更新mapping. 2.数据字段数也可以小于mapping里字段数 创建一个mapp ...
- 【Pattern】-NO.150.Pattern.1 -【Pattern UML】
Style:Mac Series:Java Since:2018-09-10 End:2018-09-10 Total Hours:1 Degree Of Diffculty:5 Degree Of ...
- Github上36893颗星!这个被称为下一代企业级应用首选技术你学了么?
用一句话概括:这个技术,是JAVA后端框架的龙头老大,执牛耳者.这个技术就是: Spring Boot春靴. Spring Boot到底凭什么成为Java社区最具影响力的项目?说直白点,他爹Spr ...
- MongoDB系列----备份与导入导出
参考: http://my.oschina.net/xiaomaoandhong/blog/63471,<> 1.停掉服务器 然后备份 Mongodb将所有数据都存放在"数据目录 ...
- session 和 cookie
在web请求中,很多的时候服务器需要知道来访的客户是谁,但是HTTP协议本身是不带认证的(ftp协议需要用户密码),因此cookie和session诞生了. session是解决http协议无状态 ...
- 爬虫 -----爬取百度时事热点和url
使用scrapy top.py 爬虫主要工作 pipelines.py 数据保存 main.py 执行脚本 items.py 初始化item