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爬爬自己的博客,通过数据 ...
随机推荐
- kettle 通用的数据库迁移流程
需求: 1.你是否遇到了需要将mysql数据库中的所有表与数据迁移到Oracle. 2.你是否还在使用kettle重复的画着:表输入-表输出.创建表,而烦恼. 下面为你实现了一套通用的数据库迁移流程. ...
- odoo按钮触发下载文件
测试环境:Odoo8.0 1.在你的模块中创建一个方法,返回url 举个例子, @api.multi def get_stock_file(self): return{'type':'ir.actio ...
- char和QChar(Unicode的编码与内存里的值还不是一回事)
char类型是c/c++中内置的类型,描述了1个字节的内存信息的解析.比如: char gemfield=’g’;那么在由gemfield标记的这块内存的大小就是1个字节,信息就是01100111,8 ...
- Oracle控制文件冗余
1.备份参数文件.检查控制文件.检查磁盘组名 sqlplus / as sysdba !echo "create pfile='$HOME/pfile_$ORACLE_SID_`date + ...
- python smtp 发邮件 添加附件
# -*- coding:utf-8 -*- # __author__ = 'justing' import os import smtplib from email.mime.multipart i ...
- cmd中查看MySQL数据库表数据及结构
0. 1 .cmd进入mysql安装的bin目录(C:\Program Files\XXXXXX\MySQL Server 5.6\bin) mysql -hlocalhost -uroot -p 回 ...
- Data type
先放官方文档: https://dev.mysql.com/doc/refman/5.5/en/data-types.html MySQL支持多种类型的SQL数据类型:数字类型,日期和时间类型,字符串 ...
- Qt QLineEdit 漂亮的搜索框 && 密码模式 && 格式化输入 && 提示文字 && 选择内容并移动 && 清除全部输入
先上一个漂亮的搜索框效果图, 输入搜索文本效果, 点击搜索图标效果: //实现代码 void MainWindow::iniLineEdit() { ui->lineEdit->setPl ...
- P1434 [SHOI2002]滑雪
题目描述 Michael喜欢滑雪.这并不奇怪,因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道在一个区域中最长 ...
- (转)利用CAS算法实现通用线程安全状态机
在多线程环境下,如果某个类是有状态的,那我们在使用前,需要保证所有该类的实例对象状态一致,否则会出现意向不到的bug.下面是通用线程安全状态机的实现方法. public class ThreadSav ...