java 实现 自定义 log 开启 io 创建文件 将文本内容,写入 文本中 ,累加写入 最后关闭 爬虫服务方便记录数据,放服务挂掉和对方限制ip,导致的中端,意外停止也无妨,数据正常记录保存

·  阅读 100

目录

介绍

效果图

下面介绍下思路

工具类代码

1.工具类全部依赖

2.检查文件夹是否存在,检查文件是否存在,没有创建

2.1这个方法可以单独使用,方面处理io方面的时候见文件使用使用方法

3.一个私有参数

4.构造方法加载FileWriter

5.写入文本

6.关闭io

7.main方法调用

8.全量代码

9.外部爬虫类调用使用,用来记录实时更新解析出的数据 ,这个是爬虫接口的,爬虫html解析的自行调节

9.1代码重点介绍

9.1.1重点一  WriteFileTextUitl wftu = null; 定义带外层,方便下边的其他方法写入的时候使用

9.1.2在结束的时候关闭io

9.1.3写入内容方法使用,这玩意\r 可加可不加,在工具类中已经添加了换行\这里加就是还俩行看好看即可,自行决定

10.日志效果图

11.文件写入刷新如文件数据效果

11.1这东西有时候经常显示0kb,但其实真是的数据以及进去了



介绍

最近写爬虫,发现有的时候,爬取的东西多,会出现挂掉的情况,解析出的东西解析出没多久,就挂掉了

就白爬取了,为了方便,吧所有数据都保留下来,采用如下方法,写了这个自定义log爬取记录数据到本地

文件的服务

 

效果图

 

下面介绍下思路

1.创建文件 FileWriter

2.实例化一个有FileWriter 的工具类

3.填入要创建的文件地址 和文件名称 

4.构造方法,堆FileWriter new 一个对象

5.编写写入方法

6.编写关闭io方法

7.记录数据要记录监测的数据条数值,通过条数值记录

8.更具条数值,当服务挂掉,或爬取,已经被监控成爬取服务,不给返回正常数据后,

9.开始更换ip,将服务关掉,修改初始爬取值位置,进行继续爬取

 

工具类代码

1.工具类全部依赖

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

import com.alibaba.druid.support.logging.Log;
import com.alibaba.druid.support.logging.LogFactory;
复制代码

 

2.检查文件夹是否存在,检查文件是否存在,没有创建

/**
	  * 如果文件为空创建文件
	  * 
	  * @author jianghy
	  * 
	  * @param logaddress 地址
	  * @param logFileName 文件名称
	  * 
	  */
   public static void createFile(String logaddress,String logFileName) {
   	File file0 = new File(logaddress);//判断地址是否存在
		if (!file0.exists()) {
			file0.mkdir();
		}
		File file1 = new File(logaddress+logFileName);//判断文件是否存在,没有添加
		if (!file1.exists()) {
			try {
				file1.createNewFile();
			} catch (IOException e) {
				log.error("创建文件异常:"+e.toString());
				return;
			}
		}
   }
复制代码

 

2.1这个方法可以单独使用,方面处理io方面的时候见文件使用使用方法

public static void main(String[] args) {
String logFileName = "zjwsj"+System.currentTimeMillis()+".log";
		String logaddress = "D:/test/wexxxbrary/author/log/";
		log.info("file address:"+logaddress+logFileName);
		
		//1单独创建文件使用
		WriteFileTextUitl.createFile(logaddress,logFileName);

}
复制代码

 

3.一个私有参数

	
private FileWriter writer = null;
复制代码

 

4.构造方法加载FileWriter

/**
	 * 写入文件名和文件地址
	 * 
	 * @param fileAddress
	 * @param FileName
	 *
	 * @author jianghy
	 *
	 */
	public WriteFileTextUitl(String fileAddress,String FileName){
		try {
			createFile(fileAddress,FileName);
			writer = new FileWriter(fileAddress+FileName, true);
		} catch (IOException e) { 
			log.error("对象 FileWriter 创建 打开文件异常  "+e.toString());
			return;
		}
	}
复制代码

 

5.写入文本

/**
	 * 写入文本
	 * 
	 * @param text
	 */
	public void writeText(String text){
		try {
			writer.write("\r"+text);
            writer.flush();
		} catch (IOException e) {
			log.error("对象 FileWriter 写入异常  "+text+" "+e.toString());
		}
	}
复制代码

 

6.关闭io

