前言
大家好,我是毒兽,毒辣的禽兽。
近期有人私我,对于动态网页的复杂性很是头疼。确实,随着语言种数的不断增加,网页也不再是一张简单的HTML,功能也逐步强大起来。但其实总的来说不管网页有多么复杂,它有一定的特性和规律。动态网页你要弄清楚它网页数据请求及跳转逻辑,这样我们就可以利用JS请求的API,按照一定要求发送带有参数的请求,就可以获得数据。当然,相对于前者的异步加载,更多动态网站的反爬虫措施更强,比如常见的各类验证码。这时候就需要selenium来进行模拟登录对网页操作。不过,智能手机的兴起,APP作为流行的第三方应用软件,又怎能少的了我们这些爬虫爱好者的探索呢,如果你还在selenium中停止不前,快来跟我一起感受appium的快乐吧!
文章目录
- 一、Appium的介绍及安装
- 1.Appium简介
- 2.Appium原理
- 3.Appium安装
- 二、Appium的简单使用
- 1.Appium基础使用及参数解析
- 2.Appium微信登录实例
- 3.总结
一、Appium的介绍及安装
1.Appium简介
一般会selenium的应该知道,它是分布式的WEB自动化测试工具,那通过字面意思就可以将appium理解为APP自动化测试工具,也就是移动端自动测试化工具。Appium 是跨平台的,它允许你用同样的 API 对多平台(iOS、Android、Windows)写测试,比如模拟点击,滑动,输入等操作。
2.Appium原理
appium选择了Client/Server的设计模式。只要client能够发送http请求给server,那么的话client用什么语言来实现都是可以的,这就是appium及Selenium(WebDriver)如何做到支持多语言的原因。这个 Server 的功能其实很简单:监听一个端口,然后接收由 client 发送来的 command。翻译这些 command,把这些 command 转义成移动设备可以理解的形式发送给移动设备,然后移动设备执行完这些 command ,再把执行结果返回给 Appium Server,Appium Server再把执行结果返回给client。( 和 webDriver 差不多 )
appium基础原理图:
3.Appium安装
一、需要软件
-
JDK:JAVA安装后配置JDK环境
-
SDK:SDK下载后配置adb环境
-
Python3:pyhton语言
-
Pycharm:python脚本编译工具
-
Appium-python-client:pyhton中的库
-
Appium-desktop:Appium客户端
二、环境搭建
对于JDK和SDK这里我就不大张旗鼓了,一般在百度上都会有详细的配置教程,,Python版本的选择也是考虑个人习惯,目前2和3都能够实现APP的自动化操作。脚本编译工具大家也可以根据自己的爱好习惯来选择。clint就按照第三方库安装的流程进行安装。
常用编程语言的client:
Python https://github.com/appium/python-client
Java https://github.com/appium/java-client
PHP https://github.com/appium/php-client
Ruby https://github.com/appium/ruby_lib
三、下载Appium客户端
安装 Appium 有两种方式, 是直接下载安装包 Appium Desktop 来安装,另一种是通过 Node.js来安装 ,下面我就只以安装包为例来讲解一下安装过程。
Appium Desktop 支持全平台的安装,在这里就给大家两个下载地址,
Bitbucket下载安装地址
GitHub下载安装地址
大家根据自己电脑相关配置下载对应的版本。下载安装完成后启动界面如下即表示安装成功。
二、Appium的简单使用
1.Appium基础使用及参数解析
Appium 相当于一个服务器,我们可以向 Appium 发送一些操作指令, Appium 就会根据不同的指令对移动设备进行驱动,完成不同的动作。对于爬虫来说,我们用 Seenium 来抓取 JavaScript 渲染的页面,可见即可爬, Appium一样也可以, 用Appium 来做 App 爬虫不失为一个好的选择。下面我们来了解 Appium 基本使用方法。
启动APP后界面如上图,然后我们点击Start Server,就表示我们启动了Appium服务。Server运行界面如下。
一般正常版本是没有黄色标识的错误的(我这里是因为电脑不支持高版本),这个界面运行之后表示正在监听 4723 端口,我们可以向此端口对应的服务接口发送操作指令,此页面就会显示这个过程的操作日志。这个时候我们需要用数据线将PC和手机连接起来,并在手机上将USB调试工具打开。这个时候我们就需要用adb命令查看PC和手机连接情况,想拓展的同学可以自行搜索adb了解,我这里就讲解几个基本用法。在手机连接成功之后就在cmd命令中输入
adb deserve -l
如果出现下面的返回数据,表示连接成功。
* daemon not running; starting now at tcp:5037
* daemon started successfully
List of devices attached
fd736344 device product:grus model:MI_9_SE device:grus transport_id:1
fd736344就是你手机ID,model后面的MI_9_SE就是你的设备名称(记住或者复制好,后面必须用到)。
接下来就在Server运行界面点击开始模拟按钮。
这时就出现了一个配置界面。
在Desired Capabilities下面添加以下四项值,完后点击“Start Session”。
platformName—设备平台。填Android或IOS
deviceName----设备名。按上边adb查出的设备名填写即可,如果名称之间有下划线,用空格也可以代替。
appPackage----要启动的app的包名。
appActivity----要启动的界面。
微信启动界面
{
"platformName": "Android",
"deviceName": "MI 9 SE",
"appPackage": "com.tencent.mm",
"appActivity": ".ui.LauncherUI"
}
抖音启动界面
{
"platformName": "Android",
"deviceName": "MI 9 SE",
"appPackage": "com.ss.android.ugc.aweme",
"appActivity": "com.ss.android.ugc.aweme.share.SystemShareActivity"
}
如下图是我将抖音配置完成后的启动界面:
下面我就讲配置中的参数如何获取来做一个补充:
appPackage,这个是APP的包名,最简单的获取方式就是用手机QQ给我的电脑发送APP,界面就出现了包名。
appActivity,这个是要启动的界面,其实这个参数是整个里面的难点,至今我都没有找到最简洁的办法,网络上的获取方式众说不一,那我就简单罗列几个。
1.通过运行日志查找
提前将手机上的后台软件运行关闭,同时清除通知消息,手机连接PC端,在USB调试打开下确定连接成功后,在cmd命令中输入
adb logcat>F:/log.log (log文件命名及存放位置可以自行更改)
然后在手机运行你想获取appActivity的APP,停止运行后Ctrl+C关闭adb命令,这是在相应的位置找到日志位置Ctrl+F查找activity即可获得
实测,成功率30%,几千行我这个高度近视太难了,并且很难找到准确的activity。
2.通过adb shell获取
首先要通过USB将手机与电脑连接,注意将手机的调试模式打开,打开Android SDK的platform-tools的文件夹,在上方地址栏输入cmd,进入cmd后首先输入adb shell ,出现$后输入 dumpsys activity | grep mFocusedActivity
操作如图:
反正就一直在1|grus:/ $下无限循环,可能是我SDK的问题吧,大家可以试试,据多人认证还比较有效。
3.通过aactl获取
首先要通过USB将手机与电脑连接,注意将手机的调试模式打开,打开Android SDK的build-tools的文件夹,在上方地址栏输入cmd,进入cmd后输入aact dump badging +存放apk的地址。
package:name 就是appPackage
launchable-activity: name 就是appActivity
这个方法暂时没有试过,听说效果也还不错
我就只解说这三个方法,其实获取appActivity还有很多,比如直接将安装包压缩解压之后通过文件查看,或者通过appium指定安装包通过运行界面查看日志,使用dumpsys命令获取,使用logcat日志筛选等等,重要的是能成功获取就行。
2.Appium微信登录实例
连接好手机,打开appium,打开到参数配置界面,按照我前面所说的参数进行添加
配置完成然后点击start session进行模拟,手机上会有弹窗确认,点击确定之后进入模拟界面
第一步:点击如图小眼睛(start recording),该功能可以记录你在模拟操作中动作所对应的代码,比如点击啊,输入啊等等,点击之后下面会有选项框,
选择python。
第二步:点击模拟界面的登录
第三步:右边则会出现如图元素框Selected Element,Tap实现点击功能,sendkey实现输入功能,clear就是清除。点击tap出现登录界面,然后点击sendkey输入手机号。
我们可以在此页面点击不同的动作按钮,即可实现对 App 的控制,同时 Recorder 部分也可以生成对应的 Python 代码。
首先利用python代码驱动APP需要指定一个Appium Server,一般默认为
server = 'http://localhost:4723/wd/hub'
其次就是要指定Desired Capabilities的参数
desired_caps={ 'platformName':'Android', 'deviceName':'MI 9 SE', 'appPackage':'com.tencent.mm', 'appActivity':'.ui.LauncherUI'}'
新建一个 Session ,这类 点击 Appium 置驱动 Start Session 按钮相同的功能,代码实现如下
所示:
from appi um import webdriver
from selenium.webdriver. support.ui import WebDriverWait
driver = webdri ver. Remote (server, desired_ caps)
配置完成后运行,就可以启动微信 App 但是现在仅仅是可以启动 pp 。
启动APP代码:
from appium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
server='http://127.0.0.1:4723/wd/hub'
desired_caps={
'platformName':'Android',
'deviceName':'MI 9 SE',
'appPackage':'com.tencent.mm',
'appActivity':'.ui.LauncherUI'}
driver=webdriver.Remote(server,desired_caps)
wait=WebDriverWait(driver,30)
这时你在手机就可以看到微信启动界面了。接下来我们根据之前的代码记录,将登录点击及手机号输入等代码都加入总代码中,当然,记录代码稍微有些杂乱,我们需要整理一下。
代码记录中的代码是这样的
el1 = driver.find_element_by_id("com.tencent.mm:id/f7i")
el1.click()
el2 = driver.find_element_by_id("com.tencent.mm:id/bfl")
el2.send_keys("1111111111")
el3 = driver.find_element_by_id("com.tencent.mm:id/e09")
el3.click()
el4 = driver.find_element_by_id("com.tencent.mm:id/dm3")
el4.click()
我们需要改动一下
登录代码:
from appium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
server='http://127.0.0.1:4723/wd/hub'
desired_caps={
'platformName':'Android',
'deviceName':'MI 9 SE',
'appPackage':'com.tencent.mm',
'appActivity':'.ui.LauncherUI'}
driver=webdriver.Remote(server,desired_caps)
wait=WebDriverWait(driver,30)
login=wait.until(EC.presence_of_element_located((By.ID,'com.tencent.mm:id/f7i')))
login.click()
#输入手机号
phone=wait.until(EC.presence_of_element_located((By.ID,'com.tencent.mm:id/bfl')))
phone.send_keys('1111111111')
#下一步
button=wait.until(EC.presence_of_element_located((By.ID,'com.tencent.mm:id/e09')))
button.click()
#权限允许
authority=wait.until(EC.presence_of_element_located((By.ID,'com.tencent.mm:id/dm3')))
button.click()
#输入密码
password=wait.until(EC.presence_of_element_located((By.ID,'com.tencent.mm:id/hz')))
password.send_keys('xxxxxxxxx')
#登录
login=driver.find_element_by_id('com.tencent.mm:id/e09')
login.click()
这样你就成功的利用python代码登录到微信了。
当然此处我只是稍微展示了appium与python的基础使用,代码思路来源于崔大的《python3网络爬虫开发实战》,如果想学习更多的实例操作,大家可以去学习学习崔大的书,我也会在后面的时间里为大家写出更多的appium实际操作。
3.总结
对于appium,在环境配置上相当严谨,大家一定要按照规定的步骤去进行配置,手机与PC端连接之后一定要确保开启了USB调试模式,还有一点,就是不要用自己现在使用的手机,因为在模拟APP操作的时候它会将原来的数据给清除,所以在这里建议大家用模拟器。后面的几天我会打算以appium做一个爬虫实战,希望大家共同努力。