Java爬虫一键爬取结果并保存为Excel

将爬取结果保存为一个Excel表格

官方没有给出导出Excel 的教程 这里我就发一个导出为Excel的教程

导包

因为个人爱好 我喜欢用Gradle所以这里就弄Gradle配置

//爬虫包
compile group: 'us.codecraft', name: 'webmagic-core', version: '0.7.3'
compile group: 'us.codecraft', name: 'webmagic-extension', version: '0.7.3' //poi包 office操作
compile group: 'org.apache.poi', name: 'poi', version: '4.0.1'

maven的话也发一个吧

<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.0.1</version>
</dependency> <!-- 爬虫包 -->
<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>

实现原理

这里我实现了Pipeline接口这个接口是保存结果的

从这个接口里进行保存操作

这里的save()命令加了个synchronized的目的是为了防止多线程操作的时候出现线程安全的问题

实现代码

下面请看Java代码

import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import us.codecraft.webmagic.*;
import us.codecraft.webmagic.pipeline.Pipeline;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.selector.Selectable;
import us.codecraft.webmagic.utils.FilePersistentBase; import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List; /**
* 爬虫爬取结果导出到Excel
* extends
* FilePersistentBase 文件保存的父类 提供创建目录等方便的操作
*
* implements:
* PageProcessor 爬虫的页面操作
* Pipeline 爬取的结果操作
*/
public class WebmagicAndPoiDemo extends FilePersistentBase implements PageProcessor,Pipeline {
public WebmagicAndPoiDemo(){
logger = LoggerFactory.getLogger(getClass());
site = Site.me().setTimeOut(1000).setRetryTimes(3);
//设置保存路径
setPath("G:\\IdeaProjects\\WebMagicDemo\\Temp\\");
filename = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) +".xls";
//创建工作薄对象
workbook = new HSSFWorkbook();//这里也可以设置sheet的Name
//创建工作表对象
sheet = workbook.createSheet("爬取结果"); //创建工作表的行
HSSFRow row = sheet.createRow(rows);
row.createCell(0).setCellValue("id");
row.createCell(1).setCellValue("名称");
row.createCell(2).setCellValue("连接地址");
rows++; } private String filename;
private int rows = 0;
private HSSFWorkbook workbook;
private HSSFSheet sheet;
private Site site;
private Logger logger; @Override
public Site getSite() {
return site;
} @Override/** 这个是Pipeline的方法 **/
public void process(ResultItems resultItems, Task task) {
List<String> hrefs = resultItems.get("href");
List<String> texts = resultItems.get("text");
logger.debug(hrefs.toString());
logger.debug(texts.toString()); for (int i=0;i<hrefs.size();i++){
//创建工作表的行
HSSFRow row = sheet.createRow(rows);
row.createCell(0).setCellValue(rows);
row.createCell(2).setCellValue(hrefs.get(i));
row.createCell(1).setCellValue(texts.get(i));
rows++;
}
save();
}
/** 保存表格 **/
private synchronized void save() {
try {
//文档输出
FileOutputStream out = new FileOutputStream(getFile(this.path).getPath()+"\\"+filename);
workbook.write(out);
out.close();
logger.info(this.path+"\\"+filename+"存储完毕");
} catch (IOException e) {
logger.warn("存储失败", e);
}
} @Override/** 这个是PageProcessor的方法 **/
public void process(Page page) {
Selectable html = page.getHtml();
Selectable href = html.$(".postTitle2","href");
Selectable text = html.$(".postTitle2","text");
page.putField("href",href.all());
page.putField("text",text.all());
} public static void main(String[] args) {
//爬取自己的博客的帖子
WebmagicAndPoiDemo app = new WebmagicAndPoiDemo();
Spider.create(app).addPipeline(app)
.addUrl("https://www.cnblogs.com/xiaoshuai123/").thread(1).run();
}
}

