利用appium自动控制移动设备并提取数据

安装appium-python-client模块并启动已安装好的环境

安装appium-python-client模块

在window的虚拟环境下执行pip install appium-python-client

启动夜神模拟器,进入夜神模拟器所在的安装路径的bin目录下,进入cmd终端,使用adb命令建立adb server和模拟器的连接
  1. adb devices
C:\Program Files (x86)\Nox\bin>adb devices
List of devices attached
* daemon not running; starting now at tcp:5037
* daemon started successfully
  1. nox_adb.exe connect 127.0.0.1:62001
C:\Program Files (x86)\Nox\bin>nox_adb.exe connect 127.0.0.1:62001
already connected to 127.0.0.1:62001
  1. adb devices
C:\Program Files (x86)\Nox\bin>adb devices
List of devices attached
127.0.0.1:62001 device
启动appium-desktop,点击start server启动appium服务
[Appium] Welcome to Appium v1.10.0
[Appium] Appium REST http interface listener started on 0.0.0.0:4723
利用上一小节所学习的内容获取Desired Capabilities参数
  1. 获取模拟设备的型号
    • 打开设置——关于平板电脑
    • 查看型号,获取模拟设备的型号
  2. 获取app包名称 以及 app进程名
    • 打开模拟器中的抖音短视频app
    • 在adb连接正确的情况下,在夜神模拟器安装目录的bin目录下的cmd中输入adb shell
    • 进入adb shell后输入 dumpsys activity | grep mFocusedActivity
    • ``com.ss.android.ugc.aweme`就是app包名
    • .main.MainActivity就是进程名 注意前边有个点.

初始化以及获取移动设备分辨率

完成代码如下,并运行代码查看效果:如果模拟器中抖音app被启动,并打印出模拟设备的分辨率则成功

from appium import webdriver# 初始化配置,设置Desired Capabilities参数
desired_caps = {'platformName': 'Android','deviceName': 'SM-G955F','appPackage': 'com.ss.android.ugc.aweme','appActivity': '.main.MainActivity'
}
# 指定Appium Server
server = 'http://localhost:4723/wd/hub'
# 新建一个driver
driver = webdriver.Remote(server, desired_caps)
# 获取模拟器/手机的分辨率(px)
width = driver.get_window_size()['width']
height = driver.get_window_size()['height']
print(width, height)
  • 移动设备分辨率

    • driver.get_window_size()[‘width’]

    • driver.get_window_size()[‘height’]

定位元素以及提取文本的方法

点击appium desktop右上角的放大镜图标

如图填写配置,并点击start session

在这里插入图片描述

定位界面的使用方法如下图所示

在这里插入图片描述

点击短视频的作者名字,查看并获取该元素的id

在这里插入图片描述

在python使用代码通过元素id获取该元素的文本内容

实例化appium driver对象后添加如下代码,运行并查看效果

# 获取视频的各种信息:使用appium desktop定位元素
print(driver.find_element_by_id('bc').text)  # 发布者名字
print(driver.find_element_by_id('al9').text)  # 点赞数
print(driver.find_element_by_id('al_').text)  # 留言数
print(driver.find_element_by_id('a23').text)  # 视频名字,可能不存在,报错
  • 定位元素及获取其文本内容的方法

    • driver.find_element_by_id(元素的id).text
    • driver.find_element_by_xpath(定位元素的xpath规则).text

控制抖音app滑动

appium滑动的函数

从(start_x, start_y)滑动到(end_x, end_y)

  • driver.swipe(start_x, start_y, end_x, end_y)
控制抖音app滑动的代码实现
start_x = width // 2  # 滑动的起始点的x坐标,屏幕宽度中心点
start_y = height // 3 * 2  # 滑动的起始点的y坐标,屏幕高度从上开始到下三分之二处
distance = height // 2  # y轴滑动距离:屏幕高度一半的距离
end_x = start_x # 滑动的终点的x坐标
end_y = start_y-distance # 滑动的终点的y坐标
# 滑动
driver.swipe(start_x, start_y, end_x, end_y)

整理并完成自动滑动的代码

import time
from appium import webdriverclass DouyinAction():"""自动滑动,并获取抖音短视频发布者的id"""def __init__(self, nums:int=None):# 初始化配置,设置Desired Capabilities参数self.desired_caps = {'platformName': 'Android','deviceName': 'SM-G955F','appPackage': 'com.ss.android.ugc.aweme','appActivity': '.main.MainActivity'}# 指定Appium Serverself.server = 'http://localhost:4723/wd/hub'# 新建一个driverself.driver = webdriver.Remote(self.server, self.desired_caps)# 获取模拟器/手机的分辨率(px)width = self.driver.get_window_size()['width']height = self.driver.get_window_size()['height']print(width, height)# 设置滑动初始坐标和滑动距离self.start_x = width//2 # 屏幕宽度中心点self.start_y = height//3*2 # 屏幕高度从上开始到下三分之二处self.distance = height//2 # 滑动距离:屏幕高度一半的距离# 设置滑动次数self.nums = numsdef comments(self):# app开启之后点击一次屏幕,确保页面的展示time.sleep(2)self.driver.tap([(500, 1200)], 500)def scroll(self):# 无限滑动i = 0while True:# 模拟滑动print('滑动ing...')self.driver.swipe(self.start_x, self.start_y,self.start_x, self.start_y-self.distance)time.sleep(1)self.get_infos() # 获取视频发布者的名字# 设置延时等待time.sleep(4)# 判断是否退出if self.nums is not None and self.nums == i:breaki += 1def get_infos(self):# 获取视频的各种信息:使用appium desktop定位元素print(self.driver.find_element_by_id('bc').text) # 发布者名字print(self.driver.find_element_by_id('al9').text) # 点赞数print(self.driver.find_element_by_id('al_').text) # 留言数print(self.driver.find_element_by_id('a23').text) # 视频名字,可能不存在,报错# # 点击【分享】坐标位置 671,1058# self.driver.tap([(671, 1058)])# time.sleep(2)# # 向左滑动露出 【复制链接】 580,1100 --> 200, 1100# self.driver.swipe(580,1100, 20, 200, 1100)# # self.driver.get_screenshot_as_file('./a.png') # 截图# # 点击【复制链接】 距离右边60 距离底边170 720-60,1280-170# self.driver.tap([(660, 1110)])# # self.driver.get_screenshot_as_file('./b.png')  # 截图def main(self):self.comments() # 点击一次屏幕,确保页面的展示time.sleep(2)self.scroll() # 滑动if __name__ == '__main__':action = DouyinAction(nums=5)action.main()

至此,可以参考爬虫5.0课程项目库,使用fiddler等抓包工具,利用appium+mitmproxy+wget等python模块自动获取抖音视频文件

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

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

相关文章

Kubernetes (十五) 认证与授权

一. 访问控制 二.UserAccount与serviceaccount区别 将认证信息添加…

关闭Windows自动更新的6种方法

关闭Windows自动更新的6种方法! 方法一:通过Windows设置关闭Windows自动更新 步骤1. 按WinI打开Windows设置页面。步骤2. 单击“更新和安全”>“Windows更新”,然后在右侧详情页中选择“暂停更新7天”选项即可在此后7天内关闭Windows更新…

【Linux】相关背景及环境搭建

前言: 认识 Linux, 了解 Linux 的相关背景,学会如何使用云服务器,掌握使用远程终端工具 xshell 登陆 Linux 服务器 文章目录 一、Linux介绍1.1 关于UNIX1.2 Linux的诞生及发展历程1.3 Linux开源1.4 Linux在各个行业的现状1.5 发行版本 二、Li…

LeetCode 热题 100 | 双指针(上)

目录 1 283. 移动零 2 11. 盛最多水的容器 3 15. 三数之和 菜鸟做题第一周,语言是 C 1 283. 移动零 解题思路: 两个指针一前一后遍历数组前者永远指向 0,后者永远在寻找非 0 数的路上后者找到一个非 0 数就和前者进行一个数值交换 …

x-cmd pkg | jieba - 中文结巴分词工具

目录 简介首次用户功能特点竞品分析进一步阅读 简介 结巴中文分词(jieba)是一款在 Python 环境下使用的开源中文文本分词工具。它支持多种分词模式,包括精确模式、全模式和搜索引擎模式,同时支持繁体分词和自定义词典。因其易用性…

代码随想录算法训练营第十一天|20 有效的括号、1047 删除字符串中的所有相邻重复项、150 逆波兰表达式求值

20 有效的括号 题目链接:有效的括号 思路 由于栈结构的特殊性,非常适合做对称匹配类的题目。按照逻辑来讲,首先我们要确定下有几种不匹配的情况: 多了左括号多了右括号左右括号不匹配 然后左括号和右括号是一对一的&#xff…

[202401C]巨人之力的题解

原题描述: 时间限制: 1000ms 空间限制: 262144kb 题目描述 两千多年以前,身为艾尔迪亚人的尤弥尔意外获得巨人之力,并且创造了九大巨人,其无以匹敌的力量使得整个世界都陷入了无尽的战乱纷争,艾尔迪亚之外的人类过…

使用excel从1-2048中随机选择1个整数,并展示与其对应的单词

在Excel中,你可以使用以下指令来从1到2048之间随机选择一个整数,并展示其对应的单词: 1. 首先,在一个空白单元格中输入以下公式: INDEX(单词列表范围, RANDBETWEEN(1, 2048)) 这里的"单词列表范围"是一个包…

Vue中对前端按钮高亮的几种操作方式

在Vue中我们有时候会碰到一些需求,就是在点击某个按钮的时候,我们执行别的操作,但是我们希望点击别的操作的时候,让我们之前点击的按钮进行处于高亮状态。 个人在处理业务的时候,测试说,当用户选择某个按钮…

thinkphp6 模糊查找json下的字段值

写法: where(json的字段->json下的字段) sql生成json_extract(json的字段,$.json下的字段1.json下的字段2) 可以加上like where(‘‘json的字段->json下的字段, ‘like’, ‘%’. keyword .’%’) sql生成json_extract(json的字段,$.js…

Redis面试题15

Redis 集群的数据一致性如何保证? 答:Redis 集群的数据一致性是通过内置的集群协议和数据迁移机制来保证的。 在 Redis 集群中,数据被分为多个槽(slot),每个槽对应一个节点。当一个节点接收到写操作时&…

[GN] Vue3.2 快速上手 ---- 核心语法2

文章目录 标签的 ref 属性props生命周期自定义hook总结 标签的 ref 属性 用在普通DOM标签上&#xff0c;获取的是DOM节点。用在组件标签上&#xff0c;获取的是组件实例对象。 用在普通DOM标签上&#xff1a; <template><div class"person"><h3 ref&…

docker-compose直接官网二进制文件安装(linux)

试了很多种方法&#xff0c;国内镜像库安装&#xff0c;会报语法错误 直接用github官网&#xff0c;命令安装下载太慢&#xff0c;还不如魔法下载 官网链接docker-compose-linux-x86_64https://github.com/docker/compose/releases/download/v2.24.1/docker-compose-linux-x8…

温度采样【通道选通】S9KEAZ128的PTA2和PTA3引脚无法拉高

1、问题记录&#xff1a;由18串温度采样修改成32串温度采样&#xff0c;增加一路adc采样&#xff0c;通过cd4051控制通道选通&#xff0c;代码中增加了相应的代码&#xff0c;发现增加的最后8路温度不能够控制&#xff0c;以24串为例&#xff0c;给温度传感器增加温度&#xff…

pytorch(四)、完整小网络的搭建和sequential的使用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言搭建小网络和sequential的使用一、 第一种形式如下&#xff1a;二、第二种方式&#xff0c;使用sequential 前言 至此&#xff0c;神经网络的基础部分就基本结…

解决Spring Boot跨域问题(配置JAVA类)

什么是跨域问题 跨域问题指的是不同端口之间&#xff0c;使用 ajax 无法相互调用的问题。跨域问题本质是浏览器的一种保护机制&#xff0c;它是为了保证用户的安全&#xff0c;防止恶意网站窃取数据。 比如前端用的端口号为8081&#xff0c;后端用的端口号为8080&#xff0c;后…

C语言从入门到实战——编译和链接

编译和链接 前言一、 翻译环境和运行环境二、 翻译环境2.1 预处理&#xff08;预编译&#xff09;2.2 编译2.2.1 词法分析2.2.2 语法分析2.2.3 语义分析 2.3 汇编2.4 链接 三、 运行环境 前言 在C语言中&#xff0c;编译和链接是将源代码转换为可执行文件的两个主要步骤。 编…

Linux C语言开发(七)内存分类

目录 一.前言 二.动态内存 三.静态内存 四.动态内存与静态内存的区别 一.前言 C语言以其高效性而闻名,一个代码若想高效,则必须对内存空间进行合理的利用和分配。根据内存分配方式不同可以分

MacBookPro怎么数据恢复? mac电脑数据恢复?

使用电脑的用户都知道&#xff0c;被删除的文件一般都会经过回收站&#xff0c;想要恢复它直接点击“还原”就可以恢复到原始位置。mac电脑同理也是这样&#xff0c;但是“回收站”在mac电脑显示为“废纸篓”。 如果电脑回收站&#xff0c;或者是废纸篓里面的数据被清空了&…

docker安装nginx

拉取镜像 docker pull nginx 运行 docker run --name nginx -p 80:80 -d nginx 本地创建管理目录 创建挂载文件夹 mkdir -p /home/nginx mkdir -p /home/nginx/www mkdir -p /home/nginx/conf