环境准备
1.环境安装
网盘下载
需要安装的4个东西都放这了,也可以去网上自行下载:网盘地址
1. 安装android-sdk-windows
下载完成后解压,点击SDK Manager.exe安装连接安卓的tools
手机是哪个版本的Android就下载哪一个,我这里是Android9,其他的不用选,选中之后点右下角的Install(注:下载巨耗时,不要下错喽)
2. 安装jdk
一路next即可,记住安装位置
3. 安装nodejs
版本不宜过高,否则appium无法启动
4. 安装appium
双击exe直接安装
2.环境配置
环境变量中的地址都为你自己实际安装的地址。
- 配置android-sdk-windows环境变量(系统变量)
变量 | 值 |
---|---|
ANDROID_HOME | F:\android-sdk-windows |
path | %ANDROID_HOME%\platform-tools |
path | %ANDROID_HOME%\tools |
- 配置java环境变量
变量 | 值 |
---|---|
CLASSPATH | %JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar; |
JAVA_HOME | F:\jdk(jdk安装目录) |
path | %JAVA_HOME%\jre\bin |
path | %JAVA_HOME%\bin |
- nodejs环境变量
变量 | 值 |
---|---|
path | F:\nodejs(nodejs安装目录) |
appium使用
确保手机打开开发者模式以及USB调试,adb devices命令可以看到设备,如下:
-
打开appium
打开如下:
若环境变量配置无误,可直接Start Server
-
代码连接手机应用
from appium import webdriver
desired_caps = {}
desired_caps['platformName'] = 'Android' # 手机系统
desired_caps['platformVersion'] = '9' # 手机系统版本,我的为Android 9
desired_caps['deviceName'] = 'MI 9' # 设备名,着实填写
desired_caps['appPackage'] = 'com.ss.android.article.news' # app包名,这个为"今日头条"
desired_caps['appActivity'] = 'com.ss.android.article.news.activity.SplashBadgeActivity' # app入口
desired_caps["noReset"] = "True" # 不初始化手机app信息,不添加此项每次执行程序都是手机第一次打开app的情形
# 访问服务接口,并启动手机app。url参数是当appium启动后,默认访问服务地址和接口
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
执行以上代码可以看到手机上“今日头条”应用自动打开。
注:第一次执行appium会在手机中安装“Appium Settings”,需要手机允许“通过USB安装应用”,例如我的小米手机需要打开“开发者选项”下的“USB调试”、“USB安装”以及“USB调试(安全设置)”
- 定位元素
定位元素的方法参考:
- 提取信息
from appium import webdriver
desired_caps = {}
desired_caps['platformName'] = 'Android' # 手机系统
desired_caps['platformVersion'] = '9' # 手机系统版本,我的为Android 9
desired_caps['deviceName'] = 'MI 9' # 设备名,着实填写
desired_caps['appPackage'] = 'com.ss.android.article.news' # app包名,这个为"今日头条"
desired_caps['appActivity'] = 'com.ss.android.article.news.activity.SplashBadgeActivity' # app入口
desired_caps["noReset"] = "True" # 不初始化手机app信息,不添加此项每次执行程序都是手机第一次打开app的情形
# 访问服务接口,并启动手机app。url参数是当appium启动后,默认访问服务地址和接口
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
results = driver.find_elements_by_id("com.ss.android.article.news:id/uy") # 当前一屏的所有新闻
for item in results:
title = item.find_elements_by_id("com.ss.android.article.news:id/title") # 每一条新闻的标题元素
title = title[0].text if title else '' # 标题内容
print(title)
这样,标题就打印出来了
可以写一个模拟上滑的操作,然后将代码写在循环中,这样就可以一直采集。