当前位置: 移动技术网 > IT编程>开发语言>Java > Java爬虫一键爬取结果并保存为Excel

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

2020年01月12日  | 移动技术网IT编程  | 我要评论

玩爱之徒mv无马赛克,任莹露,韩前防长与美国安顾问通话

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();
    }
}

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网