# 自动化采集组件 **Repository Path**: barryaleen/auto_collect_widget ## Basic Information - **Project Name**: 自动化采集组件 - **Description**: 基于 DP 的 0 代码数据采集组件 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2024-10-01 - **Last Updated**: 2024-10-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 基于DrissionPage的零代码数采组件 ## 引言 写这玩意儿的初衷是因为热爱吧,自己写了几个用于简化标注流程的软件,但是对于数据采集这块,一直都是额外再写采集代码。 每次梳理完采集逻辑,实际上就是单纯的`访问网页->解析src->下载`或者`访问网页->截图元素`。 这样子的采集真的跟现在每天的上班日子一样`枯燥乏味`,而且非常的der! 所以我就想着能不能做一个零代码的数采组件,让用户只需要配置一下流程+参数,就能完成数据采集的工作。 同时呢,对于这个组件,设计的初衷是能够非常方便接入其他的开源标注器,例如`labelme`,`labelimg` 以及`自己做的旋转和汉字点选标注器`等等,这样子就能够实现数据采集和标注的一体化! 还有就是最重要的一点,这个组件需要能`share`和`import`流程组,这样才能更方便小白使用! 于是,这个组件,它就诞生了!!! 美中不足的是,目前暂时还没找到能实现鼠标拖拽找xpath的方案,这一块后面再慢慢实现,目前只能手动输入xpath了,最坏的结果就是往浏览器中注入一段js。 ⬇️ ⬇️ ⬇️ ⬇️ ⬇️自己写的标注器 ⬇️ ⬇️ ⬇️ ⬇️ ⬇️ ![数采组件界面3](datasets/img_6.png) ![数采组件界面3](datasets/img_7.png) ⬆️️️️⬆️️️️⬆️️️️⬆️️️️⬆️️️️⬆️️️️⬆️️️️自己写的标注器 ⬆️️️️⬆️️️️⬆️️️️⬆️️️️⬆️️️️⬆️️️️⬆️️️️ 好了,结束了引言,下面就是正文啦~ ## 更新日志 2024-07-08 - 首次发版 2024-07-09 - 指令界面插入优化 - 优化部分逻辑 - 调整了控制台普通日志和异常日志的输出形式,增加了颜色区分以及等级输出 2024-07-10 - 新增了`取当前循环次数()`嵌套指令,有了这个指令,可以更方便的使selector、message、url模板化,详细请看嵌套指令板块 2024-07-16 - 新增了参数模板功能,有了这个功能,可以更方便的使`selector`、`message`、`url`、`excel_save_path`、`excel_col_content`、`head_list`模板化,详细请看参数模板板块 - 新增 excel 相关操作 ## 组件的引入 ```python from WidgetFunctionStarter import DataCollectWidgetFunctionStarter from PyQt5.QtWidgets import QWidget qw = QWidget() DataCollectWidgetFunctionStarter(qw) # 只要把 qw 添加到界面中即可,这块可以自己实现 tabWidget.addTab(qw, "数采区") ``` ## 嵌套指令解释 嵌套指令不属于控制指令,嵌套指令是用于在参数中嵌套其他指令的指令,例如`取当前循环次数()`,这个指令是用于在参数中嵌套当前循环次数的指令,这样就可以实现参数的模板化,例如`x://div[@class='{取当前循环次数()}']` 注意⚠️:使用嵌套函数必须用`{}`包裹,否则不会被解析,目前仅`selector`、`message`、`url`、`excel_save_path`、`excel_col_content`、`head_list`这三个参数支持嵌套函数 嵌套指令中可以使用数学表达式,当然,你需要保证嵌套指令的返回值是数字型 ### `取当前循环次数()` > 用于在参数中嵌套当前循环次数的指令,例如`x://div[@class='{取当前循环次数()}']`,这样就可以实现参数的模板化。 > 你也可以使用数学表达式,例如`x://div[@class='{取当前循环次数()+1}']`,这样就可以实现参数的模板化。 > 注意⚠️:使用此函数需要在`计次循环`中使用,否则取不到循环次数。 ## 参数模板 得益于嵌套指令的实现,在FlowBus中引入了一个临时变量池,这样子就可以实现变量的模板化,所有有返回值的指令都会被存储到临时变量池中,这样子就可以实现参数的模板化,请看以下的例子 ![img.png](datasets/img_9.png) 此处使用了带返回值的`取元素属性`指令,并存储到cutImg_style这个变量中 ![img.png](datasets/img_10.png) 接着,用`打印日志`指令打印出来,打印内容为`{cutImg_style}` 最终效果如下⬇️ ![img.png](datasets/img_11.png) 可以发现,参数模板和嵌套指令类似,都需要用`{}`包裹,这样子才会被解析 所以请注意⚠️:使用参数模板必须用`{}`包裹,否则不会被解析,目前仅`selector`、`message`、`url`这三个参数支持嵌套函数 ## 指令解释 ### `元素截图上报` > 用于截取指定元素的截图,并上报到后台服务器。 > 该指令的参数为上报地址,例如127.0.0.1:3000 > 同时,另一侧需要开启一个socket服务,用于接收截图数据,具体代码如下: ```python import socket def receive_image(save_path, host_ip, host_port): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind((host_ip, host_port)) sock.listen(1) print("Waiting for connection...") conn, addr = sock.accept() print(f"Connected by {addr}") # 接收图片大小 data_size = int.from_bytes(conn.recv(8), 'big') # 接收图片数据 received_data = b"" while len(received_data) < data_size: packet = conn.recv(4096) if not packet: break received_data += packet with open(save_path, 'wb') as f: f.write(received_data) print("Image received and saved.") conn.close() sock.close() if __name__ == "__main__": save_path = "path/to/save/image.jpg" # 修改为保存图片的路径 host_ip = "0.0.0.0" # 修改为监听的 IP 地址 host_port = 12345 # 修改为监听的端口 receive_image(save_path, host_ip, host_port) ``` ### `等待标注完成` > 用于等待用户完成标注操作,当用户完成标注操作后,需手动向当前窗体发送完成指令,以便继续执行后续操作。 > 此功能目前还没来得及测试!!!! ### `计次循环` > 用于循环执行指定次数的指令。 > 该指令的参数为循环次数,例如 10,表示循环执行 10 次。 > 该指令会产生两个节点,一个`计次循环首`和一个`计次循环尾`,在执行时,会先执行`计次循环首` > ,然后执行循环内的指令,执行完后,再执行`计次循环尾`,然后再次执行`计次循环首`,如此循环。 ### `退出计次循环` > 用于退出当前的计次循环。 > 该指令不需要参数,直接执行即可。 > 注意⚠️:该指令需要在`计次循环`内部执行,即前后需要存在一个`计次循环首`和一个`计次循环尾`,否则会报错。 ### `无限循环` > 用于无限循环执行指定的指令。 > 该指令不需要参数,直接执行即可。 > 该指令会产生两个节点,一个`无限循环首`和一个`无限循环尾`,在执行时,会先执行`无限循环首` > ,然后执行循环内的指令,执行完后,再执行`无限循环尾`,然后再次执行`无限循环首`,如此循环。 > 注意⚠️:该指令可能会导致流程无法停止,流程在启动时会进行检查。 ### `退出无限循环` > 用于退出当前的无限循环。 > 该指令不需要参数,直接执行即可。 > 注意⚠️:该指令需要在`无限循环`内部执行,即前后需要存在一个`无限循环首`和一个`无限循环尾`,否则会报错。 ### `输出最近返回值` > 用于输出最近一次的返回值。 > 注意⚠️:此功能目前还没实现!!!!!!! ### `打印日志` > 此功能可以在中下方的控制台中输出指定的日志信息。 ### `等待` > 用于等待指定的时间,单位为秒。 ### `访问网页` > 用于访问指定的网页,参数为网页的URL和重试次数。 ### `停止页面加载` > 用于停止当前页面的加载。 ### `元素出现` > 用于等待指定元素出现,参数为元素的xpath和超时时间。 > 该指令会产生两个节点,一个`元素出现首`和一个`元素出现尾`,在执行时,会先执行`元素出现首` > ,然后等待元素出现,出现后执行后续指令,如果超时或元素未出现,则直接跳过当前流程块。 ### `元素未出现` > 用于等待指定元素未出现,参数为元素的xpath和超时时间。 > 该指令会产生两个节点,一个`元素未出现首`和一个`元素未出现尾`,在执行时,会先执行`元素未出现首` > ,如果在规定的超时时间内,元素未出现,则执行块内流程,如果超时或元素出现,则直接跳过当前流程块。 ### `插入一行` > excel预导出数据列中插入一列新的空行 > 请注意⚠️,一旦插入了新行,那么将无法操作原来的行,所以请谨慎操作 ### `插入多列` > excel预导出数据列中插入多列新的空行 > ⚠️此操作支持同时插入多列,多列之间请用英文逗号(,)隔开 > 此操作也支持模板化,即可以使用`{}`包裹,例如`{取当前循环次数()}` ### `导出Excel` > 用于导出excel文件,参数为文件路径和表头列表。 > 文件路径和表头列表支持模板化,即可以使用`{}`包裹,例如`{取当前循环次数()}`,也可以使用变量名,例如`{excel_save_path}`。 > ⚠️:文件路径不需要加后缀,程序会自动添加后缀。 > ⚠️:表头列表需要用英文逗号(,)隔开,例如`姓名,年龄,性别`。 ## 界面功能简介 ### 单步执行功能 我认为这是一个`很有意思`的功能,可以用于调试指令的执行情况,可以逐步执行指令,查看指令的执行情况。 当用户插入一行指令后,想看一下这行指令的执行情况,可以双击只一行,这样就单独执行这一块,如果是循环指令,他会自动寻找尾节点,然后执行这一整块的功能 ### 死循环检查 在点击`开始`按钮后,会自动检查是否存在死循环,如果存在死循环,会弹出提示框,提示用户是否继续执行,如果继续执行,会自动跳过死循环,继续执行后续指令。 ### 流程合规性检查 在点击`开始`按钮后,会自动检查流程的合规性,如果存在不合规的情况,会弹出提示框,告知用户存在不合规的情况,此时程序不会执行,直到流程合规。 ### 插入流程 ~~插入流程分为 4 种情况:~~ ~~1. 插入到当前行的上方~~ ~~1.1. 此时需要在流程明细中选择一个流程,然后点击`选中前插`按钮,即可插入到当前行的上方~~ ~~2. 插入到当前行的下方~~ ~~2.1. 此时需要在流程明细中选择一个流程,然后点击`选中后插`按钮,即可插入到当前行的下方~~ ~~3. 插入到流程明细的最顶部~~ ~~3.1. 只需要配置完参数后,点击`插到开头`按钮即可~~ ~~4. 插入到流程明细的最底部~~ ~~4.1. 只需要配置完参数后,点击`插到结尾`按钮即可~~ 在新版本中,考虑到4个按钮实际上是非常的冗余,在选择的时候,需要用户花时间去辨别,所以在新版本中,只保留了`插入`按钮 点击`插入`按钮后,会自动判断当前的选中行,然后插入到选中行的下方。 如果没有选中行,则会插入到流程明细的最底部。 如果需要到最顶部,那么只需要在插入后,右键对应的行,选择`移动到最顶部`即可,最底部同理。 ## 后续要完成的事情 - 细化流程逻辑检查,让其更加的严谨 - 死循环判断,目前完成了初版的死循环判断,但是还有很多的不足 - 更多的指令,视情况而定 - [x] 指令界面插入优化,目前为下拉框,没有分组,不够直观 - 完成win下的界面兼容,目前开发为mac下的界面,win下会有一些问题 - xpath的自动获取,目前需要用户自己去取,对新手不太友好,有违背零代码,降低开发难度的初衷 - [x] 计次循环中提供`取当前循环次数`的功能 - [x] 指令中的参数提供模板替换功能,例如 selector参数中 x://div[@class='xxx'] 可以替换为 x://div[@class='{取当前循环次数()}'] ## 界面 ## 新版本的指令插入界面 ![数采组件界面3](datasets/img_8.png) 下方的界面主要是演示功能,为第一版本的指令插入界面 ### 接入其他标注器 ![数采组件界面1](datasets/img.png) ### 单独运行界面 ![数采组件界面2](datasets/img_1.png) ### TCP上报DEMO ![数采组件界面3](datasets/img_2.png) ### 流程合规性检查 ![数采组件界面3](datasets/img_3.png) ### 死循环风险检查 > 请注意,此处的逻辑不是非常严谨,只是一个简单的检查,例如先退出计次循环,之后来一行退出无限循环,这种情况是检测不出来的 ![数采组件界面3](datasets/img_4.png) ### 节点执行失败 ![数采组件界面3](datasets/img_5.png)