autoxjs 安卓爬虫自动化

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',转换为数值后乘以10000return 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.mzph.cn/news/610671.shtml

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

相关文章

基于Springboot+vue高校宿舍管理系统(前后端分离)

该项目完全免费 高校宿舍管理系统采用前后端分离的架构方式&#xff0c;是为学校宿舍管理打造的一套系统,可以让管理者更为便捷地处理学生公寓问题,从而大大提高管理效率,让学生公寓的资源合理分配,事半功倍,进而改善了学生公寓管理。 系统分为三种角色&#xff0c;分别是系统…

小巧且兼具高性能的小模型 TinyLlama 等

TinyLlama-1.1B 小模型在边缘设备上有着广泛的应用&#xff0c;如智能手机、物联网设备和嵌入式系统&#xff0c;这些边缘设备通常具有有限的计算能力和存储空间&#xff0c;它们无法有效地运行大型语言模型。因此&#xff0c;深入探究小型模型显得尤为重要。 来自新加坡科技…

[ 机器学习 ] 关于Jupyter Notebook中pytorch模块import失败的问题

0x01、问题描述 在使用WSL搭建Jupyter进行代码测试的时候 发现Miniconda&#xff08;虚拟环境均适用&#xff09;中安装的pytorch在Jupyter里面import失败 但在python解释器的命令模式里可以测试import成功 并且torch.cuda_available()打印True 以前用的是IDEA没怎么用Jup…

Navicat迁移局域网内其他PC机的MySQL数据库

迁移局域网内其他PC机的MySQL数据库到本机 查看局域网IP 设置可远程连接的账号 开放本机防火墙的3306端口 连接PC机的MySQL 利用Navicat迁移数据库 刚换了个电脑&#xff0c;旧电脑的MySQL数据库太多了&#xff0c;转成.sql文件&#xff0c;再传输到新电脑上运行&#xff…

CSS3新增边框样式

边框样式 概念:在CSS3中&#xff0c;针对元素边框增加了丰富的修饰属性。 常见的边框样式属性有以下 属性说明border-radius圆角效果box-shadow边框阴影border-image边框背景 border-radius属性 概念&#xff1a;border-radius属性可以为元素添加圆角效果 语法&#xff1…

盘点五大设备巡检系统!内附巡检注意事项及巡检要点

在繁忙的工业生产现场&#xff0c;设备高效运行是保证生产顺利开展的关键。为了确保设备的稳定性和生产的安全性&#xff0c;设备巡检工作变得尤为重要。 举个通俗易懂的例子—— 你开了一家钢铁制造厂&#xff0c;工厂拥有多条自动化生产线&#xff0c;每天24小时不间断地运…

运用tomcat在浏览器中对数据库信息进行查询

在idea中创建好项目后&#xff0c;添加web项目 然后打开idea的setting&#xff0c;跳转到下面的页面&#xff0c;下载maven插件。 出现下面的选项&#xff0c;才正确。 添加好web项目后&#xff0c;打开pom文件&#xff0c;添加相应的依赖&#xff1a; <?xml version"…

golang中的循环依赖

作为 Golang 开发人员&#xff0c;您可能遇到过导入周期。Golang 不允许导入循环。如果 Go 检测到代码中的导入循环&#xff0c;则会抛出编译时错误。在这篇文章中&#xff0c;让我们了解导入周期是如何发生的以及如何处理它们。 导入周期 假设我们有两个包&#xff0c;p1并且…

【mysql】—— 用户管理

目录 &#xff08;一&#xff09;为什么要有用户管理&#xff1f; &#xff08;二&#xff09;用户 2.1 查看用户信息 2.2 创建用户 2.3 删除用户 2.4 修改用户密码 &#xff08;三&#xff09;数据库的权限 3.1 给用户授权 3.2 回收权限 &#xff08;一&#xff09;为…

互联网加竞赛 基于大数据的社交平台数据爬虫舆情分析可视化系统

