zoukankan      html  css  js  c++  java
  • 利用appium自动控制移动设备并抓取数据

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

    学习目标
    1. 了解 appium-python-client模块定位元素以及提取其文本内容的方法
    2. 了解 appium-python-client模块控制滑动动作的方法

    以控制抖音app滑动并获取抖音短视频发布者昵称和点赞数等信息为例

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

    2.1.1 安装appium-python-client模块

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

    2.1.2 启动夜神模拟器,进入夜神模拟器所在的安装路径的bin目录下,进入cmd终端,使用adb命令建立adb server和模拟器的连接

    1. adb devices
    C:Program Files (x86)Noxin>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)Noxin>nox_adb.exe connect 127.0.0.1:62001
    already connected to 127.0.0.1:62001
    
    1. adb devices
    C:Program Files (x86)Noxin>adb devices
    List of devices attached
    127.0.0.1:62001 device
    

    2.1.3 启动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
    

    2.1.4 利用上一小节所学习的内容获取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就是进程名 注意前边有个点.

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

    完成代码如下,并运行代码查看效果:如果模拟器中抖音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']

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

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

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


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

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

    2.3.4 在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

    2.3.5 抖音app滑动 Demo

    from appium import webdriver
    import time
    # 初始化配置,设置Desired Capabilities参数
    desired_caps = {
        'platformName': 'Android',
        'deviceName': 'HUAWEI MLA-L12',
        '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)
    time.sleep(15)
    
    # 获取视频的各种信息:使用appium desktop定位元素
    print(driver.find_element_by_id('title').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)  # 视频名字,可能不存在,报错
    
    

    2.4 控制抖音app滑动

    2.4.1 appium滑动的函数

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

    • driver.swipe(start_x, start_y, end_x, end_y)

    2.4.2 控制抖音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)
    

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

    import time
    from appium import webdriver
    
    
    class 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 Server
            self.server = 'http://localhost:4723/wd/hub'
            # 新建一个driver
            self.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 = nums
    
        def comments(self):
            # app开启之后点击一次屏幕,确保页面的展示
            time.sleep(2)
            self.driver.tap([(500, 1200)], 500)
    
        def scroll(self):
            # 无限滑动
            i = 0
            while 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:
                    break
                i += 1
    
        def 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模块自动获取抖音视频文件

    2.6 关于模拟式移动端爬虫的参考阅读

    1. https://zhuanlan.zhihu.com/appium # 你们猜这是谁写的,不服你们也写,以后课件就用咱们班同学的!

    2. https://github.com/butomo1989/docker-android

    3. https://blog.csdn.net/weixin_42620645/article/details/83828863

    4. https://blog.csdn.net/weixin_39211232/article/details/83410130#Android_16

    5. https://www.jianshu.com/p/bf1ca3d4ac76

    6. http://www.testclass.net/appium/


    小结
    1. 了解 appium-python-client模块定位元素以及提取其文本内容的方法
    2. 了解 appium-python-client模块控制滑动动作的方法
  • 相关阅读:
    LOJ 6089 小Y的背包计数问题 —— 前缀和优化DP
    洛谷 P1969 积木大赛 —— 水题
    洛谷 P1965 转圈游戏 —— 快速幂
    洛谷 P1970 花匠 —— DP
    洛谷 P1966 火柴排队 —— 思路
    51Nod 1450 闯关游戏 —— 期望DP
    洛谷 P2312 & bzoj 3751 解方程 —— 取模
    洛谷 P1351 联合权值 —— 树形DP
    NOIP2007 树网的核
    平面最近点对(加强版)
  • 原文地址:https://www.cnblogs.com/gqv2009/p/12613635.html
Copyright © 2011-2022 走看看