另辟蹊径,appium抓取app应用数据了解一下!uiautomotor2 && mitmproxy && elasticsearch && kibana (二)

本文详细介绍如何使用Appium自动化工具抓取京东App的商品数据,涵盖环境搭建、参数配置、自动化脚本编写及数据抓取全流程。

接上一篇  https://blog.youkuaiyun.com/sirobot/article/details/106918774

作为爬虫工程师,你一定知道selenium

什么是selenium?

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

今天,我们来介绍另一款自动化测试工具,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就会根据不同的指令对移动设备进行驱动,完成不同的动作。

一、本节目标

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

二、准备工作

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

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

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

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

数据存储用数据库为Mongodb

adb连接夜神模拟器与adb常用操作命令

adb connect 127.0.0.1:62001

adb kill-server
在关闭adb服务后,要使用如下的命令启动adb服务。
adb start-server
more than one device/emulator
taskkill /f /im adb.exe
adb uninstall com.xgh.sport
adb install ydfsq0309.apk
adb install -r Sport.apk

640*300

dumpsys meminfo 包名
procrank

转载于:https://www.cnblogs.com/51testing/p/6742460.html

三、获取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
import time
desired_caps={}
desired_caps['platformName']='Android'
desired_caps['platformVersion']='5.1.1'
desired_caps['deviceName']='172.20.1.194: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://172.20.1.194:4723/wd/hub', desired_caps)

六、运行代码启动app

 

 

【Android】【问题解决记录】Error obtaining UI hierarchy :Error while obtaining UI hierarchy XML file: com.android.ddmlib.SyncException: Remote object doesn't exist!

关闭appium  重新运行  uiAutomatorviewer  正常

 https://blog.youkuaiyun.com/sirobot/article/details/106939490

Android Sdk manager  安装和 真机或者模拟机同版本的android系统

https://www.cnblogs.com/lilip/p/11089713.html

 

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

图片描述

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

答案是使用uiautomatorviewer

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

七、编写自动化代码

from appium import webdriver
import time
desired_caps={}
desired_caps['platformName']='Android'
desired_caps['platformVersion']='5.1.1'
desired_caps['deviceName']='172.20.1.194: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://172.20.1.194:4723/wd/hub', desired_caps)

#等待app启动
time.sleep(10)
#关闭广告,如果有

# close_ad=driver.find_element_by_xpath("//android.widget.TextView[@resource-id='com.jingdong.app.mall:id/sq")
close_ad=driver.find_element_by_xpath("//android.widget.FrameLayout[1]/android.widget.ImageView[1]")
if close_ad:
# 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()
# #点击搜索
time.sleep(10)
select_search=driver.find_element_by_xpath("//android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.widget.TextView[1]").click()
# select_search=driver.find_element_by_xpath("//android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.widget.TextView[1]").click()
#输入关键字
time.sleep(10)
key='笔记本电脑'
#判断是否输入文字
while True:
    if driver.find_element_by_xpath("//android.widget.FrameLayout[1]/android.widget.EditText[1]").text!=key:
        select_keyword=driver.find_element_by_xpath("//android.widget.FrameLayout[1]/android.widget.EditText[1]").send_keys(key)
    else:
        break
#点击搜索
time.sleep(10)
driver.find_element_by_xpath("//android.widget.FrameLayout[1]/android.widget.TextView[1]").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 R'jd.com/product' in flow.request.url:
        print(flow.response.text)
        # response_dict=json.loads(flow.response.text)
        # print(response_dict,"*"*100,flow.request.url)
        # if 'wareInfo' in response_dict:
        #     for i in response_dict['wareInfo']:
        #         mongo_info.insert_data(i)

# response()
def request(flow):
    flow.request.headers['User-Agent'] = 'MitmProxy'
    print(flow.request.headers,">"*10)

# 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()

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



# 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,解析数据!

进行  mitmproxy证书安装  即可。

先进入开发者模式    连续点击版本好7次  进入,  还需要设置密码或pin 

证书配置过程中的问题
大致过程安装崔大大博客里介绍的安装即可,有几条提醒的:

在这里插入图片描述

证书位置(其中文中标记的位.p12文件):

手机安装证书的方式:
首先将证书直接拖拽至夜神模拟器中,然后安装以下步骤安装:

在这里插入图片描述
原文链接:https://blog.youkuaiyun.com/weixin_42964610/article/details/97368211

然后配置模拟器的端口设置----WLAN,如下图所示:长按WiredSSID 三秒

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

启动mitmdump:

mitmdump -p 8889 -s decode_jingdong.py

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

python jingdong.py

十三、查看数据

图片描述

 

更多精彩内容详见python爬虫工程师必学,app数据抓取实战

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值