JS脚本实现RPA模拟人工操作网页获取数据

news2024/11/15 4:38:15

一、首先我们可以根据查询条件去预置一个Excel,比如我们以公司名称为例。

二、然后我们用JS读取Excel内容,进行页面打开与条件记录

<!DOCTYPE html>
<html>
<div style="text-align: center;margin-top: 300px;">
    <input type="file" id="input-excel" accept=".xls,.xlsx"/>
    <button onclick="START()"
            style="background-color: #4CAF50; color: white; padding: 15px 32px; text-align: center;
             text-decoration: none; display: inline-block; font-size: 16px; margin: 4px 2px;
             cursor: pointer;">
        START
    </button>
</div>
</html>

<script src="./xlsx/xlsx.js" charset="utf-8"></script>
<script>
    function START() {
        const input = document.getElementById('input-excel');
        const file = input.files[0];
        if (!file) {
            alert('请选择一个Excel文件');
            return;
        }

        const reader = new FileReader();
        reader.onload = function (e) {
            const data = e.target.result;
            const workbook = XLSX.read(data, {type: 'array'});
            const sheetName = workbook.SheetNames[0];
            const sheet = workbook.Sheets[sheetName];
            const jsonData = XLSX.utils.sheet_to_json(sheet);
            console.log(jsonData);
            let companyList = [];
            for (var i = 0; i < jsonData.length; i++) {
                companyList.push(jsonData[i].company);
            }
            // alert(JSON.stringify(companyList))
            setTimeout(function () {
                window.open("https://sjfw.scjs.net.cn:8801/xxgx/Enterprise/eList.aspx?myindex=0&mycompany="
                    + JSON.stringify(companyList), "_self")
            }, 3000)
        };
        reader.readAsArrayBuffer(file);
    }
</script>

三、打开页面后,我们要利用Cookie来记录我们的关键值,如公司名称、读取下标记,其次最重要的就是页面的元素操作。

四、我们根据条件查询到我们所需要的信息,就可以利用JS自动保存这些信息到Cookie,如果页面会自动刷新也需要利用条件判断来控制。处理好全部后我们也可以用Cookie存储全局信息。


let situationNameList = [];
let situationTimeList = [];
let finalSituationList = [];
let finalSituationTimeList = [];
if (getCookie("part_1_click") == "1") {
    console.log("part_1_click 点击过");
    situationNameList = JSON.parse(getCookie("situationNameList"));
    situationTimeList = JSON.parse(getCookie("situationTimeList"));
    finalSituationList = JSON.parse(getCookie("finalSituationList"));
    finalSituationTimeList = JSON.parse(getCookie("finalSituationTimeList"));
}

let personList = []; // 三类人员数
if (getCookie("part_3_click") == "1") {
    personList = JSON.parse(getCookie("personList"));
}


// 测试打印
console.log("我是wdfgdzx");
if (localStorage.getItem('hasRun3') !== 'true') {
    // 这里放置只需要执行一次的代码
    console.log('这段代码只会在页面刷新的情况下执行一次');
    clearCookie("clickTime")
    // 更新localStorage,表示代码已经执行过
    localStorage.setItem('hasRun3', 'true');
}

// 1、获取上个地址传递的URL参数方法
function getURLParameter(name) {
    const urlParams = new URLSearchParams(window.location.search);
    return urlParams.get(name);
}

if (!getCookie("clickTime") == "1") {
    // 2、获取公司集合
    let companyList;
    let index = 0;
    if (getCookie("myindex") == null) {
        index = parseInt(getURLParameter("myindex")); //公司下标
        companyList = JSON.parse(getURLParameter("mycompany"));
    } else {
        index = parseInt(getCookie("myindex")); // 如果myindex存过cookie 执行过则从cookie取下标更新
        companyList = JSON.parse(getCookie("mycompany"));
    }
// 3、用公司名称自动填写
    let companyInput = document.getElementById("mc");
    companyInput.value = companyList[index];
// 4、点击搜索按钮
    let searchButton = document.getElementById("MainContent_Button1");
    setCookie("mycompany", JSON.stringify(companyList), 1); // 设置到cookie里
    setCookie("myindex", JSON.stringify(index), 1); // 不管是否用过都要更新cookie
    setTimeout(function () {
        searchButton.click()
        setCookie("clickTime", "1", "1");
    }, 1000)
// 5、自动点击a标签!!!!!!!!!!!!!!!!!!!!这个是每次都要执行的
    setTimeout(function () {
        let current_target = document.getElementsByTagName('a');
        console.log(current_target.length)
        for (let i = 0; i < current_target.length; i++) {
            let temp = current_target[i];
            console.log("我打印的" + temp.innerText)
            if (temp.innerText == companyList[index]) {
                console.log("我打印的" + temp.innerText)
                // temp.click()
            }
        }
    }, 5000)
} else {
    setTimeout(function () {
        let companyList = JSON.parse(getCookie("mycompany"));
        let index = parseInt(getCookie("myindex")); //公司下标
        let current_target = document.getElementsByTagName('a');
        console.log(current_target.length)
        if (!getCookie("part_1_click") == "1") {
            part_1();
            console.log("执行了part_1方法")
        }
        if (!getCookie("part_2_click") == "1") {
            part_2();
            console.log("执行了part_2方法")
        }
        if (!getCookie("part_3_click") == "1") {
            part_3();
            console.log("执行了part_3方法")
        }

        for (let i = 0; i < current_target.length; i++) {
            let temp = current_target[i];
            // console.log("我打印的" + temp.innerText)
            if (temp.innerText == companyList[index]) {
                console.log("我打印的" + temp.innerText)
                temp.click()
                // alert("执行了")
                // 先不着急清理
                // clearCookie("clickTime");
            }
        }
    }, 2000)
}

