欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-05-04 12:13:38
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();
    }
}