java 實現 自定義 log 開啟 io 建立檔案 將文字內容,寫入 文字中 ,累加寫入 最後關閉 爬蟲服務方便記錄資料,放服務掛掉和對方限制ip,導致的中端,意外停止也無妨,資料正常記錄儲存
阿新 • • 發佈:2021-01-30
技術標籤:java
目錄
2.1這個方法可以單獨使用,方面處理io方面的時候見檔案使用使用方法
9.外部爬蟲類呼叫使用,用來記錄實時更新解析出的資料 ,這個是爬蟲介面的,爬蟲html解析的自行調節
9.1.1重點一WriteFileTextUitl wftu = null; 定義帶外層,方便下邊的其他方法寫入的時候使用
9.1.3寫入內容方法使用,這玩意\r 可加可不加,在工具類中已經添加了換行\這裡加就是還倆行看好看即可,自行決定
介紹
最近寫爬蟲,發現有的時候,爬取的東西多,會出現掛掉的情況,解析出的東西解析出沒多久,就掛掉了
就白爬取了,為了方便,吧所有資料都保留下來,採用如下方法,寫了這個自定義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
持續更新