使用Airtest自动化某云音乐爬取歌曲名称

简介

本文将介绍如何使用Airtest自动化工具来模拟用户操作,从某云音乐中爬取与特定关键词相关的歌曲名称。我们将以搜索“文字”相关的歌曲为例,并将结果保存到本地文件。

准备工作

  • 安装Airtest并配置好Android设备或模拟器。
  • 确保你的设备上已安装某云音乐应用。

步骤详解

1. 导入必要的库

首先,我们需要导入Airtest核心API以及处理JSON数据的库。同时设置脚本作者信息。

# -*- encoding=utf8 -*-
__author__ = "20220"from airtest.core.api import *
import jsonauto_setup(__file__)

2. 启动某云音乐应用

通过start_app函数启动某云音乐应用。

# 启动某云音乐应用
start_app("com.####.music")

3. 初始化Poco驱动

初始化用于UI自动化的Poco驱动,这里指定为Android UI自动化模式。

from poco.drivers.android.uiautomation import AndroidUiautomationPocopoco = AndroidUiautomationPoco(use_airtest_input=True, screenshot_each_action=False)

4. 执行搜索操作

执行一系列触控和输入操作以完成搜索功能。这包括点击搜索框、输入搜索词(此处为“文字”)、点击搜索按钮等。

# 点击搜索框
sleep(1.0)
touch(Template(r"tpl1729174879203.png", record_pos=(-0.305, -0.946), resolution=(1080, 2340)))# 输入搜索关键词“文字”
sleep(1.0)
text("文字", search=False)# 点击搜索按钮
touch(Template(r"tpl1722922645319.png", record_pos=(0.416, -0.941), resolution=(1080, 2340)))# 点击相关搜索结果
sleep(1.0)
touch(Template(r"tpl1729175412189.png", record_pos=(-0.07, 0.049), resolution=(1080, 2340)))

5. 获取并打印当前UI树

为了调试目的,可以打印出当前界面的UI元素结构。

ui_tree = poco.dump()
print(ui_tree)

6. 初始化变量

设置一些变量来跟踪已经抓取的歌曲数量以及迭代次数。

# 初始化变量
titles = []
current_count, last_count = 0, 0
i = 0

7. 循环抓取歌曲名称

使用一个无限循环来持续滚动页面并抓取新的歌曲名称,直到没有新数据加载为止。每次循环中,我们都会检查是否找到了新的歌曲,并且在找到新内容时更新列表。

第一次迭代:获取初始列表中的歌曲
while True:# 记录上一次迭代时的歌曲数量last_count = len(titles)if i == 0:  # 第一次迭代时获取第一个列表的歌曲for title in poco("android.widget.LinearLayout").offspring("com.netease.cloudmusic:id/musicContainer").child("android.widget.FrameLayout").child("android.view.ViewGroup").child("android.view.ViewGroup").child("android.view.ViewGroup").child("android.view.ViewGroup").child("android.view.ViewGroup")[2].child("android.view.ViewGroup")[1].child("android.view.ViewGroup").offspring("android.widget.FrameLayout").child("android.view.ViewGroup").child("android.view.ViewGroup")[1].child("android.view.ViewGroup"):a = title.child("android.view.ViewGroup").child("android.view.ViewGroup").child("android.view.ViewGroup")[1].child("android.view.ViewGroup").child("android.view.ViewGroup").child("android.widget.TextView")[0]name = a.get_text()if name not in titles:titles.append(name)print(name)  # 可选:打印歌曲名称
后续迭代:获取更多列表中的歌曲
    else:  # 其他迭代时获取其他列表的歌曲sleep(1.0)titles_container = poco("android.widget.LinearLayout").offspring("com.netease.cloudmusic:id/musicContainer").child("android.widget.FrameLayout").child("android.view.ViewGroup").child("android.view.ViewGroup").child("android.view.ViewGroup").child("android.view.ViewGroup").child("android.view.ViewGroup")[2].child("android.view.ViewGroup")[1].child("android.view.ViewGroup").offspring("android.widget.FrameLayout")[1].child("android.view.ViewGroup").child("android.view.ViewGroup").child("android.view.ViewGroup")for title in titles_container:a = title.child("android.view.ViewGroup").child("android.view.ViewGroup").child("android.view.ViewGroup")[1].child("android.view.ViewGroup").child("android.view.ViewGroup").child("android.widget.TextView")[0]name = a.get_text()if name not in titles:titles.append(name)print(name)  # 可选:打印歌曲名称