/**
	 * 关闭io
	 * 
	 */
	public void close(){
		try {
			writer.close();
		} catch (IOException e) {
			log.error("对象 FileWriter 关闭异常  "+e.toString());
		}
	}
复制代码

 

7.main方法调用

public static void main(String[] args) {
		String logFileName = "zjwsj"+System.currentTimeMillis()+".log";
		String logaddress = "D:/test/wenzhuxieCreateLibrary/author/log/";
		log.info("file address:"+logaddress+logFileName);
		
		 
		
		//2编辑日志使用
		WriteFileTextUitl wftu = new WriteFileTextUitl(logaddress,logFileName);
		wftu.writeText("哈哈哈");
		wftu.close();//最后必须手动关闭io
		
		
		
	}
复制代码

 

 

8.全量代码

package com.superman.uitl;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

import com.alibaba.druid.support.logging.Log;
import com.alibaba.druid.support.logging.LogFactory;

/**
 * 写入文件文本 工具类<br/>
 * 
 * 为方便爬虫工具进行写入日志<br/>
 * 
 * 
 * @author jianghy
 *
 */
public class WriteFileTextUitl {

	private final static Log log = LogFactory.getLog(WriteFileTextUitl.class);

	public static void main(String[] args) {
		String logFileName = "zjwsj"+System.currentTimeMillis()+".log";
		String logaddress = "D:/test/wenxxsexibrary/author/log/";
		log.info("file address:"+logaddress+logFileName);
		
		//1单独创建文件使用
		//WriteFileTextUitl.createFile(logaddress,logFileName);
		
		//2编辑日志使用
		WriteFileTextUitl wftu = new WriteFileTextUitl(logaddress,logFileName);
		wftu.writeText("哈哈哈");
		wftu.close();//最后必须手动关闭io
		
		
		
	}
	
	private FileWriter writer = null;
	
	/**
	 * 写入文件名和文件地址
	 * 
	 * @param fileAddress
	 * @param FileName
	 *
	 * @author jianghy
	 *
	 */
	public WriteFileTextUitl(String fileAddress,String FileName){
		try {
			createFile(fileAddress,FileName);
			writer = new FileWriter(fileAddress+FileName, true);
		} catch (IOException e) { 
			log.error("对象 FileWriter 创建 打开文件异常  "+e.toString());
			return;
		}
	}
	
	/**
	 * 写入文本
	 * 
	 * @param text
	 */
	public void writeText(String text){
		try {
			writer.write("\r"+text);
            writer.flush();
		} catch (IOException e) {
			log.error("对象 FileWriter 写入异常  "+text+" "+e.toString());
		}
	}
	
	/**
	 * 关闭io
	 * 
	 */
	public void close(){
		try {
			writer.close();
		} catch (IOException e) {
			log.error("对象 FileWriter 关闭异常  "+e.toString());
		}
	}
	
	 /**
	  * 如果文件为空创建文件
	  * 
	  * @author jianghy
	  * 
	  * @param logaddress 地址
	  * @param logFileName 文件名称
	  * 
	  */
   public static void createFile(String logaddress,String logFileName) {
   	File file0 = new File(logaddress);//判断地址是否存在
		if (!file0.exists()) {
			file0.mkdirs();
		}
		File file1 = new File(logaddress+logFileName);//判断文件是否存在,没有添加
		if (!file1.exists()) {
			try {
				file1.createNewFile();
			} catch (IOException e) {
				log.error("创建文件异常:"+e.toString());
				return;
			}
		}
   }
   
}
复制代码

这里进行了一次调整升级 20210315

  • 之前是 file0.mkdir();
  • 改成 file0.mkdirs();   如此可以创建多层文件夹,上边那个只可以创建一层文件夹

 

 

 

9.外部爬虫类调用使用,用来记录实时更新解析出的数据 ,这个是爬虫接口的,爬虫html解析的自行调节

package com.superman.test.wenzhuxie;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.alibaba.druid.support.logging.Log;
import com.alibaba.druid.support.logging.LogFactory;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.superman.uitl.ExcelUitl;
import com.superman.uitl.ExeclToJson;
import com.superman.uitl.NetworkUitl;
import com.superman.uitl.WriteFileTextUitl;

/**
 * 给作xx加信息
 * 
 * @author jianghy
 *
 */
public class authorAddInfo implements Runnable {

	private final static Log log = LogFactory.getLog(wzxWebsiteAuthor.class);

