autoxjs 安卓爬虫自动化

news2024/11/14 15:07:51

autoxjs 安卓爬虫自动化

我这里只是测试请勿用于违法的
我这里是小红书


文章目录

  • autoxjs 安卓爬虫自动化
  • 前言
  • 一、自动刷直播间并且抓取商品已经粉丝数量等?
  • 总结


前言

欢迎来到AutoXJS的世界,这是一个充满创新、挑战和技术探索的领域。在这个引领未来的时刻,我们怀揣着对技术的热情,探索着自动化领域的无尽可能性。

AutoXJS旨在推动JavaScript自动化的前沿,探索先进的工具、框架和最佳实践,使开发者能够更高效、更智能地构建出色的应用程序。这不仅仅是一个技术社区,更是一个激发创意、分享知识的聚集地。

我们致力于连接那些对JavaScript和自动化充满热情的人,无论是初学者还是经验丰富的开发者。在AutoXJS,你将发现深入的技术讨论、实用的开发指南以及引领未来的前瞻性思考。


提示:以下是本篇文章正文内容,下面案例可供参考

一、自动刷直播间并且抓取商品已经粉丝数量等?

在这里插入图片描述
抓到的数据
下面是执行的视频的效果:
视频链接
代码:

var xiaohong_backpack_name = "com.xingin.xhs";
app.launch(xiaohong_backpack_name);
sleep(100)
clickByUiSelector('text', "首页");
var width = device.width; // 获取设备的宽度
var height = device.height; // 获取设备的高度
var duration = 500; // 滑动动作持续的时间
// 从屏幕的1/4高度位置滑动到3/4高度位置,模拟下拉动作
swipe(width / 2, height / 4, width / 2, height * 3 / 4, duration);
sleep(2000)
clickByUiSelector('desc', "直播");
sleep(200)
clickNearElement('desc', "直播", -100, 100);
sleep(1000)


var resultArray = []; // 存储最终结果
var usernameSet = new Set(); // 存储用户名,用于去重
var currentDownSwipeCount = 0; // 当前下滑次数
function scrollAndFetch() {
    // 循环7次下滑
    for (var down = 0; down < 7; down++) {
        if (currentPackage() !== xiaohong_backpack_name) {
            console.log("已离开小红书应用,暂停滑动操作。");
            return; // 退出函数
        }
        currentDownSwipeCount = down; 
        var titleElements = id("com.xingin.xhs:id/dl6").find();
        var viewerElements = id("com.xingin.xhs:id/dho").find();
        var usernameElements = id("com.xingin.xhs:id/djk").find();
        var clickAttempts = {};
        for (var i = 0; i < titleElements.length; i++) {
            var viewerCount = parseViewerCount(viewerElements[i].text());
            var titleText = titleElements[i].text();
            if (viewerCount > 2000 && !usernameSet.has(usernameElements[i].text())) {// 观看人数大于4000且用户名未存储过 
                clickAttempts[titleText] = (clickAttempts[titleText] || 0) + 1; // 增加点击次数    
                console.log("大于2000");           
               
                if (clickAttempts[titleText] <= 3) { // 限制最多点击3次
                    sleep(1000)
                    clickNearElement('text', titleText, 0,-480);
                    sleep(1000)
                    if (checkIfLivePage()) {
                        live_streaming_entry(usernameElements[i].text(),titleElements[i].text(),viewerElements[i].text(),usernameElements[i].text())
                        usernameSet.add(usernameElements[i].text());
                    }else {
                        return;
                    }
                }else {
                    console.log("点击尝试超过3次,跳过标题:" + titleText);
                    continue;
                }
               
                
            }
        }
        if (currentDownSwipeCount === down && currentPackage() === xiaohong_backpack_name && !id("com.xingin.xhs:id/s2").findOne(3000)) {
            swipe(width / 2, height * 3 / 4, width / 2, height / 4, 500);
            sleep(1000); // 等待内容加载
        }
       
    }

    // 循环7次上滑回到顶部
    for (var up = 0; up < 7; up++) {
        if (currentPackage() !== xiaohong_backpack_name && id("com.xingin.xhs:id/s2").findOne(5000)) {
            console.log("已离开小红书应用,暂停滑动操作。");
            return; // 退出函数
        }
        swipe(width / 2, height / 4, width / 2, height * 3 / 4, 500);
        sleep(2000); // 等待页面滑动和加载
    }

    // 模拟下拉刷新
    if (currentPackage() === xiaohong_backpack_name && !id("com.xingin.xhs:id/s2").findOne(2000)) {
        swipe(width / 2, height / 4, width / 2, height * 3 / 4, 500);
        sleep(1000);
    } else {
        console.log("已离开小红书应用,未执行刷新操作。");
    }
}