更新计数器与滑动操作
    # 更新当前歌曲数量current_count = len(titles)# 模拟向上滑动以加载更多内容poco.swipe([0.5, 0.7], [0.5, 0.1], duration=2)sleep(1.0)i += 1# 如果没有新数据加载,退出循环if current_count == last_count:print(f"总共爬取 {last_count} 首歌曲的名称")break

8. 将结果保存到文件

最后一步是将收集到的所有歌曲名称写入本地文本文件。

# 定义文件路径
file_path = r"E:\Python\安卓端自动化\day 01\song_titles.txt"# 将歌曲名称写入文件
with open(file_path, "w", encoding="utf-8") as file:for title in titles:file.write(title + "\n")print(f"歌曲名称已保存至 {file_path}")

在这里插入图片描述

在这里插入图片描述

结论

通过上述步骤,我们成功实现了对某云音乐应用内特定关键词相关歌曲的自动化爬取。这种方法可以应用于类似的场景,帮助你快速获取所需信息而不必手动执行重复的操作。在使用Airtest或其他类似工具进行自动化测试或数据抓取时,始终要遵循合法合规的原则。
这包括但不限于:
尊重网站规则:确保你的行为符合目标网站的服务条款(Terms of Service, ToS)。
遵守法律法规:了解并遵守你所在地区关于网络数据获取的相关法律规定。
道德考量:避免任何可能侵犯他人隐私权、版权的行为。
免责声明:
本文档所提供的信息仅供教育和个人学习参考之用。
作者不对因按照本指南所采取行动导致的任何直接或间接损失承担责任。
在尝试文中提到的技术之前,请自行确认其合法性,并保证您的活动不违反当地法律及被访问网站的具体规定。
使用自动化工具时请保持良好职业道德,切勿滥用技术损害他人权益。

使用Airtest自动化某易云音乐爬取歌曲名称

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

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

相关文章

【独家:AI编程助手Cursor如何revolutionize Java设计模式学习】

【独家:AI编程助手Cursor如何revolutionize Java设计模式学习】 导语 在Java高级编程的世界里,设计模式是每个开发者必须掌握的利器。但是,如何快速理解并灵活运用这些模式呢?让我们一起探索如何借助AI编程助手Cursor,轻松掌握设计模式,提升Java编程技能! 正文 设计模式:J…

QUIC(Quick UDP Internet Connections)与 RTMP(Real Time Messaging Protocol)

QUIC(Quick UDP Internet Connections)和 RTMP(Real Time Messaging Protocol)是两种不同的网络传输协议,它们在一些方面有不同的特点和应用场景。 QUIC 协议 特点 基于 UDP:QUIC 建立在 UDP 之上&#xff…

探索 Jupyter 核心:nbformat 库的神秘力量

文章目录 探索 Jupyter 核心:nbformat 库的神秘力量1. 背景介绍:为何选择 nbformat?2. nbformat 是什么?3. 如何安装 nbformat?4. 简单的库函数使用方法4.1 读取 Notebook 文件4.2 修改 Notebook 中的单元格4.3 添加 M…

灵当CRM index.php 任意文件上传漏洞复现

0x01 产品描述: 灵当CRM是一款专为中小企业量身定制的智能客户关系管理工具,由上海灵当信息科技有限公司开发和运营。该系统广泛应用于多个行业,包括金融、教育、医疗、IT服务及房地产等领域,旨在满足企业对客户个性化管理的需求&…

【2024版】sql-liabs靶场前十关解题过程和思路----适合入门小白

在你们看到这个靶场之前,你们可以先去听一下课,然后再来做这个靶场你们的感悟就会比较深,当你听过课再来做就不会觉得这么懵了,重庆橙子科技-sql注入,我之前学习是听的他的课,我觉得是全网讲的最好的一个师…

vue2使用pdfjs-dist实现pdf预览(iframe形式,不修改pdfjs原来的ui和控件,dom层可以用display去掉一部分组件)

前情提要 在一开始要使用pdf预览的时候,第一次选的是vue-pdf,但是vue-pdf支持的功能太少,缺少了项目中需要的一项-复制粘贴功能 之后我一顿搜搜搜,最终貌似只有pdfjs能用 但是网上支持text-layer的貌似都是用的2.09那个版本。 使…

MySQL同步到ES的方案选型

文章目录 1. 同步双写优点缺点实现方式 2. 异步双写优点缺点实现方式 3. 另起应用 SQL 查询写入优点缺点实现方式 4. Binlog 实时同步优点缺点实现方式 5. 应用场景 本文参考: https://www.bilibili.com/video/BV13hvZeaErr/?vd_sourceb7e4d17fd13ffa91c4da6d37c08a6c7c 最近在…