	/**
	 * 爬取xxx数据
	 * 
	 * 名字首字母
	 * 
	 * a到z数据
	 * 
	 * h
	 * 
	 */
	WriteFileTextUitl wftu = null;
	
	/**
	 * 执行任务
	 * @throws IOException 
	 * 
	 */
	public void task()  {
		String logFileName = "zjwsj"+System.currentTimeMillis()+".log";
		String logaddress = "D:/test/wenzhxxxary/author/log/";
		log.info("file address:"+logaddress+logFileName);
		wftu = new WriteFileTextUitl(logaddress,logFileName);
		
		try {
			// 服务开始
			long startTime = System.currentTimeMillis(); // 获取开始时间
			
			//打开xx文件,对具体网站查询
			String fileUrl = "D:/test/wenzxxy/author/xxxx 1611888141102.xlsx";
			JSONObject jo = ExeclToJson.excelToJson(fileUrl);
//			log.info(jo.toJSONString());
			JSONArray ja0 = jo.getJSONArray("shell1");
			log.info(ja0.size() + ""); 

			List<String> restja = new ArrayList<String>();
			for (int i = 138; i <1000; i++) {// 批量执行
				getPageData(ja0.getJSONObject(i).getString("作xx称"),i, restja, 1);
			}


			// 服务结束
			long endTime1 = System.currentTimeMillis(); // 获取结束时间
			System.out.println("---------程序_持久化_运行时间:" + (endTime1 - startTime) + "ms"); // 输出程序运行时间
		} catch (Exception e1) {
			e1.printStackTrace();
			return;
		}finally{
			wftu.close();
		}
       
	}

	/**
	 * 执行多页 分页获取all数据
	 * 
	 */
	public void getPageData(String author,int authorId, List<String> restJa, int pageNum) {
		for (int i = 0; i < pageNum; i++) {
			String url = "http://ss.xx.com/" + "?key="
					+ NetworkUitl.getURLEncoderString(author)
					+ "&status=0&ajaxdata=1&type=1&pagenum=" + (i + 1);
			System.out.println("request:" + url);
			execute(author, authorId,restJa, url);
		}

	}

	/**
	 * 获取数据 解析数据
	 * 
	 */
	public void execute(String author,int authorId, List<String> restJa, String url) {
		try {
			String context = NetworkUitl.getHTMLContentV2(url);// 网络获取数据
			System.out.println("rest context:" + context);
			if (context.equals(""))
				return;
			JSONObject jo = (JSONObject) JSONObject.parse(context);
			JSONArray list = jo.getJSONObject("data").getJSONArray("itemList");

			for (int i = 0; i < list.size(); i++) {
				JSONObject joit = list.getJSONObject(i);

				String worksauthor = joit.getString("author");// 作者xx
				String worksName = joit.getString("itemname");// 作品xx
			

				String restStr = authorId+",__,"+author+",__,"+worksauthor + ",__," + worksName ;
				
				restJa.add(restStr);
				wftu.writeText("\r"+restStr);
			}

		} catch (Exception e) {
			//e.printStackTrace();
			log.error(e.toString());
			return;
		} finally {

		}

	}

	@Override
	public void run() {
		task();
	}

	public static void main(String[] args) {
		new Thread(new authorAddInfo()).start();

	}
    
}
复制代码

 

9.1代码重点介绍

9.1.1重点一  WriteFileTextUitl wftu = null; 定义带外层,方便下边的其他方法写入的时候使用

WriteFileTextUitl wftu = null;
复制代码

 

9.1.2在结束的时候关闭io

finally{
			wftu.close();
		}
复制代码

 

9.1.3写入内容方法使用,这玩意\r 可加可不加,在工具类中已经添加了换行\这里加就是还俩行看好看即可,自行决定

wftu.writeText("\r"+restStr);
复制代码

 

10.日志效果图

意思就是加\r就是 换一行多家几个换几行,这玩意,就这样子

 

11.文件写入刷新如文件数据效果

11.1这东西有时候经常显示0kb,但其实真是的数据以及进去了

这玩意原因就是,经过测试,是windows的刷新没刷新出来

可以右击文件一下,他就提示更新的进度了,更新插入多少kb文件

 

 

 

 

 

 

 

ok

 

 

 

 

 

 

 

持续更新

 

 

 

 

 

 

 

 

分类:
后端
标签:
收藏成功!
已添加到「」, 点击更改