Python自动化启动+影刀RPA工具实现抓取各大平台粉丝数

前言

最近公司有个需求是抓取公司员工在各大平台的粉丝数。本文将介绍通过RPA工具如何实现这一需求,以及如何通过python自动化每日执行该服务

每日一想

  • rpa影刀工具如何使用?如何搭建各个平台的流程并且能够根据对应账号连接拉起对应的抓取流程?
  • 怎么获取要抓取的账号数据?怎么把抓到的数据成功的放到数据库中?
  • python自动化启动怎么实现?
  • 后续优化?

那么,带着这几个问题,我们一起往下走,一探究竟~~

rpa工具

具体介绍不多做赘述,可以看下这篇文章

搭建某音的流程

抖音的抓取流程是通过一个开源的python工具来实现的,大家可以自己拉下来看一下,里面集成了各种获取数据的模式,webAPI,终端等,也可以抓取任何数据

搭建某书的流程

某书是ssr渲染的,这里处理起来比较麻烦,需要借助eval函数'

某站和某手的搭建流程类似,这里就不做过多赘述啦~~

主流程

影刀中可以通过指令来发送钉钉群通知,这样可以方便我们及时了解数据抓取情况

获取账号数据以及数据落库

相信大家在看到上面的主流程时,可以看到有一条mysql的查询命令,没错,就是通过影刀中该指令创建数据库连接,然后执行查询命令,获取到想要的数据。

这样做的好处是,不需要线下去拆表,还有更新表,如果账号数据有更新的话,直接更新数据库即可。

数据落库,是通过本地启动一个node服务,通过webAPI模式来调用,把需要的参数传进来,在通过执行mysql命令插入到数据库中,下面是部分代码

js 复制代码
export async function uploadMarketing(params) {
    const { type } = params;
    // type === 1 个人账号 2 官方账号
    try {
        if(type == 1) {
            const { likeCnt, fansCnt, accountId, platform, staffCode } = params;
            const statDate = datetime.format(new Date(), 'YYYY-MM-DD');
            const outside = 'personal_account_stat'; // 指定操作哪张表
            const sqlStr = `INSERT INTO ${outside} (like_cnt, fans_cnt, account_id, platform, staff_code, stat_date) VALUES (?, ?, ?, ?, ?, ?)`
            db.query(sqlStr, [likeCnt, fansCnt, accountId, platform, staffCode, statDate], (err, result) => {
                if(err) return;
                if(result.affectedRows === 1) {
                    sendMarkdownMessage({ title: `个人账号-${platform}数据插入成功`, text: `账号ID-${accountId} 工号-${staffCode}` });
                }
            })
        } else {
            const { likeCnt, fansCnt, accountId, platform, accountName } = params;
            const statDate = datetime.format(new Date(), 'YYYY-MM-DD');
            const outside = 'offical_account_stat' // 指定操作哪张表
            const sqlStr = `INSERT INTO ${outside} (like_cnt, fans_cnt, account_id, platform, account_name, stat_date) VALUES (?, ?, ?, ?, ?, ?)`
            db.query(sqlStr, [likeCnt, fansCnt, accountId, platform, accountName, statDate], (err, result) => {
                if(err) return;
                if(result.affectedRows === 1) {
                    sendMarkdownMessage({ title: `官方账号-${platform}数据插入成功`, text: `账号名称-${accountName}` });
                }
            })
        }
    } catch (error) {
        sendMarkdownMessage({ title: '上传失败', text: `账号ID-${accountId}上传失败` });
    }
    
}

python 自动化启动

