校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁(yè) > 知識(shí)庫(kù) > python爬蟲之Appium爬取手機(jī)App數(shù)據(jù)及模擬用戶手勢(shì)

python爬蟲之Appium爬取手機(jī)App數(shù)據(jù)及模擬用戶手勢(shì)

熱門標(biāo)簽:地圖標(biāo)注多個(gè) B52系統(tǒng)電梯外呼顯示E7 高德地圖標(biāo)注收入咋樣 銀川電話機(jī)器人電話 企業(yè)微信地圖標(biāo)注 萊蕪電信外呼系統(tǒng) 鶴壁手機(jī)自動(dòng)外呼系統(tǒng)違法嗎 沈陽(yáng)防封電銷電話卡 怎么辦理400客服電話

Appium

在前文的講解中,我們學(xué)會(huì)了如何安裝Appium,以及一些基礎(chǔ)獲取App元素內(nèi)容的方式。但認(rèn)真看過(guò)前文的讀者,肯定在博主獲取元素的時(shí)候觀察到了一個(gè)現(xiàn)象。

那就是手機(jī)App的內(nèi)容并不是一次性加載出來(lái)的,比如大多數(shù)Android手機(jī)列表ListView,都是異步加載,也就是你滑動(dòng)到那個(gè)位置,它才會(huì)顯示出它的內(nèi)容。

也就是說(shuō),我們前面爬取微博首頁(yè)全部信息的時(shí)候,如果你不滑動(dòng)先加載一定的微博內(nèi)容,也就如上圖所示,只能獲取2個(gè)微博內(nèi)容。

模擬操作

所以,我們要實(shí)戰(zhàn)獲取微博內(nèi)容的話,首先你需要學(xué)會(huì)如何模擬滑動(dòng)屏幕操作。下面,我們來(lái)一一介紹屏幕的互動(dòng)操作。

屏幕滑動(dòng)

在Python的Appium-Python-Client包中,我們通過(guò)swipe()函數(shù)模擬用戶手勢(shì)從A滑動(dòng)到B點(diǎn),其具體的方法定義如下所示:

def swipe(self: T, start_x: int, start_y: int, end_x: int, end_y: int, duration: int = 0) -> T

start_x:開(kāi)始位置的橫坐標(biāo)

start_y:開(kāi)始位置的縱坐標(biāo)

end_x:結(jié)束位置的橫坐標(biāo)

end_y:結(jié)束位置的縱坐標(biāo)

duration:持續(xù)時(shí)間,也就是處于距離后生成滑動(dòng)速度

當(dāng)然,滑動(dòng)的方法還有一個(gè):flick(),它只有4個(gè)參數(shù),缺少duration參數(shù),也就是快速?gòu)哪硞€(gè)位置滑動(dòng)到指定的位置。

示例代碼:

from appium import webdriver
import time

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)

上面代碼實(shí)現(xiàn)的下拉屏幕刷新功能,下拉刷新其實(shí)也是一個(gè)滑動(dòng)的操作,是先滑動(dòng)一段距離然后松開(kāi)。

當(dāng)然,如果你要實(shí)現(xiàn)上滑加載更多的微博,可以直接將坐標(biāo)顛倒過(guò)來(lái)即可,這里我們將方法替換成flick(),也就是只需要替換最后一行代碼。

driver.flick(487, 2085, 513, 257)

不過(guò),這里有一個(gè)非常顯著的問(wèn)題,手機(jī)的坐標(biāo)到底寬高都是多少呢?雖然說(shuō),我們程序員什么都通過(guò)代碼先解決不要一上來(lái)就用工具。

但博主想說(shuō),這種坐標(biāo)每個(gè)手機(jī)的像素分辨率都不同,比如上面swipe就是博主猜測(cè)的坐標(biāo)。而flick()博主試了半天,沒(méi)弄出來(lái),最后還是借助Appium生成坐標(biāo)給我。

如上圖所示,我們先點(diǎn)擊藍(lán)色選框中像“一橫”的圖標(biāo),然后記得點(diǎn)錄制“眼睛”按鈕。接著,在App上拉兩個(gè)點(diǎn),這2個(gè)點(diǎn)就是滑動(dòng)的間距,最后生成如下圖所示的代碼。

這里就有2個(gè)坐標(biāo),當(dāng)然上面的代碼是動(dòng)作鏈的知識(shí)后面我們會(huì)講解。這里我們需要copy這2個(gè)坐標(biāo)到flick()方法中,然后就可以下滑微博加載數(shù)據(jù)。

至于加載微博的動(dòng)圖與下滑微博的動(dòng)圖,大家都玩過(guò)微博,這里不需要演示。