【题解】—— LeetCode一周小结42

🌟欢迎来到 我的博客 —— 探索技术的无限可能! 🌟博客的简介(文章目录) 【题解】—— 每日一道题目栏 上接:【题解】—— LeetCode一周小结41 14.鸡蛋掉落 题目链接:887. 鸡蛋掉落 给你 k 枚…

c++迷宫游戏

1、问题描述 程序开始运行时显示一个迷宫地图,迷宫中央有一只老鼠,迷宫的右下方有一个粮仓。游戏的任务是使用键盘上的方向健操纵老鼠在规定的时间内走到粮仓处。 基本要求: 老鼠形象可以辨认,可用键盘操纵老鼠上下左右移动;迷宫的墙足够结…

Springboot指定扫描路径

方式一:通过在启动类的SpringbootApplication中指定包扫描或类扫描 指定需要扫描的包 scanBasePackages{"待扫描包1","待扫描包2", . . . ," "} 指定需要扫描的类 scanBasePackageClasses{类1.class,类2.class,...} 方式二&#xff…

C语言函数实现:深入理解strcpy

文章目录 一、strcpy函数的基本用法二、strcpy函数的实现原理三、strcpy函数的应用场景四、strcpy函数的安全性问题五、结论 C语言函数实现:深入理解strcpy 在C语言编程中,字符串处理是一项基础且重要的任务。 strcpy函数作为C标准库中的一个基本函数&a…

CDC变更数据捕捉技术是什么?和ETL有什么不同?

一、什么是CDC技术? 变更数据捕获(Change Data Capture,简称 CDC)是一种用于识别和跟踪数据源中发生变化的数据的技术。 工作原理: 1.监测数据源:CDC 工具会持续监测指定的数据源,如数据库表、文件系统…

【C++复习】经典笔试题

文章目录 八大排序快排过程 卡特兰数反转链表链表的回文结构左叶子之和另一棵树的子树归并排序类与对象编程训练杨辉三角字符串乘积二叉树前序遍历成字符串数组的交集二叉树的非递归前序遍历连续子数组的最大乘积 八大排序 插冒归稳定 快排过程 以 [3,4,6,1,2,4,7] 为例&#…

MySQL 聚合函数

1. AVG函数求平均值 以 teacher 表为例,先查所有 teacher 信息: SELECT * FROM teacher;查询结果如下图: 可以使用 AVG() 函数求出全部教师平均年龄: SELECT AVG(age) FROM teacher;执行结果如下图: Tips&#…

Javascript 脚本查找B站限时免费番剧

目录 前言 脚本编写 脚本 前言 B站的一些番剧时不时会“限时免费”,白嫖党最爱,主打一个又占到便宜的快乐。但是在番剧索引里却没有搜索选项可以直接检索“限时免费”的番剧,只能自己一页一页的翻去查看,非常麻烦。 自己找限…

如何修改MAC地址破解网络无线网络限制-担心别人蹭网,路由器设置MAC地址过滤,限定了能访问无线网络的网卡地址-供大家学习参考

路由器都设置了MAC地址过滤,也就是限定了能访问无线网络的网卡的MAC地址。因为无线路由器不一定由自己控制,所以当更换了笔记本或者更换了无线网卡的时候,也许就上不了网了。我们可以修改网卡的MAC地址实现上网。 下载:https://do…

各种查询sql介绍

1. 关联查询(JOIN) 关联查询用于从多个表中检索数据。它基于两个或多个表之间的共同字段(通常是主键和外键)来组合数据。 内连接(INNER JOIN): sql SELECT a.name, b.order_date FROM custome…

计算机网络——CDN

空间编码例子:不是发送N个相同颜色值,而是仅发送2个值,颜色和重复个数 时间编码例子:不是发送i1帧的全部编码,而是仅发送帧i差别的地方 视频播放时,先下载manifest file文件——>解析(不…

机器学习与神经网络:科技的星辰大海

前提 近日,2024年诺贝尔物理学奖颁发给了机器学习与神经网络领域的研究者,这是历史上首次出现这样的情况。这项奖项原本只授予对自然现象和物质的物理学研究作出重大贡献的科学家,如今却将全球范围内对机器学习和神经网络的研究和开发作为了一…

Faster R-CNN模型微调检测航拍图像中的小物体

1. 项目简介 本项目的目标是基于Faster R-CNN模型对航拍图像中的小物体进行检测和识别。航拍图像通常具有视角广、分辨率高、小目标密集且物体尺寸较小的特点,因此检测难度较大。传统的目标检测模型在处理小物体时,容易受到物体尺寸、分辨率及背景复杂度…