文章目录 0 前言1 课题背景2 实现效果**实现功能****可视化统计****web模块界面展示**3 LDA模型 4 情感分析方法**预处理**特征提取特征选择分类器选择实验 5 部分核心代码6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于大数据…

大型语言模型与知识图谱的完美结合:从LLMs到RAG,探索知识图谱构建的全新篇章

最近,使用大型语言模型(LLMs)和知识图谱(KG)开发 RAG(Retrieval Augmented Generation)流程引起了很大的关注。在这篇文章中,我将使用 LlamaIndex 和 NebulaGraph 来构建一个关于费城费利斯队(Philadelphia Phillies)的 RAG 流程。 我们用的是开源的 NebulaGraph 来…

3. SPSS数据文件的基本加工和处理

如何获取SPSS自带的案例数据文件&#xff1f; 首先找到SPSS的安装目录&#xff0c;然后找到Samples文件夹 可以看到有不同语言版本&#xff0c;选择简体中文 就能看到很多.sav文件 数据文件的整理 个案排序 单值排序 例&#xff1a;对于下面的数据集&#xff0c;将工资按…

查看Linux系统内存、CPU、磁盘使用率和详细信息

一、查看内存占用 1、free # free -m 以MB为单位显示内存使用情况 [rootlocalhost ~]# free -mtotal used free shared buff/cache available Mem: 11852 1250 8668 410 1934 9873 Swap: 601…

kafka: 基础概念回顾(生产者客户端和机架感知相关内容)

一、kafka生产者客户端 在kafka体系结构中有如下几个重要的概念&#xff1a; Producer&#xff1a;生产者&#xff0c;负责生产消息并投递到kafka broker的某个的分区中Consumer&#xff1a;消费者&#xff0c;负责消费kafka若干个分区中的消息Broker&#xff1a;kafka服务节…

@DependsOn:解析 Spring 中的依赖关系之艺术

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 DependsOn&#xff1a;解析 Spring 中的依赖关系之艺术 前言简介基础用法高级用法在 XML 配置中使用 DependsOn通过 Java Config 配置实现依赖管理 生命周期与初始化顺序Bean 生命周期的关键阶段&…

红帽宣布CentOS 7和RHEL 7将在2024年6月30日结束支持,企业面临紧迫的迁移压力!

2020 年红帽 (RedHat&#xff0c;已在 2019 年被 IBM 收购) 单方面宣布终止 CentOS Linux 的开发&#xff0c;此后 CentOS Linux 8 系列的更新已经在 2021 年 12 月结束&#xff0c;而 CentOS Linux 7 系列的更新将在 2024 年 6 月 30 日结束。 与 CentOS Linux 7 一起发布的 R…

网络的设置

一、网络设置 1.1查看linux基础的网络设置 网关 route -n ip地址ifconfigDNS服务器cat /etc/resolv.conf主机名hostname路由 route -n 网络连接状态ss 或者 netstat域名解析nslookup host 例题&#xff1a;除了ping&#xff0c;什么命令可以测试DNS服务器来解…

LeetCode 94. 二叉树的中序遍历

94. 二叉树的中序遍历 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2] 示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[] 示例 3&#xff1a; 输入&…

企业级进销存管理系统

框架&#xff1a; 进销存管理系统&#xff0c;采用SpringBootShiroMyBatisEasyUI 项目采用Maven构建&#xff0c;数据库文件存放在 sql/jxc.sql 截图 运行项目部分截图&#xff0c; 登录界面&#xff0c;用户名admin&#xff0c;密码admin123 当前库存查询&#xff0c; 进…

搭建Eureka服务注册中心

一、前言 我们在别的章节中已经详细讲解过eureka注册中心的作用&#xff0c;本节会简单讲解eureka作用&#xff0c;侧重注册中心的搭建。 Eureka作为服务注册中心可以进行服务注册和服务发现&#xff0c;注册在上面的服务可以到Eureka上进行服务实例的拉取&#xff0c;主要作用…