博客
关于我
「docker实战篇」python的docker-抖音appium模拟滑动操作(22)
阅读量:356 次
发布时间:2019-03-04

本文共 9883 字,大约阅读时间需要 32 分钟。

使用Appium模拟抖音进行数据抓取(技术详解)

通过Appium模拟器,可以实现抖音数据的自动化抓取,涵盖用户信息、关注列表等多个模块。本文将详细介绍操作流程及代码实现。


一、操作步骤

1. 模拟器配置

首先,确保模拟器已正确配置,包括:

  • 取消模拟器代理:通过命令adb devices查看设备列表,确保模拟器已正确连接。
  • 下载抖音APK:从官方渠道下载最新版本的抖音APK文件。
  • 查看APK信息:通过aapt dump badging命令获取appPackageappActivity信息。例如:
    • appPackage: com.ss.android.ugc.aweme
    • appActivity: com.ss.android.ugc.aweme.main.MainActivity

2. 获取安卓版本号

在模拟器中,进入“关于手机”页面,找到“Android版本”并记录版本号(如4.4.2)。


二、Python代码编写

1. 初始化配置

编写Appium驱动代码,配置如下:

from appium import webdriverfrom selenium.webdriver.support.ui import WebDriverWait# 配置信息cap = {    "platformName": "Android",    "platformVersion": "4.4.2",    "deviceName": "127.0.0.1:62001",    "appPackage": "com.ss.android.ugc.aweme",    "appActivity": "com.ss.android.ugc.aweme.main.MainActivity",    "noReset": True,    "unicodeKeyboard": True,    "resetKeyboard": True}driver = webdriver.Remote("http://localhost:4723/wd/hub", cap)

2. 模拟操作流程

按照以下步骤编写Python脚本:

  • 搜索功能

    • 定位搜索框并输入抖音ID(如191433445)。
    • 点击搜索按钮,进入用户详情页。
  • 用户信息解析

    • 点击“用户”标签,进入用户资料页面。
    • 点击用户头像,进入详细信息界面。
  • 粉丝数据抓取

    • 点击“粉丝”按钮,进入粉丝列表。
    • 通过模拟滑动获取全部粉丝数据。

三、页面解析(XPath示例)

1. 搜索页面

  • 搜索框:

    //android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.support.v4.view.ViewPager[1]/android.widget.FrameLayout[1]/android.support.v4.view.ViewPager[1]/android.widget.TabHost[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.view.View[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.LinearLayout[2]/android.widget.FrameLayout[1]/android.widget.ImageView[1]
  • 搜索按钮:

    //android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.support.v4.view.ViewPager[1]/android.widget.FrameLayout[1]/android.support.v4.view.ViewPager[1]/android.widget.TabHost[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.view.View[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.LinearLayout[2]/android.widget.FrameLayout[1]/android.widget.TextView[1]

2. 用户详情页

  • 用户信息:

    //android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.support.v4.view.ViewPager[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[2]/android.view.View[1]/android.support.v7.widget.RecyclerView[1]/android.widget.RelativeLayout[1]/android.widget.RelativeLayout[1]/android.widget.ImageView[1]
  • 粉丝按钮:

    //android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.support.v4.view.ViewPager[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[2]/android.view.View[1]/android.support.v7.widget.RecyclerView[1]/android.widget.RelativeLayout[1]/android.widget.RelativeLayout[1]/android.widget.ImageView[1]

四、Python脚本实现

1. 搜索功能

try:    # 点击搜索    if WebDriverWait(driver, 60).until(        lambda x: x.find_element_by_xpath(            "//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.support.v4.view.ViewPager[1]/android.widget.FrameLayout[1]/android.support.v4.view.ViewPager[1]/android.widget.TabHost[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.view.View[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.LinearLayout[2]/android.widget.FrameLayout[1]/android.widget.ImageView[1]"        )    ):        driver.find_element_by_xpath(            "//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.support.v4.view.ViewPager[1]/android.widget.FrameLayout[1]/android.support.v4.view.ViewPager[1]/android.widget.TabHost[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.view.View[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.LinearLayout[2]/android.widget.FrameLayout[1]/android.widget.ImageView[1]"        ).click()except:    driver.tap([(26,76), (115,165)], 500)# 定位搜索框if WebDriverWait(driver, 60).until(    lambda x: x.find_element_by_xpath(        "//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.support.v4.view.ViewPager[1]/android.widget.FrameLayout[1]/android.support.v4.view.ViewPager[1]/android.widget.TabHost[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.view.View[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[2]/android.widget.EditText[1]"    )):    # 获取douyin_id进行搜索    edit = driver.find_element_by_xpath(        "//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.support.v4.view.ViewPager[1]/android.widget.FrameLayout[1]/android.support.v4.view.ViewPager[1]/android.widget.TabHost[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.view.View[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[2]/android.widget.EditText[1]"    )    edit.send_keys('191433445')    while edit.text != '191433445':        edit.send_keys('191433445')        time.sleep(0.1)    edit.click()    if WebDriverWait(driver, 10).until(        lambda x: x.find_element_by_xpath(            "//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.support.v4.view.ViewPager[1]/android.widget.FrameLayout[1]/android.support.v4.view.ViewPager[1]/android.widget.TabHost[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.view.View[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.LinearLayout[1]/android.widget.TextView[1]"        )    ):        driver.find_element_by_xpath(            "//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.support.v4.view.ViewPager[1]/android.widget.FrameLayout[1]/android.support.v4.view.ViewPager[1]/android.widget.TabHost[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.view.View[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.LinearLayout[1]/android.widget.TextView[1]"        ).click()

2. 用户信息解析

if WebDriverWait(driver, 10).until(    lambda x: x.find_element_by_xpath(        "//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.support.v4.view.ViewPager[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[2]/android.view.View[1]/android.support.v7.widget.RecyclerView[1]/android.widget.RelativeLayout[1]/android.widget.RelativeLayout[1]/android.widget.ImageView[1]"    )):    driver.find_element_by_xpath(        "//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.support.v4.view.ViewPager[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[2]/android.view.View[1]/android.support.v7.widget.RecyclerView[1]/android.widget.RelativeLayout[1]/android.widget.RelativeLayout[1]/android.widget.ImageView[1]"    ).click()

3. 粉丝数据抓取

if WebDriverWait(driver, 10).until(    lambda x: x.find_element_by_xpath(        "//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.widget.HorizontalScrollView[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.view.View[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[5]/android.widget.LinearLayout[3]/android.widget.TextView[2]"    )):    driver.find_element_by_xpath(        "//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.widget.HorizontalScrollView[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.view.View[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[5]/android.widget.LinearLayout[3]/android.widget.TextView[2]"    ).click()# 获取屏幕尺寸x1 = int(driver.get_window_size()['width'] * 0.5)y1 = int(driver.get_window_size()['height'] * 0.75)y2 = int(driver.get_window_size()['height'] * 0.25)while True:    if '没有更多了' in driver.page_source:        break    driver.swipe(x1, y1, x1, y2)    time.sleep(0.5)

五、注意事项

  • 性能优化:由于模拟器性能较差,建议使用真机操作,确保USB调试已开启。
  • 代码稳定性:在实际应用中,建议添加异常捕获机制,避免因UI变化导致的脚本失败。
  • 数据存储:将抓取的数据存储到本地数据库中,方便后续分析和处理。

  • 通过以上方法,可以实现抖音数据的自动化抓取,具体实现细节可根据实际需求进一步优化和扩展。

    转载地址:http://tope.baihongyu.com/

    你可能感兴趣的文章
    php运行环境出现Undefined index 或variable时解决方法
    查看>>
    php进程通信
    查看>>
    R&Python Data Science 系列:数据处理(2)
    查看>>
    php递归算法总结
    查看>>
    PHP递归遍历文件夹
    查看>>
    R&Python Data Science 系列:数据处理(1)
    查看>>
    php错误日志文件
    查看>>
    PHP错误解决:Array and string offset access syntax with curly braces is deprecated
    查看>>
    php隐藏手机号中间4位方法总结
    查看>>
    php面向对象三大特征封装、多态、继承
    查看>>
    php面向对象全攻略
    查看>>
    php面向对象的基础题
    查看>>
    php面试题二--解决网站大流量高并发方案(从url到硬盘来解决高并发方案总结)...
    查看>>
    php页面增加自选项,php-在Woocommerce中添加新的自定义默认订购目录选项
    查看>>
    php页面静态化技术;学习笔记
    查看>>
    php项目心得以及总结
    查看>>
    PHP项目集成支付宝PC端扫码支付API(国内支付)
    查看>>
    php预定义常量&变量
    查看>>
    R 集成算法③ 随机森林
    查看>>
    php验证码背景色设置无效
    查看>>