python爬虫二十一:app移动端数据抓取(一)

2023-11-07

1、移动端app数据

1.1为什么要抓取移动端数据

①随着时代的发展,pc—>移动端—>大数据—>AI(人工智能未来)对于做数据分析、用户画像、市场调研来说仅仅参考PC端的数据是远远不够的。那么于此同时移动的数据就显得尤为的重要
②android基本布局
线性布局 linearLayout 2 相对布局 RelativelLayout 3 帧布局 FrameLayout 4 表格布局 TableLayout 5 绝对布局 AbsoluteLayout

1.2移动端抓取数据注意事项

①可能需要反编译,分成出加密算法抓取信息
②可能加固,需要脱壳
③需要破解各式各样的签名,证书,设备绑定方法,找到隐藏的加密算法

2、UIAutomator

2.1UIAutomator的简介

UIAutomator是google提供的用来做安卓自动化测试的一个java库,测试脚本只能用Java语言开发,而且测试脚本要打包成jar包或者apk包上传到设备上才能实现

2.1.1jar包

①JAR(Java ARchive)是将一系列文件压缩到单个压缩文件里,就象Zip那样。JAR文件是跨平台的,不必关心涉及具体平台的问题。
jar包就是别人已经写好的一些类,然后将这些类进行打包,你可以将这些jar包引入你的项目中,然后就可以直接使用这些jar包中的类和属性以及方法。

2.1.2apk包

Android应用程序包(Android application package)一个APK文件内包含被编译的代码文件(.dex 文件),文件资源(resources), 原生资源文件(assets),证书(certificates),和清单文件(manifest file),通过将APK文件直接传到Android模拟器或Android手机中执行即可安装。

3、安卓的四大控件

3.1activity

①一个Activity通常就是一个单独的窗口
②Activity之间是通过Intent进行通信
③android应用中每一个activity都必须在androidManifest.xml配置文件中声明,否则系统不执行更无法识别该Activity

3.2service

3.2.1service用于在后台完成用户指定的操作

①start(启动):当应用程序组件(activity)调用startservice()方法启动服务时,服务处于start状态,一旦启动,服务可以在后台无限期运行,即使启动它的组件已经被销毁。
②bound(绑定):当应用程序组件(activity)调用bindservice()方法绑定到服务时,服务处于绑定状态

3.2.2start和bound的区别

①start启动服务是由其它组件调出startService()方法启动的,这导致服务的onStartCommand()方法被调用,当服务是start状态时,生命周期与它的组件无关,并且可以在后台无限期的运行,即使启动服务的组件已经被销毁,因此,服务需要在完成任务后调用stopSelf()方法停止,或者由其它组件调用stopService()方法停止服务
②使用bound开启服务,bindService()会将调用者与服务绑定在一起,调用者一旦销毁,服务也就终止

3.2.3service的特点

Service通常位于后台运行,它一般不需要与用户交互,因此Service组件没有图形用户界面。Service组件需要继承Service基类。Service组件通常用于为其他组件提供后台服务或监控其他组件的运行状态。

3.3content provider

①android平台提供了Content Provider使一个应用程序的指定数据集提供给其他应用程序。其他应用可以通过ContentResolver类从该内容提供者中获取或存入数据。
②只有需要在多个应用程序间共享数据是才需要内容提供者。例如,通讯录数据被多个应用程序使用,且必须存储在一个内容提供者中。它的好处是统一数据访问方式。
③ContentProvider实现数据共享。ContentProvider用于保存和获取数据,并使其对所有应用程序可见。这是不同应用程序间共享数据的唯一方式,因为android没有提供所有应用共同访问的公共存储区。
④开发人员不会直接使用ContentProvider类的对象,大多数是通过ContentResolver对象实现对ContentProvider的操作。
⑤ContentProvider使用URI来唯一标识其数据集,这里的URI以content://作为前缀,表示该数据由ContentProvider来管理。

3.4broadcast receiver

①你的应用可以使用它对外部事件进行过滤,只对感兴趣的外部事件(如当电话呼入时,或者数据网络可用时)进行接收并做出响应。广播接收器没有用户界面。然而,它们可以启动一个activity或serice来响应它们收到的信息,或者用NotificationManager来通知用户。通知可以用很多种方式来吸引用户的注意力,例如闪动背灯、震动、播放声音等。一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息。
②广播接收者的注册有两种方法,分别是程序动态注册和AndroidManifest文件中进行静态注册。
③动态注册广播接收器特点是当用来注册的Activity关掉后,广播也就失效了。静态注册无需担忧广播接收器是否被关闭,只要设备是开启状态,广播接收器也是打开着的。也就是说哪怕app本身未启动,该app订阅的广播在触发时也会对它起作用。

4、adb的使用

4.1adb的简介

adb ( Android Debug Bridge)安卓调试桥,它是一个通用命令行工具,允许与模拟器实例或真机Android设备进行通信。它可为各种设备操作提供便利,如安装和调试应用。
①Adb client 命令行程序用于从shell或脚本中运行adb命令
②Adb server是运行在PC的的一个后台程序
③Adbd 程序是一个在Android设备或模拟器系统中运行的后台进程,通过②完成与移动端的额交互完成相关操作

4.2adb的使用

4.2.1adb的安装

随便下载一个模拟器就会带有adb应用程序,将bin目录添加至环境变量,方便任意位置操作这里面的可执行文件

在这里插入图片描述
在这里插入图片描述

4.2.2adb的使用

在dos中输入adb就会开启pc后台中运行的adb server
查看连接设备,第一次输入时守护进程没有开启,他开启后再次输入,可以看到连接的设备为空,还没有连接任何移动设备
在这里插入图片描述
开启模拟机后就会连接(必须开启adb server才能连接设备)
在这里插入图片描述

4.2.3adb的常用命令

①adb dvices :查看adb连接了哪些设备
②adb kill-server :关闭服务
在这里插入图片描述

③adb install apk文件绝对路径 :安装app应用
下载apk文件
在这里插入图片描述
在这里插入图片描述

④adb shell pm list packages :查看包名
在这里插入图片描述

⑤adb uninstall 应用包名 :卸载应用
在这里插入图片描述

5、UIAutomator2

由于UIAutomator的测试语言只能用java语言开发,测试脚本也要打包成jar包或者apk包上传到设备上才能实现,不符合python的轻便,也不能用python写脚本测试,所以为python开发了一个UIAutomator库,让python可以做android的测试
u2的安装如下
在这里插入图片描述

5.1uiautomator2的优势

UI自动化编写采用Python,学习成本低
UI控件识别有专门的工具 weditor
环境搭建简单
UI自动化脚本运行稳定

5.2uiautomator2的执行流程

①在移动设备上安装atx-agent(守护进程),随后atx-agent启动u2服务(默认7912端口)进行监听
②在PC端来编写脚本(相当于发送HTTP请求到移动设备的server端)
③ 移动设备通过wifi或usb接收到了PC上发来的HTTP请求,执行定制的操作
运行环境:android4.4+、python3.6+
1、Uiautomator-server: 就是谷歌原声的 uiautomator
2、Atx-agent: uiautomator的守护进程
3、minicap和minitouch 中2个包是atx-agent增加远程控制功能的依赖
在这里插入图片描述

5.3uiautomator2的使用

①打开adb服务
②连接移动端
③初始化移动端python -m uiautomator2 init
在这里插入图片描述
在这里插入图片描述

5.3.1pycharm操控移动端的软件

在DOS中找到apk包名
方法一adb shell pm list packages
方法二 aapt dump badging apk文件的绝对路径
打开appd.app_start('包名')
关闭appd.app_stop('包名')

d.service('uiautomator').running() uiautomator运行状态
d.service('uiautomator').start() 启动uiautomator
d.service('uiautomator').stop() 停止uiautomator
d.app_install(data='apk地址') 安装app
d.app_current() 获取当前前台app的信息
d.app_stop('包名') 停止当前app
d.app_clear('包名') 清除缓存
d.app_uninstall('包名') 卸载app
d.app_list() 获取所有app的信息
d.app_stop_all() 停止所有app
d.app_uninstall_all() 卸载所有app

5.3.2pycharm中u2的基本操作

import uiautomator2 as u2

