Java爬虫一键爬取结果并保存为Excel
程序员文章站
2022-10-04 14:26:54
Java爬虫一键爬取结果并保存为Excel 将爬取结果保存为一个Excel表格 官方没有给出导出Excel 的教程 这里我就发一个导出为Excel的教程 导包 因为个人爱好 我喜欢用Gradle所以这里就弄Gradle配置 //爬虫包 compile group: 'us.codecraft', n ......
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(); } }