Java爬虫一键爬取结果并保存为Excel的更多相关文章

  1. Java爬虫实践--爬取CSDN网站图片为例

    实现的效果,自动在工程下创建Pictures文件夹,根据网站URL爬取图片,层层获取.在Pictures下以网站的层级URL命名文件夹,用来装该层URL下的图片.同时将文件名,路径,URL插入数据库, ...

  2. java爬虫实现爬取百度风云榜Top10

    最近在项目中遇到了java和python爬虫进行程序调用和接口对接的问题, 刚开始也是调试了好久才得出点门道. 而后,自己也发现了爬虫的好玩之处,边想着用java来写个爬虫玩玩,虽说是个不起眼的dem ...

  3. java爬虫-简单爬取网页图片

    刚刚接触到“爬虫”这个词的时候是在大一,那时候什么都不明白,但知道了百度.谷歌他们的搜索引擎就是个爬虫. 现在大二.再次燃起对爬虫的热爱,查阅资料,知道常用java.python语言编程,这次我选择了 ...

  4. 【Java爬虫】爬取南通大学教务处成绩

    没使用自动登录,所以获取是比较麻烦.. 1.http://jwgl.ntu.edu.cn/cjcx    进入官网,进行账号密码登录 2.点击全部成绩查询(也一定要点进去,不然cookie不会返回值) ...

  5. java爬虫,爬取当当网数据

     背景:女票快毕业了(没错!我是有女票的!!!),写论文,主题是儿童性教育,查看儿童性教育绘本数据死活找不到,没办法,就去当当网查询下数据,但是数据怎么弄下来呢,首先想到用Python,但是不会!!百 ...

  6. 【转】java爬虫,爬取当当网数据

     背景:女票快毕业了(没错!我是有女票的!!!),写论文,主题是儿童性教育,查看儿童性教育绘本数据死活找不到,没办法,就去当当网查询下数据,但是数据怎么弄下来呢,首先想到用Python,但是不会!!百 ...

  7. Java两种方式简单实现:爬取网页并且保存

    注:如果代码中有冗余,错误或者不规范,欢迎指正. Java简单实现:爬取网页并且保存 对于网络,我一直处于好奇的态度.以前一直想着写个爬虫,但是一拖再拖,懒得实现,感觉这是一个很麻烦的事情,出现个小错 ...

  8. 使用htmlparse爬虫技术爬取电影网页的全部下载链接

    昨天,我们利用webcollector爬虫技术爬取了网易云音乐17万多首歌曲,而且还包括付费的在内,如果时间允许的话,可以获取更多的音乐下来,当然,也有小伙伴留言说这样会降低国人的知识产权保护意识,诚 ...

  9. python 爬虫之爬取大街网(思路)

    由于需要,本人需要对大街网招聘信息进行分析,故写了个爬虫进行爬取.这里我将记录一下,本人爬取大街网的思路. 附:爬取得数据仅供自己分析所用,并未用作其它用途. 附:本篇适合有一定 爬虫基础 crawl ...

随机推荐

  1. scala资料总结,一些小技巧

    scala资料总结,一些小技巧 1.得到每种数据类型所表示的范围 Short.MaxValue 32767 Short.MinValue -32768 Int.MaxValue 2147483647 ...

  2. 深入java面向对象二:final关键字

    文章内容源于对<疯狂java讲义>及<疯狂Java:突破程序员基本功的16课>学习和总结. 一. final成员变量 final 修饰变量时,表示该变量一旦获取了值就不可以改变 ...

  3. Python--day66--模板语言之fitler回顾

  4. Java中的元注解

    注解为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便地使用这些数据. 通过使用注解,我们可以将这些元数据保存在Java源代码中,并利用annotation API为自己的 ...

  5. python基础五之字典

    python数据的可变性 通过数据的可变性,可将数据分为可变数据类型和不可变数据类型. 可变数据类型:list,dict (不可哈希) 不可变数据类型:元祖,bool,int,str (可哈希) py ...

  6. P1057 迷宫路径

    题目描述 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, ...

  7. 大众点评实时监控系统CAT的那些坑

    首先,感谢大众点评开源监控系统CAT.CAT是一款非常使用的功能建全的监控系统.作为一个知名的开源软件,真的是太差了. 想把CAT用起来,没有多年的Java经验是不行的.先吐槽一下,再写一篇如何用的文 ...

  8. Canvas动画:地球绕着太阳转

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  9. linux 每-CPU 的变量

    每-CPU 变量是一个有趣的 2.6 内核的特性. 当你创建一个每-CPU 变量, 系统中每个处理 器获得它自己的这个变量拷贝. 这个可能象一个想做的奇怪的事情, 但是它有自己的优点. 存取每-CPU ...

  10. js 中日期2013-08-30或2019-08-24 12:30:00 转换成时间戳,和2019-08-29T02:15:08.000+0000转化为2019-08-29T02:15:08

    js 中日期2019-08-24 或2019-08-24 12:30:00 转换成时间戳 首先将它转成date日期类型,然后获取毫秒形式时间戳 let date=new Date("2019 ...