// 设置cookie
function setCookie(name, value, days) {
    var expires = "";
    if (days) {
        var date = new Date();
        date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
        expires = "; expires=" + date.toUTCString();
    }
    document.cookie = name + "=" + (value || "") + expires + "; path=/";
}

// 获取cookie
function getCookie(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for (var i = 0; i < ca.length; i++) {
        var c = ca[i];
        while (c.charAt(0) == ' ') c = c.substring(1, c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
    }
    return null;
}


function part_1() {
    setTimeout(function () {
        let thList = document.getElementsByTagName('th')
        for (let i = 0; i < thList.length; i++) {
            // console.log(thList[i].innerText);
            // console.log(thList[i].innerText.includes("质"));
            if (thList[i].innerText.includes("质")) {
                let nextTh = thList[i].nextElementSibling;
                // console.log(thList[i])
                // console.log(thList[i].innerText);
                // console.log(nextTh.innerText);
                situationNameList.push(nextTh.innerText);// 添加资质内容
            }
            if (thList[i].innerText.includes("有效期")) {
                let nextTh = thList[i].nextElementSibling;
                // console.log(nextTh.innerText)
                situationTimeList.push(nextTh.innerText);// 添加资质过期时间
            }
        }
        for (let i = 0; i < situationNameList.length; i++) {
            let temp = situationNameList[i] + "---有效期" + situationTimeList[i];
            finalSituationList.push(temp);
        }
        console.log(finalSituationList)// 资质和到期时间
        console.log(situationTimeList[situationTimeList.length - 1]) //安装许可证日期
        let AX = "安许 有效期" + situationTimeList[situationTimeList.length - 1];
        finalSituationList.push(AX);
        // alert("执行了")
        /*  for (let i = 0; i < situationTimeList.length - 1; i++) { // 单独展示到期时间
              finalSituationTimeList.push(situationTimeList[i]);
          }*/
        finalSituationTimeList.push(situationTimeList[situationTimeList.length - 1]);  //安许到期时间

        let temp = situationTimeList; // 剔除安许,展示其他证书的到期时间
        situationTimeList = []
        for (let i = 0; i < temp.length - 1; i++) {
            situationTimeList.push(temp[i]);
        }
        setCookie("part_1_click", "1", 1);
        setCookie("situationNameList", JSON.stringify(situationNameList), 1);
        setCookie("situationTimeList", JSON.stringify(situationTimeList), 1);
        setCookie("finalSituationList", JSON.stringify(finalSituationList), 1);
        setCookie("finalSituationTimeList", JSON.stringify(finalSituationTimeList), 1);


    }, 2000)
}

function part_2() {
    setTimeout(function () {
        let aList = document.getElementsByTagName('a')
        for (let i = 0; i < aList.length; i++) {
            if (aList[i].innerText.includes("企业人员")) {
                console.log(aList[i].innerText)
                aList[i].click()
                setCookie("part_2_click", "1", 1);
            }
        }
    }, 3000)
}

function part_3() {
    setTimeout(function () {
        let tdList = document.getElementsByTagName('td')
        for (let i = 0; i < tdList.length; i++) {
            if (tdList[i].innerText == "三类人员") {
                // console.log(tdList[i].innerText)
                let upNode = tdList[i].previousElementSibling;
                // console.log(upNode.innerText) // 人名
                let nextNode = tdList[i].nextElementSibling;
                // console.log(nextNode.innerText);//证书登记
                // console.log(extractLetters(nextNode.innerText));
                let nextTwoNode = nextNode.nextElementSibling;
                let haveNode = nextTwoNode.nextElementSibling;
                console.log(haveNode.innerText);//证书有效期
                personList.push(upNode.innerText + "--" + extractLetters(nextNode.innerText) + "--" + haveNode.innerText);
            }
        }
        console.log(personList)
        setCookie("part_3_click", "1", 1);
        setCookie("personList", JSON.stringify(personList), 1)
        let companyList = JSON.parse(getCookie("mycompany"));
        let index = parseInt(getCookie("myindex")); //公司下标
        let obj = {
            "name": companyList[index],
            "situation": finalSituationList,
            "end": situationTimeList,
            "install": finalSituationTimeList,
            "person": personList
        }
        let ALL_GLOBAL_DATA_LIST = [];
        // part_3点击完毕就可以记录全局cookie的List了
        if (getCookie("ALL_GLOBAL_DATA_LIST") == null) {
            ALL_GLOBAL_DATA_LIST.push(obj);
            setCookie("ALL_GLOBAL_DATA_LIST", JSON.stringify(ALL_GLOBAL_DATA_LIST), 1);
        } else {
            ALL_GLOBAL_DATA_LIST = JSON.parse(getCookie("ALL_GLOBAL_DATA_LIST"));
            ALL_GLOBAL_DATA_LIST.push(obj);
            setCookie("ALL_GLOBAL_DATA_LIST", JSON.stringify(ALL_GLOBAL_DATA_LIST), 1);
        }
        console.log("全局数据动态记录" + getCookie("ALL_GLOBAL_DATA_LIST"));
        if (parseInt(getCookie("myindex")) < JSON.parse(getCookie("mycompany")).length - 1) {
            let temp = parseInt(getCookie("myindex"));
            temp = temp + 1;
            setCookie("myindex", temp + "", 1);
        } else {
            let list = JSON.parse(getCookie("ALL_GLOBAL_DATA_LIST"));
            list.forEach(item => {
                item.situation = item.situation.map(s => s.replace(/\n/g, ' '));
                item.situation = item.situation.map(s => s.replace(/\s+/g, ''));
                item.person = item.person.map(p => p.replace(/\n/g, ' '));
                item.person = item.person.map(p => p.replace(/\s+/g, ''));
            });
            let finalJson = []
            list.forEach(item => {
                let exportSituation = "";
                let tempArray = item.situation;
                for (let i = 0; i < tempArray.length; i++) {
                    exportSituation = exportSituation + tempArray[i] + "&&&&&&&&&&";
                }
                let exportEnd = "";
                tempArray = item.end;
                for (let i = 0; i < tempArray.length; i++) {
                    exportEnd = exportEnd + tempArray[i] + "&&&&&&&&&&";
                }
                let exportInstall = "";
                tempArray = item.install;
                for (let i = 0; i < tempArray.length; i++) {
                    exportInstall = exportInstall + tempArray[i] + "&&&&&&&&&&";
                }
                let exportPerson = "";
                tempArray = item.person;
                for (let i = 0; i < tempArray.length; i++) {
                    exportPerson = exportPerson + tempArray[i] + "&&&&&&&&&&";
                }
                tempJson = {
                    "name": item.name,
                    "exportSituation": exportSituation,
                    "exportEnd": exportEnd,
                    "exportInstall": exportInstall,
                    "exportPerson": exportPerson
                }
                finalJson.push(tempJson)
            });
            // console.log(JSON.stringify(finalJson))
            part_4(finalJson)
            return false; // 可以执行导出了
        }
        clearAllMark();
        setTimeout(function () {
            window.open("https://sjfw.scjs.net.cn:8801/xxgx/Enterprise/eList.aspx", "_self")
        }, 1000)
    }, 5000)

    function extractLetters(str) {
        return str.replace(/[^a-zA-Z]/g, '');
    }
}

function part_4(my_export_data) { // 触发导出
    finalClear();// 清除所有的cookie
    //要导出的json数据
    const jsonData = my_export_data;
    //列标题,逗号隔开,每一个逗号就是隔开一个单元格
    let str = `公司名称,资质情况,资质到期时间,安许到期时间,三类人员\n`;
    //增加\t为了不让表格显示科学计数法或者其他格式
    for (let i = 0; i < jsonData.length; i++) {
        for (let item in jsonData[i]) {
            str += `${jsonData[i][item] + '\t'},`;
        }
        str += '\n';
    }
    //encodeURIComponent解决中文乱码
    let uri = 'data:text/csv;charset=utf-8,\ufeff' + encodeURIComponent(str);
    //通过创建a标签实现
    let link = document.createElement("a");
    link.href = uri;
    //对下载的文件命名
    link.download = "本次数据导出的明细.csv";
    document.body.appendChild(link);
    link.click();
    document.body.removeChild(link);
}

// 清除cookie
function clearCookie(cookieName) {
    document.cookie = cookieName + "=; expires=" + new Date(0).toUTCString() + "; path=/";
}

function clearAllMark() {
    clearCookie("hasRun3");
    clearCookie("part_1_click");
    clearCookie("part_2_click");
    clearCookie("part_3_click");
    clearCookie("clickTime");
    console.log("清除所有标记cookie成功")
}

function finalClear() {
    clearCookie("hasRun3");
    clearCookie("part_1_click");
    clearCookie("part_2_click");
    clearCookie("part_3_click");
    clearCookie("clickTime");
    console.log("最后清除cookie成功")
    clearCookie("ALL_GLOBAL_DATA_LIST");
    clearCookie("mycompany");
    clearCookie("myindex");
}

五、最后利用JS拿到所有我们需要的数据后,我们就可以保存到Excel或者CSV中了。这样我们就顺利的实现了利用JS实现数字员工,模拟人的操作来获取网页数据,大大降低人工操作的成本了。下面这下数据都是全流程的自动化查询、自动化填充、自动化保存为Excel的。是不是非常赞!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2074349.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一款人性化的终端用户界面工具

A collection of human friendly terminal user interface. 截图 历史文件预览 注意: find file 依赖 fzf. file browser依赖 ranger / lf / … 安装 git clone https://github.com/StubbornVegeta/StartUp ~/.config/ cd ~/.config/StartUp ./install.sh用法 . $HOME/.…

【binder】【android12】【2.servicemanager启动——全源码分析】

系列文章目录 可跳转到下面链接查看下表所有内容https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501文章浏览阅读2次。系列文章大全https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501 目录 …

浅谈【数据结构】树与二叉树二

目录 1、二叉排序树 1.1二叉树排序树插入 1.1.1两种插入方法 1.1.2循环法 1.1.3递归法 1.2二叉树的打印 1.3二叉树的结点删除 1.4销毁二叉树 1.5层次打印 谢谢帅气美丽且优秀的你看完我的文章还要点赞、收藏加关注 没错&#xff0c;说的就是你&#xff0c;不用再怀疑&…

前端实现 http请求中 表单请求体和json请求体的互相转换,外加转为 冒号换行格式,用于ApiFox批量导入

在线体验&#xff1a;https://ikaros-521.github.io/dev_tool/http/param_json_converter.html 直接上源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Query String to JSON Converter</titl…

慢SQL定位及优化

1.如何定位慢查询 方案1&#xff1a;开源工具 调式工具&#xff1a;Arthas 运维工具&#xff1a;Prometheus、Skywalking 方案2&#xff1a;MySQL自带慢日志 慢查询日志记录了所有执行时间超过指定参数&#xff08;long_query_time&#xff0c;单位&#xff1a;秒&#xff0c…

QT error: undefined reference to `vtable for Net‘

报错 C:\Users\Administrator\Desktop\VideoHill\GikISearch\net.cpp:4: error: undefined reference to vtable for Net 以下是两个可能错误原因 1&#xff0c;未定义Q_OBJECT 宏 在头文件中加上 加上#include <QObject>&#xff0c; 改写继承QObject 和定义宏 …

【HarmonyOS】鸿蒙应用蓝牙功能实现 (三)

【HarmonyOS】鸿蒙应用蓝牙功能实现 &#xff08;三&#xff09; 前言 今天整理蓝牙Demo代码&#xff0c;查看官网时发现自己帐号没有登录&#xff0c;竟然也可以访问最新的API文档&#xff0c;真是喜大奔普。看来华为已经开始对外开放最新的API文档&#xff0c;不再有白名单…

Leetcode每日刷题之面试题01.06字符串压缩(C++)

1.题目解析 本题的目的是遍历一个字符串&#xff0c;将重复的字符串以该字符出现次数进行压缩&#xff0c;最终返回压缩后的字符串即可 题目来源&#xff1a;面试题01.06.字符串压缩 2.算法原理 我们从左往右遍历字符串&#xff0c;用 ch 记录当前要压缩的字符&#xff0c;cnt …

交叉编译Qt5.12.8附带编译opengl

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、重要说明二、准备环境1.下载qt5.12.8源代码2.配置系统环境3.安装必要工具4.解压qt5源代码5.开始配置编译6.配置qtcreator 三、编译opengl总结 前言 最近有…

zdppy+vue3+onlyoffice文档管理系统实战 20240825上课笔记 zdppy_cache框架增加resize清理缓存的方法

遗留问题 设置缓存&#xff0c;已完成获取缓存&#xff0c;已实现删除缓存&#xff0c;已实现查询所有key&#xff0c;带查询参数&#xff1a;active只查激活的&#xff0c;value包含value默认只获取key查询缓存大小清空缓存判断是否为管理员 实现删除缓存的接口 async def …

[C语言]一、C语言基础

G:\Cpp\C语言精讲 1. C语言入门 1.1 初识计算机语言 计算机编程语言&#xff0c;就是人与计算机交流的方式。人们可以使用编程语言对计算机下达命令&#xff0c;让计算机完成人们需要的功能。 计算机语言有很多种。如&#xff1a;C 、C、Java、Go、JavaScript、Python&#x…

音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息

通过FFprobe命令可以显示WAV音频文件每个packet&#xff08;也称为数据包或多媒体包&#xff09;的信息&#xff1a; ffprobe -of json -show_packets XXX.wav 输出如下&#xff1a; 其中&#xff1a; 1.codec_type&#xff1a;packet类型&#xff0c;表示该路流是视频还是音…

【CSS】使用 CSS 自定义属性(变量)-- var()

自定义属性&#xff08;有时候也被称作CSS 变量或者级联变量&#xff09;是由 CSS 作者定义的&#xff0c;它包含的值可以在整个文档中重复使用。由自定义属性标记设定值&#xff08;比如&#xff1a; --main-color: black;&#xff09;&#xff0c;由 var() 函数来获取值&…

一台电脑配置两个Git账号(github和gitlab),不同仓库使用不同的git

我们工作时一般都是使用gitlab&#xff0c;工作电脑也一般配置的 git 是连接 gitlab 的&#xff0c;那么当我们如果想用同一个电脑实现不同仓库根据自己的需要到底是推送代码到github还是 gitlab&#xff0c;以及使用哪个账号&#xff0c;(比如如果想用工作电脑维护自己的 gith…

C语言学习,Turbo C 开发环境回顾

&#xff08;1&#xff09;Turbo C 集成开发环境&#xff1a; &#xff08;2&#xff09;按AltF&#xff0c;进入File菜单&#xff1a; &#xff08;3&#xff09;按AltR&#xff0c;进入Run菜单&#xff1a; &#xff08;4&#xff09;按AltC&#xff0c;进入Compile菜单&…

Java 入门指南:Java 泛型(generics)

Java 泛型概要 Java 泛型&#xff08;generics&#xff09; 是 JDK 5 中引入的一个新特性。泛型的本质是参数化类型&#xff0c;也就是所操作的数据类型被指定为一个参数&#xff08;可以称之为类型形参&#xff0c;然后在使用/调用时传入具体的类型。&#xff09; 使用 Java …

【机器学习】特征工程的基本概念以及LASSO回归和主成分分析优化方法

引言 特征工程是机器学习中的一个关键步骤&#xff0c;它涉及到从原始数据中提取和构造新的特征&#xff0c;以提高模型的性能和预测能力LASSO&#xff08;Least Absolute Shrinkage and Selection Operator&#xff09;回归是一种用于回归分析的线性模型&#xff0c;它通过引入…

字节跳动-生活服务-java后端-一面

基础题 计算机网络 1.tcp三次握手和四次挥手&#xff1f;tcp的第三次握手可以传输应用层数据嘛&#xff1f; 4.1 TCP 三次握手与四次挥手面试题 | 小林coding (xiaolincoding.com) 2.描述一下打开百度首页后发生的网络过程&#xff1f; 计算机网络面试题 | 小林coding (xi…

linux-基础知识1

简单命令 init 0 关机 int 6 重启 pwd 查看当前所在目录&#xff0c; cd切换目录 ls 列出目录下的内容 clear 清屏 date 查看时间 路径 linux表示硬件设备的文件在dev目录 /tmp是临时目录&#xff0c;可以创建目录和文件&#xff0c;但不能保证安全 df查看文件系统…

数据仓库系列 1:什么是数据仓库,它与传统数据库有什么不同?

想象一下,你正站在一座巨大的仓库前。这座仓库不是用来存放普通商品的,而是存储着海量的数据 - 这就是数据仓库。在大数据时代,数据仓库已经成为企业数据管理的核心。但它究竟是什么?又为什么如此重要?让我们一起揭开数据仓库的神秘面纱,探索它与我们熟知的传统数据库有何不同…