成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

全面超越Appium,使用Airtest超快速開發(fā)App爬蟲

noONE / 1681人閱讀

摘要:代碼運行完成以后,微信被打開了。能不能像前面打開知乎一樣,使用這個屬性呢也行,也不行。滑動屏幕使用的命令為,滑動屏幕需要使用坐標信息。多帶帶使用控制手機在

想開發(fā)網(wǎng)頁爬蟲,發(fā)現(xiàn)被反爬了?想對 App 抓包,發(fā)現(xiàn)數(shù)據(jù)被加密了?不要擔心,使用 Airtest 開發(fā) App 爬蟲,只要人眼能看到,你就能抓到,最快只需要2分鐘,兼容 Unity3D、Cocos2dx-*、Android 原生 App、iOS App、Windows Mobile……。

Airtest是網(wǎng)易開發(fā)的手機UI界面自動化測試工具,它原本的目的是通過所見即所得,截圖點擊等等功能,簡化手機App圖形界面測試代碼編寫工作。

爬蟲開發(fā)本著天下工具為我所用,能讓我獲取數(shù)據(jù)的工具都能用來開發(fā)爬蟲這一信念,決定使用Airtest來開發(fā)手機App爬蟲。

安裝和使用

由于本文的目的是介紹如何使用Airtest來開發(fā)App爬蟲,那么Airtest作為測試開發(fā)工具的方法介紹將會一帶而過,僅僅說明如何安裝并進行基本的操作。

安裝Airtest

從Airtest官網(wǎng):https://airtest.netease.com下載Airtest,然后像安裝普通軟件一樣安裝即可。安裝過程沒有什么需要特別說明的地方。Airtest已經(jīng)幫你打包好了開發(fā)需要的全部環(huán)境,所以安裝完成Airtest以后就能夠直接使用了。

Airtest運行以后的界面如下圖所示。

連接手機

以Android手機為例,由于Airtest會通過adb命令安裝兩個輔助App到手機上,再用adb命令通過控制這兩個輔助App進而控制手機,因此首先需要確保手機的adb調(diào)試功能是打開的,并允許通過adb命令安裝App到手機上。

啟動Airtest以后,把Android手機連接到電腦上,點擊下圖方框中的refresh ADB

此時在Airtest界面右上角應該能夠看到手機的信息,如下圖所示。

點擊connect按鈕,此時可以在界面上看到手機的界面,并且當你手動操作手機屏幕時,Airtest中的手機畫面實時更新。如下圖所示。

對于某些手機,例如小米,在第一次使用Airtest時,請注意手機上將會彈出提示,詢問你是否允許安裝App,此時需要點擊允許按鈕。

打開微信

先通過一個簡單的例子,來看看如何快速上手Airtest,稍后再來詳解。

例如我現(xiàn)在想使用電腦控制手機,打開微信。

此時,點擊下圖中方框框住的touch按鈕:

此時,把鼠標移動到Airtest右邊的手機屏幕區(qū)域,鼠標會變成十字型。在微信圖標的左上角按下鼠標左鍵不放,并拖到微信右下角松開鼠標。此時請注意中間代碼區(qū)域發(fā)生了什么變化,如下圖所示。

好了。以上就是你需要使用電腦打開微信所要進行的全部操作。

點擊上方工具欄中的三角形圖標,運行代碼,如下圖所示。

代碼運行完成以后,微信被打開了。

界面介紹

在有了一個直觀的使用以后,我們再來介紹一下Airtest的界面,將會更加有針對性。

Airtest的界面如下圖所示。

這里,我把Airtest分成了A-F6個區(qū)域,他們的功能如下:

A區(qū):常用操作功能區(qū)

B區(qū):Python代碼編寫區(qū)

C區(qū):運行日志區(qū)

D區(qū):手機屏幕區(qū)

E區(qū):App頁面布局信息查看區(qū)

F區(qū):工具欄

A區(qū)是常用的基于圖像識別的屏幕操作功能,例如:

touch: 點擊屏幕元素

swipe: 滑動屏幕

exists: 判斷屏幕元素是否存在

text: 在輸入框中輸入文字

snashot: 截圖

……

一般來說,是點擊A區(qū)里面的某一個功能,然后在D區(qū)屏幕上進行框選操作,B區(qū)就會自動生成相應的操作代碼。

B區(qū)用來顯示和編寫Python代碼。在多數(shù)情況下,不需要手動寫代碼,因為代碼會根據(jù)你在手機屏幕上面的操作自動生成。只有一些需要特別定制化的動作才需要修改代碼。