所谓的自动化启动,我理解的就是加一个定时任务,通过定时任务,触发某个文件的更新,然后使用影刀的触发器来监听文件的更新,从而达到自动化启动的功能。下面是具体实现。

  • 获取影刀进程

    python 复制代码
    def wait_for_process(process_name, timeout=None):
        start_time = time.time()
        while True:
            for process in psutil.process_iter(['pid', 'name']):
                try:
                    process_info = process.info
                    if process_info['name'] == process_name:
                        return process_info['pid']
                except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
                    pass
    
            if timeout is not None and time.time() - start_time > timeout:
                return None
    
            time.sleep(1)

    通过python的 psutil库来获取系统进程,(该库可以获取系统的硬盘,网络,进程等信息)

  • 启动node服务

    js 复制代码
    def open_sql_server():
        project_path = r""
        if os.name == 'nt': # windows系统 New Technology
            project_path = project_path.replace('/', '\\')
            subprocess.run('start cmd /k "cd /d {} && npm run dev"'.format(project_path), shell=True)

    通过python的subprocess库来启动服务,注意要加shell=true,表示通过shell命令来启动

  • 写入文件

    js 复制代码
    file_path = r""
    
    def append_time_to_file(file_path):
    try:
        open_sql_server()
        time.sleep(5) # 等待五秒,确保服务能够启动
        current_time = time.strftime("%Y-%m-%d %H:%M:%S")
        new_content = f"触发时间:{current_time}"
        with open(file_path, "a", encoding='utf-8') as file:
            file.write("\n" + new_content)
        print("内容已追加,当前时间为:", current_time)
    except Exception as e:
        print("追加内容时出现错误:", e)

    需要在指定位置新建文件,当服务成功启动时,会在该文件中新增一条信息,方便查看日志

  • 定时任务

    js 复制代码
    def my_task():  
      print("任务运行中...")  
      if os.path.exists(file_path):  
          append_time_to_file(file_path)  
      else:  
          print("文件不存在:", file_path)  
    
      my_task(); 
    
      schedule.every().day.at("04:00").do(my_task)  # 每天四点启动
      
      def run_scheduler():  
          while True:  
              schedule.run_pending()  
              time.sleep(1)  
     
      run_scheduler()

    通过python的schedule库来实现定时任务,并可以指定时间点启动

  • 影刀监听文件更新

应用选择自己需要执行的应用,注意需要把应用发版。

监控文件填在上面新建的文件路径即可,监控事件选更新。

后续优化

  1. 目前python中,无法关闭终端进程,这样会造成一直重复打开终端,尝试多种方法无果...
  2. 目前自动化启动是在本地电脑中,这样如果电脑关机,该定时任务无法启动,所以后续会考虑放到服务器上。
  3. IP被限制问题有待优化,如果抓取数量太大,会有封号的风险。
相关推荐
IT_Octopus7 小时前
【零基础入门 LLM 开发 · Day 13】:LangChain 的对话记忆——Message 对象版
人工智能·python·langchain
Jmyd01237 小时前
Web端3D营销展厅技术实现路径:从素材上云到线索回流的数据链路
前端·3d·性能优化·三维数字化
砚凝霜7 小时前
【软考信息安全】第二十二章 Web服务器安全分析与增强——Apache与IIS
服务器·前端·安全
2603_965148117 小时前
社区与学习资源:从入门到精通的API选品学习路径
数据库·人工智能·python·学习·数据挖掘
濮水大叔8 小时前
NestJS Dynamic Providers 与 Cabloy/Vona Provider Scene:同接口多实现的两种装配哲学
typescript·node.js·nestjs
CCblandy9 小时前
令牌桶在 0.9 倍负载超发 19%、固定窗口边界放行 20 个:四种限流算法同构实测
后端·python·算法·性能优化·架构
u0111026759 小时前
JPG、PNG、WebP 怎么选?按透明度、体积和使用场景做判断
前端·javascript·vue.js·图像处理·ai作画
Cc.Y9 小时前
Java零基础入门:深入Java核心:文件IO与序列化全解
java·开发语言·python
拿本唠嗑AI研究9 小时前
本体工程实战指南:从建模到可维护的完整落地路径
java·人工智能·python·jena·ontology
jerrywus10 小时前
让 AI 写完代码后交一份报告:我改造了 answer-me-with-html
前端·claude·cursor