function saveDataToJsonFile(data) {
    // 设置文件路径和名字
    var path = "/storage/emulated/0/脚本/get_danmu/test/data.json"; 
    // 将对象转换为字符串
    var dataString = JSON.stringify(data, null, 4);
    // 写入文件
    files.write(path, dataString);

    console.log("数据已保存到文件: " + path);
}

while (true) { // 持续循环执行
    if (currentPackage() === xiaohong_backpack_name) {
        console.log("当前包名称",currentPackage())
        scrollAndFetch(); // 调用滑动和数据捕获函数
        saveDataToJsonFile(resultArray); // 保存数据到文件
        console.log(JSON.stringify(resultArray, null, 4)); // 打印当前结果
        currentDownSwipeCount = 0; 
    } else {
        console.log("不在小红书应用内,脚本暂停运行。");
        for (let i = 0; i < 30; i++) { // 等待总时长为5分钟(每次暂停10秒,检查30次)
            sleep(10000); // 暂停10秒
            if (currentPackage() === xiaohong_backpack_name) {
                console.log("重新进入小红书应用,继续执行脚本。");
                break; // 如果重新进入小红书应用,则跳出等待循环
            }
        }
    }
}





function parseViewerCount(viewerString) {
    if (viewerString.includes('W') || viewerString.includes('w')) {
        // 去除'W',转换为数值后乘以10000
        return parseFloat(viewerString.replace(/W|w/g, '')) * 10000;
    } else {
        // 直接转换为数值
        return parseInt(viewerString.replace(/\D/g, ''));
    }
}



// 点击直播进入
function live_streaming_entry(usernameElements,title, viewers, username){
   var _l = id("com.xingin.xhs:id/s2").findOne();
   _l && _l.click() || console.log("没有找到指定ID的元素");
    sleep(1000)
    clickByUiSelector('text', usernameElements,2000);
    sleep(1000)
    if (checkTextExists("举报", 3000)) {  // 假设点击成功后会出现"举报"文本
        console.log("未成功点击,重试...");
        var _ll = id("com.xingin.xhs:id/esk").findOne(2000);
        _ll && _ll.click() || console.log("没有找到指定ID的元素");
        sleep(1000);
    }
    clickByUiSelector('text', "取消");
    sleep(1000)
    var fansElement = id("com.xingin.xhs:id/bkb").findOne(3000);
    var likesElement = id("com.xingin.xhs:id/dfp").findOne(3000);
    
    var fans = fansElement ? fansElement.text() : "没有抓到";
    var likes = likesElement ? likesElement.text() : "没有抓到";
    sleep(800)

    if(fans != "没有抓到" || likes != "没有抓到") {
         // 计算起始点和结束点的坐标
    var startX = width * 3 / 4;  // 从屏幕宽度的3/4处开始滑动
    var endX = width / 10;       // 到屏幕宽度的1/4处结束滑动
    // var y = height * 2 / 3;
    var y = height * 3 / 4; 
    // 执行滑动动作
    swipe(startX, y, endX, y, duration);

    sleep(800)
    clickByUiSelector('text', "销量");
    sleep(1000)

        var productNameElement = id("com.xingin.xhs:id/gh5").findOne(2000)
        var priceElement  = id("com.xingin.xhs:id/hp1").findOne(2000)
        var salesVolumeElement = id("com.xingin.xhs:id/a1j").findOne(2000)

        var productName = productNameElement ? productNameElement.text() : "没有抓到";
        var price = priceElement ? priceElement.text() : "没有抓到";
        var salesVolume = salesVolumeElement ? salesVolumeElement.text() : "没有抓到";
       
        resultArray.push({
            标题: title,
            观看人数: viewers,
            用户名: username,
            粉丝: fans,
            收藏: likes,
            商品名称: productName,
            价格: price,
            销量: salesVolume
        });
        
        console.log("标题", title);
        console.log("观看人数", viewers);
        console.log("用户名", username);
        console.log("商品名称", productName);
        console.log("价格", price);
        console.log("销量", salesVolume);
        console.log("粉丝", fans);
        console.log("收藏", likes);
        
    }
    back();
    sleep(1000);
    back();
    sleep(1000);
   
}



function checkTextExists(textToCheck, timeout) {
    return text(textToCheck).findOne(timeout) != null;
}

