目录
2.1这个方法可以单独使用,方面处理io方面的时候见文件使用使用方法
9.外部爬虫类调用使用,用来记录实时更新解析出的数据 ,这个是爬虫接口的,爬虫html解析的自行调节
9.1.1重点一 WriteFileTextUitl wftu = null; 定义带外层,方便下边的其他方法写入的时候使用
9.1.3写入内容方法使用,这玩意\r 可加可不加,在工具类中已经添加了换行\这里加就是还俩行看好看即可,自行决定
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
持续更新