D區(qū)顯示了手機屏幕,當你操作手機真機時,這個屏幕會實時刷新。你也可以直接在D區(qū)屏幕上使用鼠標操作手機,你的操作動作會被自動在真機上執(zhí)行。

F區(qū)是一些常用工具,從左到右,依次為:

新建項目

打開項目

保存項目

運行代碼

停止代碼

查看運行報告

其中1-5很好理解,那么什么是查看運行報告呢?

當你至少運行了一次以后,點擊這個功能,會自動給你打開一個網(wǎng)頁。網(wǎng)頁如下圖所示,這是你的代碼的運行報告,詳細到每一步操作了什么元素。

通過截圖功能操作手機雖然方便,但是截圖涉及到分辨率的問題,代碼不能在不同的手機上通用。所以對于A區(qū)的功能,做點簡單操作即可,不用深入了解。

更高級的功能,需要通過E區(qū)實現(xiàn)。

基于App布局信息操作手機 初始化代碼

App的布局信息就像網(wǎng)頁的HTML一樣,保存了App上面各個元素的相對位置和各個參數(shù)。對于一個App而言,在不同分辨率的手機上,可能相同的元素有著不同的坐標點,但是這個元素的屬性參數(shù)一般是不會變的。因此,如果使用元素的屬性參數(shù)來尋找并控制這個元素,就能實現(xiàn)在不同分辨率手機上的精確定位。

App的布局信息的格式與App的開發(fā)環(huán)境有關。點擊F區(qū)的下拉菜單,可以看到這里能夠指定不同的App開發(fā)環(huán)境。其中的Unity、Cocos-*等等一般是做游戲用的,Android是安卓原生App,iOS是蘋果的App……如下圖所示。

以手機版知乎為例,由于它是Android原生的App,所以在F區(qū)下拉菜單選擇Android,此時注意B區(qū)彈出提示,詢問你是否要插入poco初始代碼到當前輸入光標的位置,點擊Yes,如下圖所示。

此時,B區(qū)自動插入了一段代碼,如下圖所示。

定位并點擊

現(xiàn)在,點擊E區(qū)的鎖形圖標,如下圖所示。

鎖形圖標激活以后,你再操作D區(qū)的屏幕,點擊知乎App下面的知乎兩個字,會發(fā)現(xiàn)屏幕上被點擊的App并不會打開。但E區(qū)和C區(qū)卻發(fā)生了變化,如下圖所示。

其中E區(qū)顯示的樹狀結(jié)構(gòu)就是當前屏幕的布局信息,這與Chrome開發(fā)者工具里面顯示的HTML結(jié)構(gòu)如出一轍。C區(qū)顯示的是當前被我點中的元素的信息。

請注意在這些元素信息中,有一個text屬性,它的值為知乎。那么,這個屬性就可以作為一個定位元素,于是可以在B區(qū)編寫代碼:

poco(text="知乎").click()

寫完代碼以后運行程序,可以看到知乎App被打開了。如下圖所示。

注意,如果你發(fā)現(xiàn)手機真機顯示的界面與Airtest屏幕顯示的手機界面不一致,可能是因為Airtest的屏幕被你鎖定了。在F區(qū)點一下鎖形圖標,取消鎖定,Airtest中的手機屏幕就會更新了。
定位并輸入

打開知乎以后,我想使用知乎的搜索功能,那么繼續(xù),把鎖形圖標激活,然后點擊知乎頂部的搜索框,如下圖所示:

繼續(xù)看C區(qū)顯示的搜索框?qū)傩?,可以看到這里有一個name屬性,它的值是com.zhihu.android:id/input,還有一個text屬性,它的值為蔡徐坤任 NBA 新春賀歲大使。能不能像前面打開知乎一樣,使用text這個屬性呢?也行,也不行。說它行,是因為你這么做確實現(xiàn)在能工作;說它不行,因為這是知乎的熱門搜索關鍵詞,隨時會改變。你今天使用這一句話成功了,明天熱門關鍵詞變化了,那么你的代碼就無法使用了。所以此時需要使用name這個屬性。

常見的基本上不會變化的屬性包含但不限于:name type resourceId package。

另外還有一點,知乎首頁的這個搜索框,實際上是不能輸入內(nèi)容的,當你點擊以后,會跳轉(zhuǎn)到另一個頁面,如下圖所示。