function clickByUiSelector(selectorType, valueToClick, timeout){
    // 设置默认超时时间为1000毫秒
    timeout = timeout || 1000; 
    var uiObject;

    // 根据selectorType选择查找方式
    if(selectorType === 'text'){
        console.log("点击文本:" + valueToClick);
        uiObject = text(valueToClick).findOne(timeout);
    } else if(selectorType === 'desc'){
        uiObject = desc(valueToClick).findOne(timeout);
    } else {
        console.log("未知的选择器类型:" + selectorType);
        return false;
    }

    // 进行点击操作
    if(uiObject != null){
        uiObject.click();
        return true; // 点击成功
    } else {
        console.log("没有找到:" + valueToClick);
        return false; // 没有点击,因为没有找到对象
    }
}


function checkIfLivePage() {
    // 根据页面特定元素来判断是否为直播页面
    var livePageIndicator = id("com.xingin.xhs:id/s2").findOne(2000);
    return livePageIndicator !== null;
}


function clickNearElement(selectorType, valueToFind, offsetX, offsetY){
    var uiObject;

    // 根据selectorType选择查找方式
    if(selectorType === 'text'){
        uiObject = text(valueToFind).findOne();
    } else if(selectorType === 'desc'){
        uiObject = desc(valueToFind).findOne();
    } else {
        console.log("未知的选择器类型:" + selectorType);
        return false;
    }

    // 检查是否找到UI对象
    if (uiObject != null) {
        // 计算新的点击位置
        var x = uiObject.bounds().centerX() + offsetX;
        var y = uiObject.bounds().centerY() + offsetY;

        // 执行点击操作
        click(x, y);
        return true;
    } else {
        console.log("没有找到指定的文本或描述:" + valueToFind);
        return false;
    }
}

总结

我这里写了一个测试,更多业务请自行

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

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

相关文章

【huggingface】【pytorch-image-models】timm框架中使用albumentations库数据增广

文章目录 一、前言二、实操2.1 声明库2.2 定义你的数据增广算子2.3 加入其中 一、前言 问题是这样的&#xff0c;在使用timm框架训练时&#xff0c;发现数据增广不够&#xff0c;想用Albumentations库的数据增广&#xff0c;怎么把后者嵌入到前者的训练中。 其实也是比较简单…

CHS_02.1.4+操作系统体系结构 二

CHS_02.1.4操作系统体系结构 二 操作系统的结构 上篇文章我们只介绍过宏内核 也就是大内核以及微内核分层结构的操作系统模块化是一种很经典的程序设计思想宏内核和微内核外核 操作系统的结构 上篇文章我们只介绍过宏内核 也就是大内核以及微内核 今年大纲又增加了分层结构 模块…

unity编辑器Scene界面输出位置及路径

工程Asset下新建Editor文件夹&#xff1b; Editor文件夹下新建脚本LogPosition using System.Collections; using System.Collections.Generic; using UnityEditor; using UnityEngine; public class LogPosition : EditorWindow {//最终输出的数据.static string logtext;//增…

GCF:在线市场异质治疗效果估计的广义因果森林

英文题目&#xff1a;GCF: Generalized Causal Forest for Heterogeneous Treatment Effects Estimation in Online Marketplace 中文题目&#xff1a;GCF&#xff1a;在线市场异质治疗效果估计的广义因果森林 单位&#xff1a;滴滴&美团 时间&#xff1a;2022 论文链接…

[java]JAVA中文版API手册 -jdk_api_1.8

有mac和win版本 链接&#xff1a;https://pan.baidu.com/s/14WGXJYBICeSxgg6OxBVGRQ 提取码&#xff1a;c03p

MCU、MPU、SOC简介

文章目录 前言一、MCU二、MPU三、SOC总结 前言 随着处理器技术的不断发展&#xff0c;CPU(Central Processing Unit)的发展逐渐出现三种分支&#xff0c;分别是MCU(Micro Controller Unit&#xff0c;微控制器单元) 和MPU&#xff08;Micro Processor Unit&#xff0c;微处理器…

软考高级系统架构设计师考试经验分享

文章目录 1. 软考介绍&#xff08;1&#xff09;什么是软考&#xff08;2&#xff09;软考的作用&#xff08;3&#xff09;软考各科目的难度&#xff08;4&#xff09;考试时间&#xff08;5&#xff09;考试形式 2.系统架构设计师备考经验&#xff08;1&#xff09;辅导资料&…

数据结构与算法(十)深度优先搜索与广度优先搜索

