




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第python爬蟲之Appium爬取手機(jī)App數(shù)據(jù)及模擬用戶手勢目錄Appium模擬操作屏幕滑動屏幕點擊屏幕拖動屏幕拖拽文本輸入動作鏈實戰(zhàn):爬取微博首頁信息
Appium
在前文的講解中,我們學(xué)會了如何安裝Appium,以及一些基礎(chǔ)獲取App元素內(nèi)容的方式。但認(rèn)真看過前文的讀者,肯定在博主獲取元素的時候觀察到了一個現(xiàn)象。
那就是手機(jī)App的內(nèi)容并不是一次性加載出來的,比如大多數(shù)Android手機(jī)列表ListView,都是異步加載,也就是你滑動到那個位置,它才會顯示出它的內(nèi)容。
也就是說,我們前面爬取微博首頁全部信息的時候,如果你不滑動先加載一定的微博內(nèi)容,也就如上圖所示,只能獲取2個微博內(nèi)容。
模擬操作
所以,我們要實戰(zhàn)獲取微博內(nèi)容的話,首先你需要學(xué)會如何模擬滑動屏幕操作。下面,我們來一一介紹屏幕的互動操作。
屏幕滑動
在Python的Appium-Python-Client包中,我們通過swipe()函數(shù)模擬用戶手勢從A滑動到B點,其具體的方法定義如下所示:
defswipe(self:T,start_x:int,start_y:int,end_x:int,end_y:int,duration:int=0)-T
start_x:開始位置的橫坐標(biāo)
start_y:開始位置的縱坐標(biāo)
end_x:結(jié)束位置的橫坐標(biāo)
end_y:結(jié)束位置的縱坐標(biāo)
duration:持續(xù)時間,也就是處于距離后生成滑動速度
當(dāng)然,滑動的方法還有一個:flick(),它只有4個參數(shù),缺少duration參數(shù),也就是快速從某個位置滑動到指定的位置。
示例代碼:
fromappiumimportwebdriver
importtime
server="http://localhost:4723/wd/hub"
desired_caps={
"platformName":"Android",
"deviceName":"liyuanjing",
"appPackage":"com.sina.weibo",
"appActivity":"com.sina.weibo.MainTabActivity",
driver=webdriver.Remote(server,desired_caps)
time.sleep(5)
el1=driver.find_element_by_id("com.android.permissioncontroller:id/permission_allow_button")
el1.click()
time.sleep(5)
driver.swipe(500,500,500,2000,3000)
上面代碼實現(xiàn)的下拉屏幕刷新功能,下拉刷新其實也是一個滑動的操作,是先滑動一段距離然后松開。
當(dāng)然,如果你要實現(xiàn)上滑加載更多的微博,可以直接將坐標(biāo)顛倒過來即可,這里我們將方法替換成flick(),也就是只需要替換最后一行代碼。
driver.flick(487,2085,513,257)
不過,這里有一個非常顯著的問題,手機(jī)的坐標(biāo)到底寬高都是多少呢?雖然說,我們程序員什么都通過代碼先解決不要一上來就用工具。
但博主想說,這種坐標(biāo)每個手機(jī)的像素分辨率都不同,比如上面swipe就是博主猜測的坐標(biāo)。而flick()博主試了半天,沒弄出來,最后還是借助Appium生成坐標(biāo)給我。
如上圖所示,我們先點擊藍(lán)色選框中像“一橫”的圖標(biāo),然后記得點錄制“眼睛”按鈕。接著,在App上拉兩個點,這2個點就是滑動的間距,最后生成如下圖所示的代碼。
這里就有2個坐標(biāo),當(dāng)然上面的代碼是動作鏈的知識后面我們會講解。這里我們需要copy這2個坐標(biāo)到flick()方法中,然后就可以下滑微博加載數(shù)據(jù)。
至于加載微博的動圖與下滑微博的動圖,大家都玩過微博,這里不需要演示。
屏幕點擊
以前的微博都是限制為140字,你不需要打開微博詳情,也能看到微博的所有數(shù)據(jù)。但是自從長微博出現(xiàn)之后,有些微博還必須點擊進(jìn)去才能看完整。
同樣,我們爬取這些數(shù)據(jù),有時候也要點擊進(jìn)去才能完全獲取長微博的數(shù)據(jù)。所以,我們需要掌握如何點擊某個微博。
在Appium包中,我們點擊微博使用的是:tap()方法。該方法不僅支持單指點擊,而且最多可以支持5個手指,同時也可以設(shè)置點擊的時長。具體定義如下:
deftap(self:T,positions:List[Tuple[int,int]],duration:Optional[int]=None)-T
positions:點擊的位置組成的列表,比如五個手指,那就是5個坐標(biāo)值的列表
duration:點擊持續(xù)的時間,時間短就是點擊操作,時間長就是長按操作
示例代碼如下:
el2=driver.tap([(500,500)])
el2.click()
不過,這里有讀者肯定會問,每條微博的我難道用坐標(biāo)取定位?那是怎么區(qū)分你點的是哪條微博,畢竟一個頁面最少也有2條微博。這里,我們先來看張圖:
這里,博主點擊的是第2條微博數(shù)據(jù),可以看到其id就是微博的內(nèi)容。所以,后面我們想要獲取微博的詳細(xì)內(nèi)容,可以直接通過獲取內(nèi)容后在點擊。
屏幕拖動
看到這個小標(biāo)題,博主都有寫困惑。拖動與滑動是不是差不多的?
還別說,博主覺得還真差不多,不過這2個在Appium包中的方法卻不一樣,前文的滑動時通過坐標(biāo)進(jìn)行定位的,這里的拖動是通過元素定位的。
比如,你需要你滑動的距離是一個按鈕到另一個按鈕的位置,我們可以直接獲取到這2個按鈕,然后使用scroll()方法實現(xiàn)滑動操作。其定義如下:
defscroll(self:T,origin_el:WebElement,destination_el:WebElement,duration:Optional[int]=None)-T
origin_el:被操作的元素
destination_el:目標(biāo)元素
duration:持續(xù)時間
這里就不演示了,就是獲取元素位置然后拖動到指定元素的位置。與前文實現(xiàn)的效果差不多,只是將坐標(biāo)變成了2個元素的位置。
屏幕拖拽
同樣的,微博不好演示的還有拖拽操作。它的方法為drag_and_drop(),其定義如下:
defdrag_and_drop(self:T,origin_el:WebElement,destination_el:WebElement)-T
origin_el:被拖拽的元素
destination_el:目標(biāo)元素
這里的拖拽你可以理解為將一個按鈕元素拖動到另一個按鈕的位置,這里拖拽的是元素本身,不是位置的滑動。微博中暫時也沒有演示的操作,感興趣的可以測試其他App。
文本輸入
在模擬登錄或者說這里發(fā)微博的時候,用戶肯定需要模擬輸入文本。而且,在需要登錄的爬蟲場景之下,登錄都是必備步驟。比如微信朋友圈內(nèi)容的爬取,你不登陸看得到朋友圈嗎?
所以,我們需要掌握Appium的文本輸入操作。而它提供了2個方法進(jìn)行文本的輸入,一個是set_text();一個是send_keys()。
現(xiàn)在我們模擬微博輸入賬號,示例代碼如下:
fromappiumimportwebdriver
importtime
fromselenium.webdriver.support.uiimportWebDriverWait
frommon.byimportBy
fromselenium.webdriver.supportimportexpected_conditionsasec
server="http://localhost:4723/wd/hub"
desired_caps={
"platformName":"Android",
"deviceName":"liyuanjing",
"appPackage":"com.sina.weibo",
"appActivity":"com.sina.weibo.MainTabActivity",
driver=webdriver.Remote(server,desired_caps)
wait=WebDriverWait(driver,20)
time.sleep(5)
el1=driver.find_element_by_id("com.android.permissioncontroller:id/permission_allow_button")
el1.click()
el2=wait.until(ec.presence_of_element_located((By.ID,'com.sina.weibo:id/titleBack')))
el2.click()
el3=wait.until(ec.presence_of_element_located((By.ID,'com.sina.weibo:id/et_login_view_phone')))
el3.send_keys("liyuanjinglyj@163.com")
這里,我們只是模擬輸入文本,當(dāng)然登錄用戶名是手機(jī),但手機(jī)屬于隱私。博主這里替換成郵箱。感興趣的可以自己替換手機(jī)試試。同時也可以替換為send_text()方法。
動作鏈
動作鏈顧名思義就是一系列操作動作的組合。在Selenium中,動作鏈?zhǔn)茿ctionChains,而Appium中,動作鏈?zhǔn)荰ouchAction。
比如,我們執(zhí)行的下拉刷新其實就是一個動作鏈。這里,我們會執(zhí)行2個動作,一個是按壓,一個是從指定位置滑動到另一個位置。這里,我們將2個動作組合實現(xiàn):
TouchAction(driver).press(x=380,y=2101).move_to(x=390,y=519).release()
實戰(zhàn):爬取微博首頁信息
其實,Appium開始推出的時候,是為了自動化測試
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- T/CI 477-2024石油化工企業(yè)數(shù)字化碳排放管理體系建設(shè)指南
- T/CSPSTC 130-2024花崗巖地區(qū)建筑邊坡工程勘察規(guī)范
- 上海安全員c證考試試題及答案
- 上汽汽車認(rèn)識試題及答案
- 寫字間長期租用合同3篇
- T/CCOA 78-2023濃香菜籽油生產(chǎn)技術(shù)規(guī)范
- 院內(nèi)創(chuàng)傷急救流程
- 曲柄滑塊機(jī)構(gòu)課程設(shè)計
- T/ZHCA 027-2023化妝品個性化服務(wù)指南
- 永安公園景觀設(shè)計方案
- 瀝青路面施工旁站監(jiān)理記錄表多篇
- 派出所轄區(qū)治安形勢分析報告(通用6篇)
- DN900鋼管dn800PE管定向鉆穿越京杭大運(yùn)河施工方案
- 養(yǎng)老地產(chǎn)項目區(qū)域綜合開發(fā)新模式_secret
- 員工手冊070509
- 羅斯公司理財Chap004全英文題庫及答案
- 工業(yè)固體廢物綜合利用項目建議書范文
- 雍布拉康課件
- 英威騰高壓變頻器CHH100說明書_圖文
- 可研收費(fèi)標(biāo)準(zhǔn)[1999]1283號文
- --高考生物必備復(fù)習(xí)資料梳理(精選)
評論
0/150
提交評論