屏幕點(diǎn)擊

以前的微博都是限制為140字,你不需要打開(kāi)微博詳情,也能看到微博的所有數(shù)據(jù)。但是自從長(zhǎng)微博出現(xiàn)之后,有些微博還必須點(diǎn)擊進(jìn)去才能看完整。

同樣,我們爬取這些數(shù)據(jù),有時(shí)候也要點(diǎn)擊進(jìn)去才能完全獲取長(zhǎng)微博的數(shù)據(jù)。所以,我們需要掌握如何點(diǎn)擊某個(gè)微博。

在Appium包中,我們點(diǎn)擊微博使用的是:tap()方法。該方法不僅支持單指點(diǎn)擊,而且最多可以支持5個(gè)手指,同時(shí)也可以設(shè)置點(diǎn)擊的時(shí)長(zhǎng)。具體定義如下:

def tap(self: T, positions: List[Tuple[int, int]], duration: Optional[int] = None) -> T

positions:點(diǎn)擊的位置組成的列表,比如五個(gè)手指,那就是5個(gè)坐標(biāo)值的列表

duration:點(diǎn)擊持續(xù)的時(shí)間,時(shí)間短就是點(diǎn)擊操作,時(shí)間長(zhǎng)就是長(zhǎng)按操作

示例代碼如下:

el2 = driver.tap([(500,500)])
el2.click()

不過(guò),這里有讀者肯定會(huì)問(wèn),每條微博的我難道用坐標(biāo)取定位?那是怎么區(qū)分你點(diǎn)的是哪條微博,畢竟一個(gè)頁(yè)面最少也有2條微博。這里,我們先來(lái)看張圖:

這里,博主點(diǎn)擊的是第2條微博數(shù)據(jù),可以看到其id就是微博的內(nèi)容。所以,后面我們想要獲取微博的詳細(xì)內(nèi)容,可以直接通過(guò)獲取內(nèi)容后在點(diǎn)擊。

屏幕拖動(dòng)

看到這個(gè)小標(biāo)題,博主都有寫困惑。拖動(dòng)與滑動(dòng)是不是差不多的?

還別說(shuō),博主覺(jué)得還真差不多,不過(guò)這2個(gè)在Appium包中的方法卻不一樣,前文的滑動(dòng)時(shí)通過(guò)坐標(biāo)進(jìn)行定位的,這里的拖動(dòng)是通過(guò)元素定位的。

比如,你需要你滑動(dòng)的距離是一個(gè)按鈕到另一個(gè)按鈕的位置,我們可以直接獲取到這2個(gè)按鈕,然后使用scroll()方法實(shí)現(xiàn)滑動(dòng)操作。其定義如下:

def scroll(self: T, origin_el: WebElement, destination_el: WebElement, duration: Optional[int] = None) -> T

origin_el:被操作的元素

destination_el:目標(biāo)元素

duration:持續(xù)時(shí)間

這里就不演示了,就是獲取元素位置然后拖動(dòng)到指定元素的位置。與前文實(shí)現(xiàn)的效果差不多,只是將坐標(biāo)變成了2個(gè)元素的位置。

屏幕拖拽

同樣的,微博不好演示的還有拖拽操作。它的方法為drag_and_drop(),其定義如下:

def drag_and_drop(self: T, origin_el: WebElement, destination_el: WebElement) -> T

origin_el:被拖拽的元素

destination_el:目標(biāo)元素

這里的拖拽你可以理解為將一個(gè)按鈕元素拖動(dòng)到另一個(gè)按鈕的位置,這里拖拽的是元素本身,不是位置的滑動(dòng)。微博中暫時(shí)也沒(méi)有演示的操作,感興趣的可以測(cè)試其他App。

文本輸入

在模擬登錄或者說(shuō)這里發(fā)微博的時(shí)候,用戶肯定需要模擬輸入文本。而且,在需要登錄的爬蟲場(chǎng)景之下,登錄都是必備步驟。比如微信朋友圈內(nèi)容的爬取,你不登陸看得到朋友圈嗎?

所以,我們需要掌握Appium的文本輸入操作。而它提供了2個(gè)方法進(jìn)行文本的輸入,一個(gè)是set_text();一個(gè)是send_keys()。

現(xiàn)在我們模擬微博輸入賬號(hào),示例代碼如下:

from appium import webdriver
import time
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as ec

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ī)試試。同時(shí)也可以替換為send_text()方法。

動(dòng)作鏈

動(dòng)作鏈顧名思義就是一系列操作動(dòng)作的組合。在Selenium中,動(dòng)作鏈?zhǔn)茿ctionChains,而Appium中,動(dòng)作鏈?zhǔn)荰ouchAction。