广度优先搜索 广度优先搜索&#xff1a;从一个顶点出发&#xff08;由开始时顶点创造顺序优先决定&#xff09;&#xff0c;访问所有没有被访问过的临节点。然后在从被访问过的节点出发&#xff0c;重复之前的操作 如下为一个图 从1出发&#xff0c;先后访问2 3&#xff0c;之后…

String的(toCharArray\split)方法*

题目 class Solution {public int firstUniqChar(String s) {int[] sum new int[26];char[] num s.toCharArray();for(int i0;i<num.length;i) {sum[num[i]-a];}for(int j0;j<num.length;j) {if(sum[num[j]-a] 1) {return j;}}return -1; } }题目 …

我的1827创作纪念日

机缘 习惯性早上打开电脑&#xff0c;看看CSDN上的资讯&#xff0c;了解行业动态、当前新的技术和大佬的分享。自己动手写应该是2019 年 01 月 08 日&#xff0c;当时应该是在用安装和使用Oracle&#xff0c;遇到一些问题&#xff0c;写下第一篇博客 Oracle存储过程常见问题及…

【RK3399 PCIE调试——硬件信息资源获取】

一、1、 硬件接口 二、2、 PCB原理图 三、 官网地址&#xff1a; https://t.rock-chips.com/portal.php 相关资料和固件烧写可参考资料下载菜单

欧拉图及其应用

什么是欧拉图 提到欧拉图就要谈到哥尼斯堡七桥问题&#xff0c;最初有这样的一个问题的&#xff1a;18世纪中叶&#xff0c;东普鲁士哥尼斯堡城有一条贯穿全城的普雷格尔河&#xff0c;河中有两个岛&#xff0c;通过七座桥彼此相连&#xff0c;如下图所示 问题是这样的&…

(非常全面的干货)Python接口自动化测试框架实战开发

一丶叙述 1.项目介绍 整个项目分为四个部分&#xff1a;接口基础丶接口开发丶Unittest与接口测试结合以及接口自动化框架从设计到开发 接口基础包括&#xff1a;HTTP接口 / 常见接口 / 接口工具 / 接口基础知识 接口开发&#xff1a;通过Django来开发get/post接口 Unittes…

“器官短缺”将被打破 基因编辑猪成为人类的“二师兄”

器官移植被称为生命之灯。但是&#xff0c;受制于传统观念及对人体器官捐献意义的不了解&#xff0c;人体器官捐献的数量&#xff0c;还远远达不到需求。目前&#xff0c;全国有近30万的患者在等待器官移植&#xff0c;但每年只有近一万的患者能真正得到器官移植&#xff0c;缺…

银联扫码第三方支付接口申请:开启便捷支付新时代

随着移动支付的普及&#xff0c;越来越多的商家开始接受微信、支付宝等第三方支付平台的付款方式。然而&#xff0c;作为国内最大的银行卡组织&#xff0c;银联也在不断拓展其业务范围&#xff0c;推出了自己的扫码支付接口。本文将为您详细介绍银联扫码第三方支付接口的申请流…

【Azure 架构师学习笔记】- Azure Databricks (5) - Unity Catalog 简介

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 接上文 【Azure 架构师学习笔记】- Azure Databricks (4) - 使用Azure Key Vault 管理ADB Secret 前言 DataBricks Unity Catalog&#xff08;UC&#xff09;是一个统一的对数据资产治理的解决方案…

【算法Hot100系列】有效的数独

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

GPS 模拟器

GPS 工具包&#xff1a;https://www.ni.com/es/support/downloads/software-products/download.gnss-test-toolkit.html#333303 GPS-SDR-SIM&#xff1a;https://github.com/osqzss/gps-sdr-sim GPS LabVIEW &#xff1a;http://mikioblog.dolphinsystem.jp/2017/08/gps-sdr-si…

FastApi-快速入门1

FastAPI 是一个用于构建 API 的现代、快速&#xff08;高性能&#xff09;的 web 框架&#xff0c;使用 Python 3.8 并基于标准的 Python 类型提示。 关键特性: 快速&#xff1a;可与 NodeJS 和 Go 并肩的极高性能&#xff08;归功于 Starlette 和 Pydantic&#xff09;。最快…

Exception sending a multicast message:Network is unreachable故障

出现这个故障就是没有连接到网络&#xff0c;如果虚拟机没有连接到本机&#xff0c;那么就会出现这个情况&#xff0c;当虚拟机连接到本机就会自动消失&#xff0c;同时如果是用电脑直接安装Ubuntu运行也会出现这个情况&#xff0c;应该是要连接到一个路由器里面这个情况才会消…