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

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

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

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


一、操作步骤

1. 模拟器配置

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

  • 取消模拟器代理:通过命令adb devices查看设备列表,确保模拟器已正确连接。
  • 下载抖音APK:从官方渠道下载最新版本的抖音APK文件。
  • 查看APK信息:通过aapt dump badging命令获取appPackage和appActivity信息。例如:
    • 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/

    你可能感兴趣的文章
    python-类思想-实现简单增删查改
    查看>>
    python-网络编程
    查看>>
    python写入文件出现空行
    查看>>
    PYTHON-返回给定x的多边形路径的y坐标
    查看>>
    python-进程池与线程池,协程
    查看>>
    Python-通过函数传递变量
    查看>>
    Python内置函数详解——总结篇
    查看>>
    Python.对象集合中的标识.和散列
    查看>>
    Python.硒.拖放错误“AttributeError:move_to 需要 WebElement“
    查看>>
    Python内置函数详解
    查看>>
    Python/Kivy:从一个类调用函数到另一个类并在 Python 中显示小部件
    查看>>
    Python/Kivy:我可以在双击标签时调用函数吗
    查看>>
    python内置函数5-frozenset()
    查看>>
    Python/Plotly:如何使用要显示的信息自定义悬停模板?
    查看>>
    Python/Selenium - 无法单击 www.instagram.com 上的“接受 cookie“按钮
    查看>>
    Python内置函数(35)——next
    查看>>
    python写入mysql
    查看>>
    python写入csv老是乱码或者各种不好
    查看>>
    Python内置函数
    查看>>
    Python2 安装MySQLdb库
    查看>>