'''
1、通过wifi 172.17.100.15要在局域网中测试
2、通过usb
3、通过adb wifi ip+port
'''
# d = u2.connect_wifi('172.17.100.15')
d = u2.connect_usb('127.0.0.1:62001') #可以直接启动ATX守护进程
# print(d.info)
# print(d.device_info) # 查看守护进程的状态
# print(d.service('a').running()) # 开启了就为true没开启就为false
# d.service('name').start() # 开启守护进程,或者手动开启也可以
# print(d.service('name').running()) # 查看守护进程的状态
# d = u2.connect_wifi('172.17.99.15') # 无效的ip不能通过这个ip连接
# print(d.wlan_ip) # 这是通过ATX转化后的ip:172.17.99.15,模拟器是不对的真机是可以的
# 安装百度
# d.app_install(data='https://ip4095973748.mobgslb.tbcache.com/fs08/2020/09/24/11/120_b9a3e3f87a32db6a1e0366741deefa3b.apk?fname=QQ%E6%B5%8F%E8%A7%88%E5%99%A8&productid=2011&packageid=600982633&pkg=com.tencent.mtt&vcode=10778135&yingid=wdj_web&pos=wdj_web%2Fdetail_normal_dl%2F0&appid=44621&apprd=44621&iconUrl=http%3A%2F%2Fandroid-artworks.25pp.com%2Ffs08%2F2020%2F09%2F02%2F11%2F110_dfcdbbf1a14ea1c552ea8faf19317cb1_con.png&did=faaaa28ba09ab482dc9c400d838cfa78&md5=8136b6144bd4dce94ec756d9e51a55ba&ali_redirect_domain=alissl.ucdl.pp.uc.cn&ali_redirect_ex_ftag=5e6bf67d7726627063444f1515b3638a7b1160f8514c4c88&ali_redirect_ex_tmining_ts=1601006536&ali_redirect_ex_tmining_expire=3600&ali_redirect_ex_hot=100')
# d.app_start(package_name='com.baidu.searchbox') # 启动百度
# print(d.app_current()) # 获取前台运行app的信息返回的是package, activity, pid(正在开发)# print(d.current_app())跟前者一样
# d.app_stop('com.baidu.searchbox') # 关闭app
# d.app_uninstall(package_name='com.baidu.searchbox') # 卸载指定包名app
# print(d.app_list()) # 查看所有app的信息
# print(d.app_info(package_name='com.baidu.searchbox')) # 获取包名的详细信息
# d.app_clear(package_name='com.baidu.searchbox') # 清楚app缓存内存提高设备运行的效率
# d.app_stop_all() # 停止所有的app,有默认排除参数所以不会停ATX(u2)
# d.app_uninstall_all() # 卸载所有的app,有默认排除参数所以不会卸载ATX(u2)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python爬虫二十一:app移动端数据抓取(一) 的相关文章

  • 【c语言】新手初学while循环,for循环的一些想法与思考

    循环语句有三种 while循环 for循环 do while循环 由于只学了前两种 因此只能将两种进行比较 但在比较两者前 我认为新手有必要认真的学习良好的代码习惯 这里我使用的是 高质量 C C 编程指南 尽管年代比较久远但依旧受益良多
  • 一、基础架构

    架构是什么 软件架构指软件系统的顶层结构 主要是由系统是一群关联个体组成 个体可以是模块或者子系统 他们按照某种特定的规则来运作和协作 系统架构的目的 架构设计的主要目的是为了解决软件系统复杂度带来的问题 要有的放矢 不是胡编乱造 这个结论
  • HTML5特效动画

    11 10款造型奇特的CSS3进度条 Loading动画DEMO演示 10款造型奇特的CSS3进度条 Loading动画 今天我们要分享10款造型奇特的CSS3进度条 Loading动画 这10款进度条应用不仅有创意的外观 而且还有非常特别
  • VS Code插件live server的安装和使用

    https blog csdn net sinat 37024730 article details 128902967
  • MS08-067远程代码执行漏洞(CVE-2008-4250)

    MS08 067远程代码执行漏洞 CVE 2008 4250 Windows Server服务RPC请求缓冲区溢出漏洞复现 文章目录 MS08 067远程代码执行漏洞 CVE 2008 4250 Windows Server服务RPC请求缓
  • anaconda使用系列教程--5)安装anaconda环境到指定位置

    背景 anaconda的环境都比较大 如果安装到根目录很快就会把根目录占满 最好能指定新建环境的安装路径 方法 方法就是在conda create命令加上选项 prefix即可 安装虚拟环境到指定路径的命令如下 conda create p