比如,我們執(zhí)行的下拉刷新其實(shí)就是一個(gè)動(dòng)作鏈。這里,我們會(huì)執(zhí)行2個(gè)動(dòng)作,一個(gè)是按壓,一個(gè)是從指定位置滑動(dòng)到另一個(gè)位置。這里,我們將2個(gè)動(dòng)作組合實(shí)現(xiàn):

TouchAction(driver).press(x=380, y=2101).move_to(x=390, y=519).release()

實(shí)戰(zhàn):爬取微博首頁(yè)信息

其實(shí),Appium開(kāi)始推出的時(shí)候,是為了自動(dòng)化測(cè)試準(zhǔn)備的工具,并不專用于爬蟲數(shù)據(jù)。而且Appium有一個(gè)缺陷,目前沒(méi)有直接的辦法獲取圖片。

如果你想下載App界面中的圖片,可以模擬用戶長(zhǎng)按的操作進(jìn)行圖片的下載。也可以直接截圖。話不多說(shuō),我們來(lái)實(shí)現(xiàn)獲取微博的文字信息并保存到目錄。示例如下:

from appium import webdriver
import time
from selenium.webdriver.support.ui import WebDriverWait
import os


def mkdir(path):
    path = path.strip()
    path = path.rstrip("\\")
    isExists = os.path.exists(path)
    # 判斷結(jié)果
    if not isExists:
        # 如果不存在則創(chuàng)建目錄
        # 創(chuàng)建目錄操作函數(shù)
        os.makedirs(path)
        print(path + ' 創(chuàng)建成功')
        return True
    else:
        # 如果目錄存在則不創(chuàng)建,并提示目錄已存在
        print(path + ' 目錄已存在')
        return False


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()
time.sleep(5)
mkdir("weiboFile")
for i in range(10):
    items = driver.find_elements_by_id("com.sina.weibo:id/contentTextView")
    for item in items:
        txt_text = item.get_attribute("content-desc")
        folder_output = 'weiboFile/%s.txt' % str(int(time.time()))
        with open(folder_output, "w", encoding='utf-8') as f:
            f.write(txt_text)
        f.close()
        print(txt_text)
    driver.swipe(487, 2085, 513, 257, 3000)

上面代碼主要的功能在for-in循環(huán)之中。這里,我們通過(guò)先獲取文本數(shù)據(jù)保存之后,在滑動(dòng)屏幕獲取其他的微博數(shù)據(jù)。

如果你想獲取更多的數(shù)據(jù),可以把循環(huán)的次數(shù)設(shè)置的更大一些。因?yàn)锳pp的數(shù)據(jù)都是在滑動(dòng)之中進(jìn)行加載的。運(yùn)行之后,效果如下所示:


到此這篇關(guān)于python爬蟲之Appium爬取手機(jī)App數(shù)據(jù)及模擬用戶手勢(shì)的文章就介紹到這了,更多相關(guān)Appium爬取手機(jī)App數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • python 網(wǎng)頁(yè)解析器掌握第三方 lxml 擴(kuò)展庫(kù)與 xpath 的使用方法
  • python網(wǎng)絡(luò)爬蟲精解之pyquery的使用說(shuō)明
  • Python 給我一個(gè)鏈接西瓜視頻隨便下載爬蟲
  • python網(wǎng)絡(luò)爬蟲精解之XPath的使用說(shuō)明

標(biāo)簽:安慶 烏魯木齊 三亞 湘西 葫蘆島 呼倫貝爾 呼倫貝爾 銀川

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《python爬蟲之Appium爬取手機(jī)App數(shù)據(jù)及模擬用戶手勢(shì)》,本文關(guān)鍵詞  python,爬蟲,之,Appium,爬取,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《python爬蟲之Appium爬取手機(jī)App數(shù)據(jù)及模擬用戶手勢(shì)》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于python爬蟲之Appium爬取手機(jī)App數(shù)據(jù)及模擬用戶手勢(shì)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 嘉荫县| 平乡县| 鄄城县| 大荔县| 随州市| 常州市| 永康市| 石屏县| 静宁县| 富平县| 章丘市| 庆安县| 札达县| 昔阳县| 喜德县| 禹城市| 巴彦淖尔市| 德保县| 哈巴河县| 凯里市| 岢岚县| 福鼎市| 中超| 柳林县| 无棣县| 许昌市| 南召县| 金华市| 青岛市| 临夏市| 屯昌县| 合川市| 泰兴市| 汽车| 定远县| 托克逊县| 兖州市| 班玛县| 甘孜| 盘山县| 沙洋县|