因此你需要先點擊一下這個輸入框,跳轉(zhuǎn)到真正的搜索界面:

poco(name="com.zhihu.android:id/input").click()

在真正的搜索界面如下圖所示。

可以看到,name屬性的值依然是com.zhihu.android:id/input,此時就可以輸入內(nèi)容了。

輸入內(nèi)容使用的方法為set_text,用法為:

poco(name="com.zhihu.android:id/input").set_text("古劍奇譚三")
定位并篩選

輸入了搜索關鍵詞以后,再來看看當前頁面,搜索出現(xiàn)了三個結(jié)果:

通過對比這三個結(jié)果的屬性信息,發(fā)現(xiàn)他們的name屬性都是相同的,而text不同。如果像下面這樣寫點擊動作:

poco(name="com.zhihu.android:id/magi_title").click()

那么默認就會點擊第一個搜索結(jié)果。

如果我想點擊第二個搜索結(jié)果怎么辦呢?可以這樣寫代碼:

poco(name="com.zhihu.android:id/magi_title", text="古劍奇譚(電視?。?).click()

或者你也可以像列表一樣使用索引定位:

poco(name="com.zhihu.android:id/magi_title")[1].click()

這兩種寫法的前提,都是我們已經(jīng)知道了每個結(jié)果分別是什么。假設現(xiàn)在我就想搜索古劍奇譚三,但我不知道搜索結(jié)果是第幾項,又應該怎么辦呢?此時還可以使用正則表達式:

poco(name="com.zhihu.android:id/magi_title", textMatches="^古劍奇譚三.*$").click()
滑動屏幕

進入搜索結(jié)果以后,需要查看下面的各種問題,此時就需要不斷向上滑動屏幕。這里有一點需要特別注意,Airtest只能獲取當前屏幕上的元素布局信息,不在屏幕上的內(nèi)容是無法獲取的。這一點和Selenium是不一樣的。

滑動屏幕使用的命令為swipe,滑動屏幕需要使用坐標信息。但這種坐標和屏幕分辨率無關。這里的坐標定義為:(x, y),其中x為橫坐標,y為縱坐標。屏幕左上角為(0, 0),屏幕右下角為(1, 1),從左向右,橫坐標從0逐漸增大到1,從上到下,縱坐標從0逐漸增大到1。

現(xiàn)在我要把屏幕向上滑動,那么在真機上面,我是先按住屏幕下方,然后把屏幕向上滑動,所以代碼可以這樣寫:

# poco.swipe(起點坐標,終點左邊)
poco.swipe([0.5, 0.8], [0.5, 0.2])

方向示意圖如下圖所示:

在一般情況下:

向上滑動,只需要改動縱坐標,且起點值大于終點值

向下滑動,只需要改動縱坐標,且起點值小于終點值

向左滑動,只需要改動橫坐標,且起點值大于終點值

向右滑動,只需要改動橫坐標,且起點值小于終點值

在爬蟲開發(fā)中,涉及到的Airtest操作基本上已經(jīng)介紹完畢。

多帶帶使用Python控制手機

在Airtest操作手機雖然方便,但是不可能在每一臺電腦上都安裝Airtest吧。所以需要想辦法把代碼從Airtest這個程序中分離出來。

Airtest基于Python的一個開源庫Poco開發(fā),而在Airtest的B區(qū)寫的Python代碼,實際上就是Poco的代碼。所以只要安裝Poco庫,就可以在Python中直接控制手機。

安裝Poco庫的命令為:

pip install pocoui

這個庫依賴的東西有點多,安裝稍稍慢一些。安裝完成以后,我們把代碼復制到PyCharm中,如下圖所示。

運行這段代碼,如果是Linux或者macOS的用戶,請注意看運行結(jié)果是不是有報錯,提示adb沒有運行權限。這是因為隨Poco安裝的adb沒有運行權限,需要給它添加權限,在終端執(zhí)行命令:

# chmod +x 報錯信息中給出的adb地址

chmod +x /Users/kingname/.local/share/virtualenvs/ZhihuSpider/lib/python3.7/site-packages/airtest/core/android/static/adb/mac/adb(實際執(zhí)行時請換成你的地址)

命令運行完成以后再次執(zhí)行代碼,可以看到代碼運行成功,手機被成功控制了,如下圖所示。

如何獲取屏幕文字

由于Airtest的編輯器中的代碼運行后無法正常打印出中文,因此后面的代碼都直接在PyCharm中執(zhí)行。

既然要做爬蟲,就需要獲取手機上的文字內(nèi)容?;氐剿阉黜撁?,我想知道“古劍奇譚”三這個關鍵字能搜索出多少條結(jié)果,每條結(jié)果有多少個討論,如下圖所示:

此時我們需要做兩件事情:

分別查看每一個搜索結(jié)果

獲取屏幕上的文字

E區(qū)的樹狀結(jié)構(gòu)如下圖所示:

每一個搜索結(jié)果的標題作為text屬性的值,在name="com.zhihu.android:id/magi_title"對應的元素中;每一個搜索結(jié)果的討論數(shù)作為text屬性的值,在name="com.zhihu.android:id/magi_count"對應的元素中。

最直接的做法就是分別獲取三個標題和三個討論數(shù),然后把它們合并在一起:

title_obj_list = poco(name="com.zhihu.android:id/magi_title")
title_list = [title.get_text() for title in title_obj_list]

discuss_obj_list = poco(name="com.zhihu.android:id/magi_count")
discuss_list = [discuss.get_text() for discuss in discuss_obj_list]

for title, discuss in zip(title_list, discuss_list):
    print(title, discuss)

運行效果如下圖所示:

但是這種做法實際上是很危險的,假設會有某一個很生僻的搜索結(jié)果,只有標題沒有討論數(shù),那么這樣分開抓取再組合的做法,就會導致最后匹配錯位。所以合理的做法是先抓大再抓小。每一組標題和討論數(shù),他們都有自己的父節(jié)點,如下圖箭頭所指向的三個android.widget.LinearLayout:

那么現(xiàn)在,使用先抓大再抓小的技巧,先把每一組結(jié)果的父節(jié)點抓下來,再到每一個結(jié)果里面分別獲取標題和討論數(shù)。

然而這個父節(jié)點又怎么獲取呢?如下圖所示,這個父節(jié)點每一個屬性值都沒有什么特殊的,寫任何一個都有可能與別的節(jié)點撞上。

此時,最簡單的辦法,就是在E區(qū),雙擊父節(jié)點。定位代碼就會自動添加,如下圖所示。

這個定位代碼看起來非常復雜,但實際上它的內(nèi)在邏輯非常簡單,就是從頂層一層一層往下找而已。

自動生成的定位代碼如下:

poco("android.widget.LinearLayout").offspring("com.zhihu.android:id/action_bar_root").offspring("com.zhihu.android:id/parent_fragment_content_id").offspring("android.support.v7.widget.RecyclerView").child("android.widget.LinearLayout")[0]

在這個自動生成的定位代碼中,我們看到了offspring、child這兩種方法。其中child代表子節(jié)點,offspring代表孫節(jié)點、孫節(jié)點的子節(jié)點、孫節(jié)點的孫節(jié)點……。簡言之,使用child只會在子節(jié)點中搜索需要的內(nèi)容,而使用offspring會像文件夾遞歸一樣把里面的所有節(jié)點都遍歷一次,直到找到符合條件的屬性為止。顯然,offspring速度會比child慢。

實際上,我們可以對這個定位代碼做一些精簡:

poco("com.zhihu.android:id/parent_fragment_content_id").offspring("android.support.v7.widget.RecyclerView").child("android.widget.LinearLayout")[0]

這個精簡的方法,與從Chrome復制的XPath中進行精簡是一樣的邏輯,根本原則就是找到“獨一無二”的屬性值,然后用這個屬性值來進行定位。

由于我點擊的是第一個搜索結(jié)果,所以定位代碼的最后有一個[0]?,F(xiàn)在由于需要獲得所有搜索結(jié)果的內(nèi)容,所以應該去掉[0]而使用for循環(huán)展開,然后獲取里面的內(nèi)容:

result_obj = poco("com.zhihu.android:id/parent_fragment_content_id").offspring("android.support.v7.widget.RecyclerView").child("android.widget.LinearLayout")
for result in result_obj:
    title = result.child(name="com.zhihu.android:id/magi_title").get_text()
    count = result.child(name="com.zhihu.android:id/magi_count").get_text()
    print(title, count)

運行效果如下圖所示。

控制多臺手機

當我們在電腦上插入多個Android手機時,執(zhí)行命令:

adb devices -l

運行效果如下圖所示。

每個手機都會被列出來。在最左邊的編號就是手機串號。使用這個串號可以指定多個手機:

from airtest.core.api import auto_setup
from airtest.core.android import Android
from poco.drivers.android.uiautomation import AndroidUiautomationPoco
auto_setup(__file__)

device_1 = Android("76efadf3a7ce4")
device_2 = Android("adfasdfasf23")
device_3 = Android("adifu39ernla")

poco_1 = AndroidUiautomationPoco(device_1, use_airtest_input=True, screenshot_each_action=False)
poco_2 = AndroidUiautomationPoco(device_2, use_airtest_input=True, screenshot_each_action=False)
poco_3 = AndroidUiautomationPoco(device_3, use_airtest_input=True, screenshot_each_action=False)

通過這種方式,在一臺電腦上使用USBHub,連上二三十臺手機是完全沒有問題的。

無線模式

Airtest支持無線模式,不需要USB,只要電腦和手機連接同一個WIFI就能控制:

如果大家對如何開啟無線模式有興趣,請留言,我就會繼續(xù)寫。

搭建手機爬蟲集群

一臺電腦可以連接三十臺手機,那么如果有很多電腦和很多手機,就可以實現(xiàn)手機爬蟲集群,其運行效果如下圖所示。

關于如何搭建爬蟲集群,已經(jīng)超出本文的范圍了。如果大家有興趣,可以閱讀我的書:Python爬蟲開發(fā) 從入門到實戰(zhàn)第十章對于如何搭建手機爬蟲集群有詳細的說明和注意事項。

如果對我的書有興趣,請關注我的微信公眾號與我交流。

文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/43047.html

相關文章

  • 全的App 測試工具大全,收藏這篇就夠了【附帶官網(wǎng)|GitHub地址】

    摘要:三性能測試工具官網(wǎng)介紹騰訊開源的的隨身調(diào)測平臺,支持和。官網(wǎng)介紹騰訊游戲部門開發(fā)的移動全平臺性能測試分析工具平臺。百度的服務目前主要為收費服務。 隨著移動互聯(lián)網(wǎng)的高速發(fā)展,App 應用非?;?,測試工程師也會接觸到各種 app 應用。除了人工測試之外,也可以通過一些測試工具來提高我們的測試效率...

    MRZYD 評論0 收藏0
  • Python自動搶紅包,詳細教程,再也不會錯過微信紅包了!

    摘要:首先要打開微信,進入到指定的群聊,識別微信紅包執(zhí)行搶紅包的動作。是一款基于控件識別的自動化測試框架,目前支持原生原生微信小程序,也可以在其他引擎中自行接入來使用。 showImg(https://segmentfault.com/img/remote/1460000019438856); 目錄:0 引言1 環(huán)境2 需求分析3 前置準備4 搶紅包流程回顧5 代碼梳理6 后記 0 引言 提...

    CoderBear 評論0 收藏0
  • [1054]Airtest的探索使用

    摘要:的框架是網(wǎng)易團隊自己開發(fā)的一個圖像識別框架,這個框架的祖宗就是一種新穎的圖形腳本語言?;静僮鞣椒ǔ丝缙脚_的還有平臺特定的,比如安卓平臺蘋果平臺平臺這里我們來詳細說說這些模塊。 ...

    AndroidTraveler 評論0 收藏0
  • 首次公開,整理12年積累的博客收藏夾,零距離展示《收藏夾吃灰》系列博客

    摘要:時間永遠都過得那么快,一晃從年注冊,到現(xiàn)在已經(jīng)過去了年那些被我藏在收藏夾吃灰的文章,已經(jīng)太多了,是時候把他們整理一下了。那是因為收藏夾太亂,橡皮擦給設置私密了,不收拾不好看呀。 ...

    Harriet666 評論0 收藏0
  • Python3網(wǎng)絡爬蟲實戰(zhàn)---9、APP爬取相關庫的安裝:Appium的安裝

    摘要:支持全平臺的安裝,我們直接從的里面安裝即可,鏈接為。平臺可以下載安裝包如,平臺可以下載安裝包如,平臺可以選擇下載源碼,但是更推薦用下文的安裝方式。上一篇文章網(wǎng)絡爬蟲實戰(zhàn)爬取相關庫的安裝的安裝下一篇文章網(wǎng)絡爬蟲實戰(zhàn)爬蟲框架的安裝 上一篇文章:Python3網(wǎng)絡爬蟲實戰(zhàn)---8、APP爬取相關庫的安裝:MitmProxy的安裝下一篇文章:Python3網(wǎng)絡爬蟲實戰(zhàn)---10、爬蟲框架的安裝...

    caige 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<