随机推荐

  • 数据库文件加密

    配置MySQL数据库连接 spring datasource driver class name com mysql jdbc Driver spring datasource url jdbc mysql 121 196 xxx xxx
  • STM32自己写printf函数方法(不用重定向)

    stm32有几个串口可以使用 当我们想用printf打印数据到上位机时 通常是使用fput重定向 当我们要多个串口使用printf格式函数时 可以在写一个类似printf的函数 include
  • PyTorch 源码解读之 nn.Module:核心网络模块接口详解

    目录 0 设计 1 nn Module 实现 1 1 常用接口 1 1 1 init 函数 1 1 2 状态的转换 1 1 3 参数的转换或转移 1 1 4 Apply 函数 1 2 属性的增删改查 1 2 1 属性设置 1 2 2 属性删
  • Spring Boot(一):开始使用

    背景 其实Spring Boot很早就使用过 但由于之前未做深入的研究且目前工作中所使用的技术也并未涉及 所以导致对其使用依然不是很熟悉 正是因为用过Spring Boot才懂得它的好用之处 但目前开发的项目使用的技术较为落后 导致开发效率
  • 探究:秒杀系统

    1 秒杀系统的特点 瞬时高并发 2 预防措施 2 1 流量限制 对于一个相同的用户 限制请求的频次 对于一个相同的IP 限制请求的频次 验证码 减缓用户请求的次数 活动开启之前 按钮先置灰 防止无效的请求流入系统 给系统造成冲击 2 2 页
  • LOL-v2数据集和VE-LOL数据集的区别

    LOL v2数据集和VE LOL数据集的区别 LOL v2 LOL v2数据集 64 包括两个不同的子集 即LOL v2 real和LOL v2 synthetic LOL v2 real子集是通过改变ISO和曝光时间在真实场景中捕获的 包
  • git merge&rebase区别

    merge rebase两个分支合并操作 各有利弊 我们先看看表现吧 假如master和feature分支如下 如果我们merge操作 我们看到 合并时候 作为一个新提交作为一个新节点 head指针移动到最新master分支 feature
  • linux定时执行php脚本方法

    网站运营过程中 经常会遇到需要定时执行php脚本的情况 这次介绍linux系统定时执行php脚本方法 crontab crontab的服务进程名为crond 英文意为周期任务 crontab在Linux主要用于周期定时任务管理 通常安装操作
  • 胡立阳:如何判断股价见底

    胡立阳 如何判断股价见底 发表时间 2007年11月28日 17时56分 评论 浏览 248 213844 腾讯证券 最近A股指数在6100点一路下滑 跌破半年线 国内各个媒体众说纷纭 观点不一 都在判断底部到底在哪里 就此问题 腾讯证券连
  • AntD的Table表头title加Icon图标和气泡提示Tooltip

    如图 想在Table表单中的描述后面加上Icon图标和气泡提示Tooltip 第一时间找了AntD文档 找到搜索功能及相应图标 filterDropdown和filterIcon 也在百度上找到https www jianshu com p
  • QT基础(入门)

    对QT文件中的 pro文件解释 QT core gui QT包含的模块 QT中的快捷键 注释 ctr 运行 ctrl r 编译 ctrl b 查找 ctrl f 整行移动 ctrl shift 向上键 向下键 帮助文档 F1 自动对齐 ct
  • Android Studio NDK JNI 编程最小白最简单入门Demo

    Android Studio 编写JNI有两种方式 通过ndk build编写 和eclipse类似 需要配置Android mk Application mk文件 之前的一些开源库还是使用此种方式编写 so 因此还是需要了解此种方式 通过
  • C++拷贝构造函数详解

    一 什么是拷贝构造函数 首先对于普通类型的对象来说 它们之间的复制是很简单的 例如 int a 100 int b a 而类对象与普通对象不同 类对象内部结构一般较为复杂 存在各种成员变量 下面看一个类对象拷贝的简单例子 include
  • Qlik Sense Desktop 初步体验

    点击进入 QlikView QlikSense 社区 交流群 432998033 Qlik Sense Desktop 的案例展示 先上几个刚刚边看边学完成的几个报表案例效果 如果图片显示不正常 可以重新刷新一下页面显示 个人感觉报表的设计
  • C语言扫雷游戏

    一 思路 设计两个二维数组 mine和show mine用来存放布置雷的信息 show用来存放排查雷的信息 mine数组初始化为 0 布置雷时改为 1 show数组初始化为 排除雷后改为数字字符 周围有几个雷就为数字几 二 game函数 先
  • 【Spring

    应用上下文 应用上下文和资源路径 构造应用上下文 构造ClassPathXmlApplicationContext实例 快捷方式 使用通配符 蚂蚁式图案 类路径 前缀 应用上下文和资源路径 本节介绍如何使用资源创建应用程序上下文 包括使用
  • 线程的生命周期

    线程的生命周期
  • opencv将16位灰度图片转化为8位

    大家在加载灰度图时 一定要看准图片存储格式位数 opencv默认为8位读取 如果该图为16位 则读取为全0 导致程序出错 以下代码只需修改路径 可以批量处理图片 include
  • 手机相关公开数据集分享

    可用于手机价格预测 图像分类等训练 1 Flipkart 手机数据集 按品牌列出的手机规格 Apple Samsung 等 该数据集包含印度最受欢迎的 5 个移动品牌的描述 列 有 16 列 每列都有一个不言自明的标题 行 有 430 行
  • python爬虫二十一:app移动端数据抓取(一)

    1 移动端app数据 1 1为什么要抓取移动端数据 随着时代的发展 pc gt 移动端 gt 大数据 gt AI 人工智能未来 对于做数据分析 用户画像 市场调研来说仅仅参考PC端的数据是远远不够的 那么于此同时移动的数据就显得尤为的重要