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的话也发一个吧
<!-- 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的更多相关文章
- Java爬虫实践--爬取CSDN网站图片为例
实现的效果,自动在工程下创建Pictures文件夹,根据网站URL爬取图片,层层获取.在Pictures下以网站的层级URL命名文件夹,用来装该层URL下的图片.同时将文件名,路径,URL插入数据库, ...
- java爬虫实现爬取百度风云榜Top10
最近在项目中遇到了java和python爬虫进行程序调用和接口对接的问题, 刚开始也是调试了好久才得出点门道. 而后,自己也发现了爬虫的好玩之处,边想着用java来写个爬虫玩玩,虽说是个不起眼的dem ...
- java爬虫-简单爬取网页图片
刚刚接触到“爬虫”这个词的时候是在大一,那时候什么都不明白,但知道了百度.谷歌他们的搜索引擎就是个爬虫. 现在大二.再次燃起对爬虫的热爱,查阅资料,知道常用java.python语言编程,这次我选择了 ...
- 【Java爬虫】爬取南通大学教务处成绩
没使用自动登录,所以获取是比较麻烦.. 1.http://jwgl.ntu.edu.cn/cjcx 进入官网,进行账号密码登录 2.点击全部成绩查询(也一定要点进去,不然cookie不会返回值) ...
- java爬虫,爬取当当网数据
背景:女票快毕业了(没错!我是有女票的!!!),写论文,主题是儿童性教育,查看儿童性教育绘本数据死活找不到,没办法,就去当当网查询下数据,但是数据怎么弄下来呢,首先想到用Python,但是不会!!百 ...
- 【转】java爬虫,爬取当当网数据
背景:女票快毕业了(没错!我是有女票的!!!),写论文,主题是儿童性教育,查看儿童性教育绘本数据死活找不到,没办法,就去当当网查询下数据,但是数据怎么弄下来呢,首先想到用Python,但是不会!!百 ...
- Java两种方式简单实现:爬取网页并且保存
注:如果代码中有冗余,错误或者不规范,欢迎指正. Java简单实现:爬取网页并且保存 对于网络,我一直处于好奇的态度.以前一直想着写个爬虫,但是一拖再拖,懒得实现,感觉这是一个很麻烦的事情,出现个小错 ...
- 使用htmlparse爬虫技术爬取电影网页的全部下载链接
昨天,我们利用webcollector爬虫技术爬取了网易云音乐17万多首歌曲,而且还包括付费的在内,如果时间允许的话,可以获取更多的音乐下来,当然,也有小伙伴留言说这样会降低国人的知识产权保护意识,诚 ...
- python 爬虫之爬取大街网(思路)
由于需要,本人需要对大街网招聘信息进行分析,故写了个爬虫进行爬取.这里我将记录一下,本人爬取大街网的思路. 附:爬取得数据仅供自己分析所用,并未用作其它用途. 附:本篇适合有一定 爬虫基础 crawl ...
随机推荐
- ios9.3.3版本下 document.execCommand("copy") 失败
copyText()安卓,ios11,ios12都可用 ,并且不弹起输入键盘 // 复制copyText function copyText(text) { var input = document. ...
- tf.contrib.layers.xavier_initializer
https://blog.csdn.net/yinruiyang94/article/details/78354257xavier_initializer( uniform=True, seed=No ...
- JPA 一对多双向映射 结果对象相互迭代 造成堆栈溢出问题方法
问题: JPA 在双向映射时,会相互包含对方的实例,相互引用,造成递归迭代,堆栈溢出(java.lang.StackOverflowError). 分析: 在后端向前端传递的时候会将数据序列化,转为j ...
- Python--day31--UDP协议的socket通信
- Python3 dir() 函数
Python dir() 函数 描述 dir() 函数不带参数时,返回当前范围内的变量.方法和定义的类型列表:带参数时,返回参数的属性.方法列表.如果参数包含方法__dir__(),该方法将被调用.如 ...
- python面向对象之三大特性
继承 先看个简单的例子了解一下继承. class Animal: # 父类 def __init__(self, name, age, department): self.name = name se ...
- H3C IPv6地址构成
- H3C 主机名与IP地址映射需求
- 【u201】矩形覆盖
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 有N个矩形,矩形的底边边长为1,且均在X轴上,高度给出,第i个矩形的高为h[i],例如h = [3, ...
- H3CFTP操作示例