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. 【a503】圆排列问题

    Time Limit: 1 second Memory Limit: 32 MB [问题描述] 给定n个大小不等的圆c1,c2,...., cn,现要将这n个圆排列进一个矩形框中,且要求各圆与矩形框的 ...

  2. Python--day61--Django项目配置相关

    static文件查找:

  3. servicemix-4.5.3 启动日志

    karaf@root> log:display 2015-01-12 10:48:03,950 | WARN  | rint Extender: 3 | XBeanNamespaceHandle ...

  4. UVa 1152 -4 Values whose Sum is 0—[哈希表实现]

    The SUM problem can be formulated as follows: given four lists A, B, C, D of integer values, compute ...

  5. UPC个人训练赛第十五场(AtCoder Grand Contest 031)

    传送门: [1]:AtCoder [2]:UPC比赛场 [3]:UPC补题场 参考资料 [1]:https://www.cnblogs.com/QLU-ACM/p/11191644.html B.Re ...

  6. UVA 1625 "Color Length" (基础DP)

    传送门 •参考资料 [1]:HopeForBetter •题意 •题解(by 紫书) •我的理解 用了一上午的时间,参考紫书+上述博文,终于解决了疑惑: 定义第一个颜色序列用串 s 表示,第二个用串 ...

  7. vue-learning:5-template-v-for

    5 列表渲染的指令v-for v-for on Array / Object / String / Number v-for on template v-for on expression v-for ...

  8. 【21.00%】【vijos P1018】智破连环阵

    描述 B国在耗资百亿元之后终于研究出了新式武器--连环阵(Zenith Protected Linked Hybrid Zone).传说中,连环阵是一种永不停滞的自发性智能武器.但经过A国间谍的侦察发 ...

  9. supported platform

    Target name Platform Architecture Endianness Developer(s) Known Issues/Notes adm5120 Infineon/ADMtek ...

  10. centos7 teamviewer

    Step 1: Install the prerequisites. # yum install glibc alsa-lib freetype libICE libSM libX11 libXau ...