java excel自动保存_Java爬虫一键爬取结果并保存为Excel

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的话也发一个吧

org.apache.poi

poi

4.0.1

us.codecraft

webmagic-core

0.7.3

us.codecraft

webmagic-extension

0.7.3

实现原理

这里我实现了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 hrefs = resultItems.get("href");

List texts = resultItems.get("text");

logger.debug(hrefs.toString());

logger.debug(texts.toString());

for (int i=0;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();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值