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

简介

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

准备工作

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

步骤详解

1. 导入必要的库

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

# -*- encoding=utf8 -*-
__author__ = "20220"

from airtest.core.api import *
import json

auto_setup(__file__)

2. 启动某云音乐应用

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

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

3. 初始化Poco驱动

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

from poco.drivers.android.uiautomation import AndroidUiautomationPoco

poco = 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自动化某易云音乐爬取歌曲名称

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C0027.在Clion中解决CPU和内存过高的问题

解决办法 最新版的 clion 在 advance setting里,可以勾选 Use the Resharper C language engine (CLion Nova)。 有显著的性能提升。

深入探索JavaCV:功能强大的Java计算机视觉库

🧑 博主简介:历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程,…

积木报表静态资源不生效,界面乱码 解决方法

目录 前言1. 问题所示2. 原理分析3. 解决方法前言 从实战中分析问题,解决问题,以下笔记学习为主 关于JimuReport的网站:文档中心 1. 问题所示 引入积木报表之后,界面静态文件不生效,最终截图如下: 大致浏览器终端报错如下: 基本信息如下: Uncaught SyntaxError: U…

项目管理的坎坷之路与 MBTI 的启示录

项目管理这一路走来,经历了无数的坎坷、不顺和阻碍。幸运的是,遇见 MBTI 之后,我仿佛看到了新的希望,终于我也看到了花团锦簇,也看到了灯彩佳话。那一夜,我也曾梦见百万雄兵。 什么是 MBTI ? M…

AI大模型学习路线路径,巨详细!

大模型技术已经成为推动人工智能发展的关键力量。无论你是初学者还是有经验的开发者,想要掌握大模型应用,都需要遵循一定的学习路线。 从核心技术解析到模型微调与私有化部署,逐步深入大模型应用的世界。 这份学习路线图详细的介绍了那年每…

gitee建立/取消关联仓库

目录 一、常用指令总结 二、建立关联具体操作 三、取消关联具体操作 一、常用指令总结 首先要选中要关联的文件,右击,选择Git Bash Here。 git remote -v //查看自己的文件有几个关联的仓库git init //初始化文件夹为git可远程建立链接的文件夹…

【CSS3】css开篇基础(3)

1.❤️❤️前言~🥳🎉🎉🎉 Hello, Hello~ 亲爱的朋友们👋👋,这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章,请别吝啬你的点赞❤️❤️和收藏📖📖。如果你对我的…

经营异常移除申请操作流程

经营异常是怎么回事?是什么意思?企业工商异常通常由以下几个原因造成1.未及时填报年度报告(补报年报后解除,目前新规最高罚款一万)2.公司地址是挂靠或者搬迁地址未及时变更,被列入地址异常名录。&#xff0…

MFC工控项目实例二十六创建数据库

承接专栏《MFC工控项目实例二十五多媒体定时计时器》 用选取的型号为文件名建立文件夹,再在下面用测试的当天的时间创建文件夹,在这个文件中用测试的时/分/秒为数据库名创建Adcess数据库。 1、在StdAfx.h文件最下面添加代码 #import "C:/Program F…

flutter TabBar自定义指示器(带文字的指示器、上弦弧形指示器、条形背景指示器、渐变色的指示器)

带文字的TabBar指示器 1.绘制自定义TabBar的绿色带白色文字的指示器 2.将底部灰色文字与TabrBar层叠,并调整高度位置与胶囊指示器重叠 自定义的带文字的TabBar指示器 import package:atui/jade/utils/JadeColors.dart; import package:flutter/material.dart; im…

LeetCode102. 二叉树的层序遍历(2024秋季每日一题 43)

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]] 示例 2: 输入…

React 项目热更新失效问题的解决方案和产生的原因

背景和意义 在修复React项目热更新失效的问题时,经过一系列问题排查和依赖升级,最终成功修复了问题并为后续开发规避了类似的问题。 依赖升级 Vite版本升级 原React项目Vite版本升级到^4.4.5 Vite 4 在构建和开发服务器的性能上进行了优化&#xff…

气膜高尔夫:不惧天气,挥杆无忧—轻空间

高尔夫是一项户外运动,但恶劣天气常常成为阻碍。然而,在气膜高尔夫球馆中,无论外面下雨或酷暑,内部环境始终保持宜人,提供理想的打球体验。气膜技术为球员打造了一个全天候的运动空间,彻底摆脱了天气的束缚…

【中危】Oracle TNS Listener SID 可以被猜测

一、漏洞详情 Oracle 打补丁后,复测出一处中危漏洞:Oracle TNS Listener SID 可以被猜测。 可以通过暴力猜测的方法探测出Oracle TNS Listener SID,探测出的SID可以用于进一步探测Oracle 数据库的口令。 建议解决办法: 1. 不应该使…

大数据治理:数据时代的挑战与应对

目录 大数据治理:数据时代的挑战与应对 一、大数据治理的概念与内涵 二、大数据治理的重要性 1. 提高数据质量与可用性 2. 确保数据安全与合规 3. 支持数据驱动的决策 4. 提高业务效率与竞争力 三、大数据治理的实施策略 1. 建立健全的数据治理框架 2. 数…

【Linux系统编程】冯诺依曼体系结构与操作系统

目录 1、冯诺依曼体系结构 1.1 冯诺依曼体系结构的组成 1.2 程序运行时必须要加载到内存 1.3 数据通信 1.4 为什么要有内存 2、操作系统 2.1 概念 2.2 设计OS的目的 2.3 如何理解管理 2.4 系统调用和库函数的概念 1、冯诺依曼体系结构 我们常见的计算机,如…

5g工业路由器最新案例:高原气象站网络升级项目

背景: 某省气象局决定在高原地区升级其气象观测网络,以提高天气预报的准确性和及时性,同时为气候变化研究提供更可靠的数据支持。该项目面临以下挑战: 需要在高原广袤且地形复杂的区域部署大量自动气象站,要求网络覆…

JAVA八股

快速失败(fail-fast) 设计的目的是为了避免在遍历时对集合进行并发修改,从而引发潜在的不可预料的错误。 通过迭代器遍历集合时修改集合: 如果你使用Iterator遍历集合,然后直接使用集合的修改方法(如add(…

C++20中头文件span的使用

<span>是C20中新增加的头文件&#xff0c;此头文件是containers库的一部分。包括&#xff1a; 1.模板类std::span&#xff1a;连续对象序列的非拥有视图(view)。std::span可以具有static extent&#xff0c;在这种情况下&#xff0c;序列中的元素数量在编译时已知并以typ…

FPGA实现PCIE采集电脑端视频转SFP光口UDP输出,基于XDMA+GTX架构,提供4套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的PCIE方案1G/2.5G Ethernet Subsystem实现物理层方案1G/2.5G Ethernet PCS/PMA or SGMII Tri Mode Ethernet MAC实现物理层方案 3、PCIE基础知识扫描4、工程详细设计方案工程设计原理框图电脑端视频PCIE视频采集QT上位机X…