Python教程教你抓取app应用数据了解一下

    作者:千锋python学院 更新于: 2019-12-10 11:41:11

    大神带你学编程,欢迎选课

    Python学下教程:另辟蹊径,appium抓取app应用数据了解一下。Python的创始人为Guido van Rossum。1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,作为ABC 语言的一种继承。

    作为爬虫工程师,没有价格不知道selenium的。

    什么是selenium?

    Selenium原本是一个用于Web应用程序自动化测试工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。我们爬虫工程师使用selenium来抓取动态web页面。

    今天的Python学习教程我们来介绍另一款自动化测试工具,Appium。

    Appium官方文档

    https://github.com/DoctorQ/appium/blob/master/docs/en/about-appium/intro.md

    什么是Appium?

    Appium是一个移动端的自动化框架,可用于测试原生应用,移动网页应用和混合型应用,且是跨平台的。可用于IOS和Android以及firefox的操作系统。

    原生的应用是指用android或ios的sdk编写的应用

    移动网页应用是指网页应用,类似于ios中safari应用或者Chrome应用或者类浏览器的应用。

    混合应用是指一种包裹webview的应用,原生应用于网页内容交互性的应用。

    重要的是Appium是跨平台的,何为跨平台,意思就是可以针对不同的平台用一套api来编写测试用例。

    同样的Appium原本是一个用于app应用自动化测试工具,我们爬虫工程师也可以利用它,在抓取app应用数据。

    Appium相当于一个服务器,我们可以向Appium发送一些操作指令,Appium就会根据不同的指令对移动设备进行驱动,完成不同的动作。

    一、本次Python学习教程的目的:

    我们以Android平台的手机京东为例来演示Appium启动和操作App的方法,最终实现抓取手机京东商品数据。

    二、准备工作

    确保PC已经安装好Appium,本实例在windows环境下安装,安装的appium版本为Appium-Desktop

    安装好Android开发环境,uiautomatorviewer工具(必须)、python开发环境和Python版本的Appium API(Appium-Python-Client)

    android模拟器(夜神模拟器)安装好手机京东app

    确保PC上已安装好mitmproxy抓包工具(必须)、fiddler抓包工具(非必须)

    数据存储用数据库为Mongodb

    三、获取Appium-Desktop使用的关键参数(Desired Capabilities参数)

    Desired Capabilities参数:它们分别是platformName、deviceName、appPackage、appActivity。

    platformName:它是平台名称,需要区分Android或iOS,我们使用的是android平台,因此为Android。

    deviceName:它是设备名称,此处是手机的具体类型,deviceName可以通过adb devices命令获取。

     

    此处注意:模拟器显示为127.0.0.1,真实手机与模拟器显示不同,真实手机为一串字母数据结合

    appPackage:它是App程序包名,该参数可以在adb shell中使用logcat获取。

     

    命令后回车

    随后,打开android模拟器中的手机京东app

    在adb shell中,我们可以获取到appPackage和appActivity

    appActivity:它是入口Activity名,这里通常需要以 . 开头,该参数可以在adb shell中使用logcat获取。

    其中:

    appPackage为:com.jingdong.app.mall

    appActivity为:com.jingdong.app.mall.MainFrameActivity

    获取到Appium-Desktop使用的关键参数(Desired Capabilities参数)后,我们就可以启动Appium-Desktop了

    四、启动Appium-Desktop服务器

     

    确认appium-desktop启动成功后,我们就可以编写代码了

    五、编写app启动代码

    from appium import webdriver
    desired_caps = {}
    desired_caps['platformName'] = 'Android'
    desired_caps['platformVersion'] = '4.4.2'
    desired_caps['deviceName'] = '192.168.54.56:62001'
    desired_caps['appPackage'] = 'com.jingdong.app.mall'
    desired_caps['appActivity'] = 'com.jingdong.app.mall.MainFrameActivity'
    desired_caps['unicodeKeyboard'] = True
    desired_caps['resetKeyboard'] = True
    #启动appium-desktop服务器,服务器IP根据实际填写
    driver = webdriver.Remote('http://192.168.54.56:4723/wd/hub', desired_caps)

    六、运行代码启动app

     

    确认手机京东app启动成功,并且无报错后,我们就可以编写自动化代码来控制app行为了

    如何来定位app内部控件节点呢

    答案是使用uiautomatorviewer

     

    通过获取控件的xpath,我们就可以定位到app控件了

    七、编写自动化代码

    #等待app启动
    time.sleep(5)
    #关闭广告,如果有
    close_ad = driver.find_element_by_xpath("//android.widget.TextView[@resource-id='com.jingdong.app.mall:id/sq']")
    if close_ad:
    close_ad.click()
    #点击分类
    select_fenlei = driver.find_element_by_xpath("//android.widget.RadioGroup[@resource-id='com.jingdong.app.mall:id/tf']/android.widget.RadioButton[2]").click()
    #点击搜索
    select_search = driver.find_element_by_xpath("//android.widget.ImageView[@resource-id='com.jingdong.app.mall:id/xo']").click()
    #输入关键字
    key = '笔记本电脑'
    #判断是否输入文字
    while True:
    if driver.find_element_by_xpath("//android.widget.EditText[@resource-id='com.jingdong.app.mall:id/xp']").text != key:
    select_keyword = driver.find_element_by_xpath("//android.widget.EditText[@resource-id='com.jingdong.app.mall:id/xp']").send_keys(key)
    else:
    break
    #点击搜索
    driver.find_element_by_xpath("//android.widget.Button[@resource-id='com.jingdong.app.mall:id/el1']").click()
    time.sleep(1)
    start_x = 500
    start_y = 900
    distance = 800
    #模拟手机端滑动
    while True:
    driver.swipe(start_x,start_y,start_x,start_y-distance)
    time.sleep(0.2)
    if '抱歉,没有更多商品啦' in driver.page_source:
    break

    自动化代码编写完成之后,运行一下,看是否有问题,如无问题,就可以进行下一步了

    八、抓取应用数据包

    这里,我们通过fiddler抓包工具获取到手机京东的数据包

     

    查看response,确实是我们想要的数据,接下来就可以编写解析响应数据代码了

    九、编写解析响应数据代码

    import json
    from save_data import mongo_info
    def response(flow):
    if 'client.action?functionId=search&clientVersion=5.3.0' in flow.request.url:
    response_dict = json.loads(flow.response.text)
    if 'wareInfo' in response_dict:
    for i in response_dict['wareInfo']:
    mongo_info.insert_data(i)

    十、编写数据存储逻辑代码

    import pymongo
    from pymongo.collection import Collection
    class Connect_mongo(object):
    def __init__(self):
    self.client = pymongo.MongoClient(host='192.168.54.41',port=27017,connect=False)
    self.db_data = self.client['jingdong']
    def insert_data(self,item):
    collections = Collection(self.db_data,'jingdong_data')
    collections.insert(item)
    mongo_info = Connect_mongo()

    十一、启动mitmdump,解析数据!

    注意:手机或模拟器一定要设置mitmdump服务器IP的代理

    启动mitmdump:

    mitmdump -p 8889 -s decode_jingdong.py

    十二、接下来,启动自动化控制脚本就可以抓取到数据了

    python jingdong.py

    十三、查看数据

     

    更多的Python学下教程也会继续为大家更新!

    由于Python语言的简洁性、易读性以及可扩展性,在国外用Python做科学计算的研究机构日益增多,一些知名大学已经采用Python来教授程序设计课程。

课课家教育

未登录