RPA(影刀)抓取数据,并通过服务上传系统

3,530 阅读4分钟

前言

最近产品有一个从平台上抓取店铺数据的需求,刚开始一头雾水,完全不知道如何下手,查阅资料后,最后使用RPA来实现并结合node把抓到的数据上传到系统中。

RPA介绍

官方是这么说的:杭州分叉智能科技有限公司旗下一款自动化软件机器人品牌。模拟人工的各种操作,帮企业工自动处理大量重复、有逻辑规则的工作,让员工拥有更多的时间去处理更有创意和价值的事情。

官网地址:www.yingdao.com/

话不多说直接上码

RPA基本介绍

94cc21245b6da479f27a694ba219ec8.png 首先点击新建,可以新建一个PC或手机端的自动化应用,新建完成后,进去会看到如下页面

image.png 图片左侧是RPA提供给用户的一些可视化的指令,可以通过拖拽的方式,搭建你想要实现的自动化功能

这里给大家简单介绍几种常用的可视化指令

1.监听网页请求,可以配置网络请求资源URL,RPA可以实现自动匹配该URL,并抓到响应内容,可能在大部分的网页中,很多是需要点击才触发请求的,这个时候需要先监听,再去点击元素,才能够抓到响应内容

image.png 2.获取网页元素,获取元素信息,点击web元素。可以操作并获取到网页元素信息,这里建议大家通过元素的XPATH来获取,因为有的元素属性或者是样式可能会改变。点击web元素是点击获取到的元素信息,来自动触发某个操作

image.png 3.EXCEL表格指令操作。可能某个需求中,产品会给你一个表格,来让你输入表格里面的内容,来达到自动化抓取数据的效果。此时可以RPA也是可以满足的,可以使用EXCEL表格指令操作,在操作中,我们可以使用循环里面的内容,来实现自动化输入,还可以写入内容至表格中,方便我们记录。

image.png 4. 循环,判断指令。这两个指令可以用来操作我们监听网页请求后,获取过来的数据,循环该数据,并加入一些逻辑判断把不符合规范的数据过滤掉,IF条件有很多条件指令,多条件,单一条件,是否网页包含某个元素等等,方便我们更快速的实现自动化应用

image.png

image.png 5.全局变量的使用。RPA中允许我们定义全局变量,即在我们的整个应用都可以访问到,比如我们在某个指令中,保存了某个属性到变量中,但是在下面的指令中会用到该变量,这个时候变量是访问不到的,那么我们可以自己新建一个全局变量,可以指定该变量的类型,注意如果是表达式的话,需要店里输入框左侧的图标,点亮后,输入的内容是表达式,否则是文本

image.png 以上是一些常用的可视化指令,PRA中可以很多好用的可视化指令,有兴趣的同学可以下载,搭建一款属于自己的自动化应用

nodejs上传到系统中的部分代码

1.校验登录

async function login(params) {
  try {
    const config = getConfig();
    const data = await accountLogin();
    if (data) {
      config.token = data.jwtToken;
      config.userId = data.userId;
      fs.writeFileSync(
        path.join(process.cwd(), "./config/config.json"),
        JSON.stringify(config)
      );
      return true;
    }
    return false;
  } catch (error) {
    console.error(error);
    return false;
  }
}
export async function checkLogin() {
  const config = getConfig();
  if (!config.phone || !config.password) {
    console.error("未配置登录信息");
    return false;
  }
  try {
    const data = await listOperContentByCondition({
      page: 1,
      pageSize: 1,
      contentTitle,
    });
  } catch (error) {
    console.log("%c [ checkLogin error ]-38", error);
    return await login();
  }
}
  1. 读取excel并上传
async function uploadImage(image_url) {
  try {
    const response = await axios.get(image_url, { responseType: "stream" });
    let imgname = `rap_gd/${Date.now()}.png`;
    const { url, name } = await IMGCLIENT.upload(imgname, response.data)
    return {
      url: url,
      name: name,
    };
  } catch (error) {
    console.log(
      "%c [ image_url ]-16",
      "font-size:13px; background:pink; color:#bf2c9f;",
      image_url
    );
    console.log(
      "%c [ error ]-30",
      "font-size:13px; background:pink; color:#bf2c9f;",
      error
    );
    return null;
  }
}

async function uploadOperContent(dirpath) {
  let tpath = path.join(dirpath);
  const listitempath = path.join(tpath, "listitem.json");
  try {
    const listItem = fs.readFileSync(listitempath, "utf-8");
    const listItemo = JSON.parse(listItem);
    const CoverUrl = listItemo.domain_list[5].value;
    const image = await uploadImage(CoverUrl);
    const loginState = await checkLogin();
    if (!loginState) throw new Error("请先登录");
    const cityList = await getCitylist()
    let cityId = null
    if (cityList.length) {
      cityList.forEach(item => {
        item.children.forEach(i => {
          if (i.title == listItemo.cityname) {
            cityId = i.key
          }
        })
      })
    }
    const brandList = await getBrandList({
      page: 1,
      pageSize: 1000000,
      brandName: '',
      brandIds: []
    });
    let result = []
    const resExcelBrand = await readExcel(本地excel地址)
    if (resExcelBrand && resExcelBrand.length) {
      resExcelBrand.forEach(item => {
        if (listItemo.name.includes(item)) {
          result = brandList.filter(k => k.brandName === item);
        }
      })
    }
    const listCategoryList = await getCategorylist({ brandIds: [result[0].brandId] }); 
    const categorysResult = getTreeIds(listCategoryList);
    const params = {
      
      // ...
    }
    const res = await addShopManagement(params);
    console.log(
      "%c [ res ]-89",
      "font-size:13px; background:pink; color:#bf2c9f;",
      res
    );
    return {
      contentTitle: listItemo.name,
    };
  } catch (error) {
    console.log(
      "%c [ error ]-35",
      "font-size:13px; background:pink; color:#bf2c9f;",
      error
    );
    return null;
  }
}

3.koa路由

import Router from "@koa/router";
import gaode from "./api/gaode"

const router = new Router();
router.use("/api_gaode", gaode)


export default router;

结语

在PRA中我们可以设置可视化的指令,来发送一个get请求,请求我们的服务,最后通过服务,调取服务端接口,最终上传到系统中。

RPA可以帮助我们搭建一款自动化应用,节省企业成本,防止做重复的工作,我们成就工具,工具也成就我们!

记录一下自己学习的过程,欢迎各位大佬批评指正!