文末附上了多线程爬虫的实现文章。
本人在做接口测试中,遇到一个活儿,将一批图片上传到服务器,12000+,在一个文件夹中不同的文件夹里面,由于上传文件过多,只能写脚本批量上传。也算是自动化的一部分吧,经过测试和改良,终于完成,期间由于种种原因失败60+次,做了第二次上传,分享代码,供大家参考。
思路是先把文件的绝对地址拿出来,第一想核对一下文件数量,第二为了确定文件上传顺序,方便断点续传。
下面是获取文件路径的方法:List<String> list = new ArrayList<>(); 2 int aaa = 0; 3 File file = new File("/Users/Vicky/Desktop/aaa"); 4 output(file.getAbsolutePath()); 5 File[] files = file.listFiles(); 6 int length = files.length; 7 for (int i = 0; i < length; i++) {8 if (files[i].isDirectory()) {9 File[] file1 = files[i].listFiles();10 output(file1.length);11 output(file1[0].getAbsolutePath());12 for (int j = 0; j < file1.length; j++) {13 String name = file1[j].getAbsolutePath();14// output(name);15 if (!name.contains("DS_Store")) {16 list.add(name);17 aaa++;18 }19 }20// aaa++;21 }22// output(files.length);23 }24 output(aaa, list.size());25 Concurrent.saveRequestTimes(list); 下面是保存路径文件的方法:/** 2 * 获取文件夹下所有文件的绝对路径的方法 3 * 4 * @param path 5 * @return 6 */ 7 public static List<String> getAllFile(String path) { 8 List<String> list = new ArrayList<>(); 9 File file = new File(path);10 File[] files = file.listFiles();11 int length = files.length;12 for (int i = 0; i < length; i++) {13 File file1 = files[i];14 if (file1.isDirectory()) {15 List<String> allFile = getAllFile(file1.getAbsolutePath());16 list.addAll(allFile);17 continue;18 }19 String path1 = file1.getAbsolutePath();20 if (path1.contains("/.")) continue;21 list.add(path1);22 }23 return list; } 下面是执行请求的方法:Admin admin = new Admin(); 2 List<String> list = readTxtFileByLine("/Users/Vicky/Documents/workspace/fission/log/test.log"); 3 List<Integer> list1 = new ArrayList<>(); 4 int size = list.size(); 5 output(size); 6 try { 7 for (int i = 0; i < size; i++) {8 String pic = list.get(i);9 admin.update(pic);10 list1.add(i);11 output(i + pic);12 }13 } catch (Exception e) {14 output("", e);15// } finally {16// logLog(list1.toString());17 }18// admin.update();19 testOver(); 其中updata方法就不写了,只是一个普通的上传文件的post请求而已。
其中读取文件并返回list集合的方法如下:/** 2 * 分行读取txt文档,默认使用utf-8编码格式 3 * 4 * @param filePath 文件路径 5 * @return 返回list数组 6 */ 7 public static List<String> readTxtFileByLine(String filePath) { 8 List<String> lines = new ArrayList<>(); 9 try {10 String encoding = "utf-8";11 File file = new File(filePath);12 if (file.isFile() && file.exists()) { // 判断文件是否存在13 FileInputStream fileInputStream = new FileInputStream(file);14 InputStreamReader read = new InputStreamReader(fileInputStream, encoding);// 考虑到编码格式15 BufferedReader bufferedReader = new BufferedReader(read);16 String line = null;17 while ((line = bufferedReader.readLine()) != null) {18 lines.add(line);19 }20 bufferedReader.close();21 read.close();22 fileInputStream.close();23 } else {24 output("找不到指定的文件");25 }26 } catch (Exception e) {27 output("读取文件内容出错");28 e.printStackTrace();29 }30 return lines;31 }
记录上传失败时的方法在output方法中已经写好了,是记录日志的方法,这里就不写了,在统计失败数据的时候可以用请求响应大小来区分失败和成功,以及失败类型,这都是框架的基本功能,这里先不写了,毕竟内容比较多。
如需多线程实现,可参考:多线程爬虫
|