automa的工程还是要经常导出备份,因为经常出现突然模块消失的情况。
1 滑动分页条件区分
传统的页面都是有分页标签,这样你很容易知道,应该用分页来做。但是现在手机端的应用基本都是上滑就可以分页,再混合式开发的环境下,公司为了节省成本,大部分都可以实现一套代码,再不同形态环境做适配,而这样给我们做爬虫也造成了困难。
在控制台中执行,获取元素高度,通过判断,是可以的
但是使用automa中使用js条件模块却获取不到值,实际得不到,这是为何?
const elVal = document.getElementsByClassName('explorer-file-list-virtualized__container')[0];
return elVal.scrollHeight > elVal.clientHeight;
之所以出不来是因为,这个地方应该选择当前标签页
接下载我想着,干脆使用滚动元素,让页面中的数据全部加载进来,再循环,结果发现页面上明明有1000条数据,但使用document.querySelectorAll('.file-list-item').length
却只得到20条,这是为何?
如果让他在每次循环后,进行滚动。
看结果,奇怪的是中间跳号,数据丢失了!
推理,出现跳行,可能因为根据垂直滚动的高度有关.于是设置为20,则发现界面在一点点动,数据会被重复插入。那么你怎么知道怎样才是合理的高度,勾选上滚动查看
也是同样的问题,而且滚动的速度分页太慢。
2 延迟的处理
延迟的位置还是很重要,特别是悬停元素使用时.例如下图,因为最后一个悬停元素,点击后,会出现下载文件,因此再之前做一个延迟,防止多级浮动按钮没有出来。接着再关闭页签之前,也设置一个较长时间的延迟,因为下载文件还没有被发现之前就关闭当前页签,浏览器会忽略这次下载行为。因此需要补上。
3 重复执行的去重判断
技术性demo都没什么问题,但是一旦工程化,就复杂了。例如下面的工作流程,循环、子工作流、条件、滚动元素等基本都包含了,而且采集的数据也非常多,靠人力很难枚举各种情况,于是除了问题,又不想把之前的反复下载,如何解决呢?再使用过程中,下载文件到300多项时,浏览器崩溃,只下载了30%,再重复下载或者调试,浪费了不少时间,如何解决呢?
首先看为什么工作流出错,就停止工作流呢?因为这个地方默认值设置,就是这样。
可以调整为“继续运行”。
最容易想到为了防止重复采集,我把已经采集的文件名变量整理出来,然后写入到全局变量里面,接着再全局变量来判断。但是因为文件太多,所以只好写一个python脚本来生成目录清单的json文件
# -*- coding: utf-8 -*-
# @time : 2024-01-14 10:41
# @author : dzm
# @dsec : 遍历文件目录
import os
import json
def ergocic(src):
if os.path.exists(src):
os.chdir(src)
file_names = []
for dir in os.listdir(src):
if (os.path.isfile(dir)):
# 文件
pass
else:
# 目录
for root,dirs,files in os.walk(dir):
for file in files:
src_file = os.path.join(src,root,file)
file_names.append(os.path.basename(src_file))
# 将数组转json文件,encoding="utf8"和ensure_ascii=False都不能少,否则会中文会转义为unicode
with open('文件清单.json','w',encoding="utf8") as f:
f.write(json.dumps(file_names,ensure_ascii=False))
else:
print('目录不存在')
if __name__ == "__main__":
src = r'D:\appworks\文件'
ergocic(src)
虽然很快可以拿到数据,但是实时并不是所想的那么顺利,因为全局变量有字符限制。因此这条路行不通了。
有下面三个组件,但是我们访问不了google,怎么办呢?那是不是可以把数据存储在某一个服务中,然后再发送http请求去获取,再判重,嗯,这条路应该行的通。
原想着我把数据存储在mock网站上,结果提示下面的错误,这真实无语了。
于是用java写一个后台服务文章来源:https://www.toymoban.com/news/detail-787348.html
import java.io.IOException;
import java.net.URISyntaxException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
@GetMapping("getCsnts")
public ResponseResult<String> getCsnts() throws IOException, URISyntaxException {
String pathName = "json/文件清单.json";
Path path = Paths.get(getClass().getClassLoader().getResource(pathName).toURI());
byte[] fileContent = Files.readAllBytes(path);
String content = new String(fileContent, StandardCharsets.UTF_8);
ResponseResult<String> resp = new ResponseResult<>(true);
resp.setData(content);
return resp;
}
从返回结果中取值,然后给变量csnts
赋值,因为我的响应值是这样的,所以写的是data
,不要以为千篇一律都是这样的。
这样就可以减少文件下载次数了
文章来源地址https://www.toymoban.com/news/detail-787348.html
到了这里,关于automa插件使用的一些实战经验2的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!