最近朋友跟我说可能要接一个 App爬虫的的单子,怀着兴奋激动(bu han chan)的心情,我打开CSDN搜索如何配置Python Appium的相关教程,踩了很多的坑,准备和大家一起分享一下。
首先我们需要配置Android SDK(iOS没试,因为没有设备),因为我这个人比较的喜欢IDE(lan),所以我直接选择下载一个Android Studio来安装我们的Android SDK。访问Android Studio官网来下载:
Download Android Studio and SDK tools | Android Developershttps://developer.android.google.cn/studio/
下载好后打开Android Studio,找到settings --> system settings --> Android SDK
按照上图配置好SDK保存路径以及安装的版本后,点击Apply按钮安装。
安装好我们的SDK后记得配置一下环境变量(因为Appium会自动读取环境变量以检验JDK和SDK-Tools的安装),因此我们需要创建如下变量:
配置好后打开PowerShell检查一下:
确认好上述东西可以开始下载Appium驱动了,这里不建议使用1.20版本以上的Appium,因为如何你需要对XML(ui)进行即时的元素查看的话,你需要去独立的安装Appium Inspector(ui检查器),而这个东西是在1.20以下版本是被集成在原生Appium里的,无需单独下载。
Appium github下载链接:https://github.com/appium/appium-desktop/releases/latesthttps://github.com/appium/appium-desktop/releases/latest
下载好的Appium是安装C盘里的,这个是无法更改的。
打开后的驱动涨这个样子:
一般情况下我们只使用精简模式就足够了,保留默认配置启动服务器。
启动后的Appium Log长这样:
好了,到这里准备工作就完成了。
对安卓有点了解的小伙伴应该知道:Android的APP基本元素包含Activity和UI XML。那么,如果我去爬虫,我怎么去定位到我想要爬取的元素呢?这里就用到我们之前提到过的Appium Inspector了。
有主意发现上面Log Shell里的一个放大镜吗,那就是我们要用的UI检查器。
点开它,你能看到这样的画面:
可是这样干启动会话是根本启动不了我们的UI检查器的,它会抛出这样的异常:
这是因为我们没有指定启动配置,那么我们该怎么配置我们的连接呢?
首先点击自动设定按钮,这时Appium会弹出这样的对话框:
因为我们刚才在启动Appium服务的时候是以localhost来启动的,所以这里Appium自动识别到了。
当然这种情况下还不能启动会话,因为它又会抛出这样的异常:
这是因为你没有指定Appium以哪一种内核类型去连接设备,以及你没有指定设备的名称、动画以及自动化时发生异常时的指令超时等等配置项。
所以我在这里为大家列举了一份启动json:
{
"platformName": "Android",//平台名称
"platformVersion": "11",//系统版本
"deviceName": "pyxis",//设备名称,可以随便写(但这里建议用adb识别的结果
"unicodeKeyboard": true,//是否启动unicode键盘以进行自动化
"resetKeyboard": true,//是否重置键盘
"noReset": true,//这个没太搞懂
"newCommandTimeout": 6000,//当新指令信号发送到安卓设备时,Appium最大的等到超时为多长时间(以毫秒为单位)
"automationName" : "UiAutomator2"//指定动画
}
将其复制到我们下面的JSON Representation里并保存:
可以看到Appium已经读取我们的配置项了,这个时候我们就可以启动我们的会话了。
在创建连接会话时,Appium会要求你安装如下的驱动组件:
一个是appium的uiautomator2的测试服务,一个是主服务,切记一定要安装,否则Appium是拿不到数据的。
安装好之后,UI检查器就是如下的样子:
这样我们就可以向Selenium一样来定位我们想要的元素对象了。
讲完了UI部分,我们也需要Activty来对我们的APP进行控制,那么,该怎么操作呢,没错这个时候就需要ADB(Android Debug Bridge)工具了
使用如下的指令可以获取到我们想要的APP锁对应的activity:
adb shell monkey -p package_name -v-v-v 1
可以看到,这里就是我们想要的activity:
好的,以上与代码相关的部分就介绍完了,接下来讲讲我在配置时遇到的坑。
1.”Session Not Created“,像这种错误有一种可能是因为你的手机并没有获取到权限,这个时候该怎么办呢?
首先在确保你的手机有开启开发者模式的情况下,以小米手机为例(本人小米CC9),打开开发者模式下的这些设置:
打开这些设置后以防万一,我们最好重启一下再连接adb。
2."C:\Program Files\Java\jdk-17.0.1" is not xxx,is it installed ?
这个问题的指向对象就很明显了,是指你的JAVA配置出现了问题,因此你需要检查你的JAVA_HOME是否配置正常。
具体是因为什么我也不清楚是为什么,但是实话这么搞它就会报错,因此,千万别装!!!
4."远程主机关闭了访问"?不用看了,这是因为你Appium服务没启动或者掉了。
---------------------------------------------------------------------------------------------------------------------------------好的,以上就是本次Appium配置分享的全部内容了,喜欢或者觉得有用记得给我点个赞,我是Deahost,下期见。
最后附上一个自动刷抖音的脚本送给大家,有需要的可以自行复制运行:
from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction
import time
from random import randint
action = TouchAction()
timehold = int(input("请输入浏览时长:"))
swipe_duration = float(input("请输入滑动时长:"))
desired_caps = {
"platformName": "Android",
"platformVersion": "11",
"deviceName": "pyxis",
"appPackage":"com.ss.android.ugc.aweme",
"appActivity":".splash.SplashActivity",
"unicodeKeyboard": True,
"resetKeyboard": True,
"noReset": True,
"newCommandTimeout": 6000,
"automationName" : "UiAutomator2"
}
driver = webdriver.Remote("http://localhost:4723/wd/hub",desired_capabilities=desired_caps)
def get_size():
x = driver.get_window_size()['width']
y = driver.get_window_size()['height']
return (x,y)
def swipe(time_hold:int,duration:int) -> None:
screen = get_size()
time.sleep(time_hold)
driver.swipe(screen[0] * 0.5,screen[1] * 0.75,screen[0] * 0.5,screen[1]*0.25,duration)
time.sleep(3)
while True:
try:
driver.implicitly_wait(randint(1,3))
like_button = driver.find_element_by_id("ck8")
action.tap(like_button,count=2)
swipe(time_hold=timehold,duration=swipe_duration)
except Exception as Error:
print(f"[Error] 不是一个有效短视频,可能是直播,尝试滑动")
swipe(time_hold=0,duration=swipe_duration)