1. 程式人生 > 其它 >java 實現 自定義 log 開啟 io 建立檔案 將文字內容,寫入 文字中 ,累加寫入 最後關閉 爬蟲服務方便記錄資料,放服務掛掉和對方限制ip,導致的中端,意外停止也無妨,資料正常記錄儲存

java 實現 自定義 log 開啟 io 建立檔案 將文字內容,寫入 文字中 ,累加寫入 最後關閉 爬蟲服務方便記錄資料,放服務掛掉和對方限制ip,導致的中端,意外停止也無妨,資料正常記錄儲存

技術標籤:java

目錄

介紹

效果圖

下面介紹下思路

工具類程式碼

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.日誌效果圖


介紹

最近寫爬蟲,發現有的時候,爬取的東西多,會出現掛掉的情況,解析出的東西解析出沒多久,就掛掉了

就白爬取了,為了方便,吧所有資料都保留下來,採用如下方法,寫了這個自定義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.mkdir();
		}
		File file1 = new File(logaddress+logFileName);//判斷檔案是否存在,沒有新增
		if (!file1.exists()) {
			try {
				file1.createNewFile();
			} catch (IOException e) {
				log.error("建立檔案異常:"+e.toString());
				return;
			}
		}
   }
   
}

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就是 換一行多家幾個換幾行,這玩意,就這樣子

ok

持續更新