溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python中如何利用appium抓取app應用數(shù)據(jù)

發(fā)布時間:2021-10-26 10:53:03 來源:億速云 閱讀:568 作者:柒染 欄目:編程語言

今天就跟大家聊聊有關Python中如何利用appium抓取app應用數(shù)據(jù),可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據(jù)這篇文章可以有所收獲。

什么是selenium?

Selenium原本是一個用于Web應用程序自動化測試工具。Selenium測試直接運行在瀏覽器中,就像真正的用戶在操作一樣。支持的瀏覽器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。我們爬蟲工程師使用selenium來抓取動態(tài)web頁面。

今天的Python學習教程我們來介紹另一款自動化測試工具,Appium。

Appium官方文檔

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

什么是Appium?

Appium是一個移動端的自動化框架,可用于測試原生應用,移動網(wǎng)頁應用和混合型應用,且是跨平臺的??捎糜贗OS和Android以及firefox的操作系統(tǒng)。

原生的應用是指用android或ios的sdk編寫的應用

移動網(wǎng)頁應用是指網(wǎng)頁應用,類似于ios中safari應用或者Chrome應用或者類瀏覽器的應用。

混合應用是指一種包裹webview的應用,原生應用于網(wǎng)頁內容交互性的應用。

重要的是Appium是跨平臺的,何為跨平臺,意思就是可以針對不同的平臺用一套api來編寫測試用例。

同樣的Appium原本是一個用于app應用自動化測試工具,我們爬蟲工程師也可以利用它,在抓取app應用數(shù)據(jù)。

Appium相當于一個服務器,我們可以向Appium發(fā)送一些操作指令,Appium就會根據(jù)不同的指令對移動設備進行驅動,完成不同的動作。

一、本次Python學習教程的目的:

我們以Android平臺的手機京東為例來演示Appium啟動和操作App的方法,最終實現(xiàn)抓取手機京東商品數(shù)據(jù)。

二、準備工作

確保PC已經(jīng)安裝好Appium,本實例在windows環(huán)境下安裝,安裝的appium版本為Appium-Desktop

安裝好Android開發(fā)環(huán)境,uiautomatorviewer工具(必須)、python開發(fā)環(huán)境和Python版本的Appium API(Appium-Python-Client)

android模擬器(夜神模擬器)安裝好手機京東app

確保PC上已安裝好mitmproxy抓包工具(必須)、fiddler抓包工具(非必須)

數(shù)據(jù)存儲用數(shù)據(jù)庫為Mongodb

三、獲取Appium-Desktop使用的關鍵參數(shù)(Desired Capabilities參數(shù))

Desired Capabilities參數(shù):它們分別是platformName、deviceName、appPackage、appActivity。

platformName:它是平臺名稱,需要區(qū)分Android或iOS,我們使用的是android平臺,因此為Android。

deviceName:它是設備名稱,此處是手機的具體類型,deviceName可以通過adb devices命令獲取。

Python中如何利用appium抓取app應用數(shù)據(jù)

此處注意:模擬器顯示為127.0.0.1,真實手機與模擬器顯示不同,真實手機為一串字母數(shù)據(jù)結合

appPackage:它是App程序包名,該參數(shù)可以在adb shell中使用logcat獲取。

Python中如何利用appium抓取app應用數(shù)據(jù)

命令后回車

隨后,打開android模擬器中的手機京東app

在adb shell中,我們可以獲取到appPackage和appActivity

Python中如何利用appium抓取app應用數(shù)據(jù)

appActivity:它是入口Activity名,這里通常需要以 . 開頭,該參數(shù)可以在adb shell中使用logcat獲取。

其中:

appPackage為:com.jingdong.app.mall

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

獲取到Appium-Desktop使用的關鍵參數(shù)(Desired Capabilities參數(shù))后,我們就可以啟動Appium-Desktop了

四、啟動Appium-Desktop服務器

Python中如何利用appium抓取app應用數(shù)據(jù)

Python中如何利用appium抓取app應用數(shù)據(jù)

確認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根據(jù)實際填寫
driver = webdriver.Remote('http://192.168.54.56:4723/wd/hub', desired_caps)

六、運行代碼啟動app

Python中如何利用appium抓取app應用數(shù)據(jù)

確認手機京東app啟動成功,并且無報錯后,我們就可以編寫自動化代碼來控制app行為了

如何來定位app內部控件節(jié)點呢

答案是使用uiautomatorviewer

Python中如何利用appium抓取app應用數(shù)據(jù)

通過獲取控件的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

自動化代碼編寫完成之后,運行一下,看是否有問題,如無問題,就可以進行下一步了

八、抓取應用數(shù)據(jù)包

這里,我們通過fiddler抓包工具獲取到手機京東的數(shù)據(jù)包

Python中如何利用appium抓取app應用數(shù)據(jù)

查看response,確實是我們想要的數(shù)據(jù),接下來就可以編寫解析響應數(shù)據(jù)代碼了

九、編寫解析響應數(shù)據(jù)代碼

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)

十、編寫數(shù)據(jù)存儲邏輯代碼

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,解析數(shù)據(jù)!

注意:手機或模擬器一定要設置mitmdump服務器IP的代理

啟動mitmdump:

mitmdump -p 8889 -s decode_jingdong.py

十二、接下來,啟動自動化控制腳本就可以抓取到數(shù)據(jù)了

python jingdong.py

十三、查看數(shù)據(jù)

Python中如何利用appium抓取app應用數(shù)據(jù)

看完上述內容,你們對Python中如何利用appium抓取app應用數(shù)據(jù)有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI