python 爬蟲開發從入門到實踐 讀書筆記(三)
android 原生 app 爬蟲 uiautomator
安裝環境 JRE
# mac brew update brew cask install java # 或 brew tap caskroom/versions brew cask instal java8 # ubuntu apt-get update apt-get install default-jre
安裝 android sdk
下載網址ofollow,noindex" target="_blank">https://developer.android.google.cn/studio/
到網頁的最底部, 在 "Command line tools only" 下載系統對應的 sdk
bin/sdkmanager "platform-tools" # 或者安裝代理 bin/sdkmanager "platform-tools" --proxy=http --proxy-host=代理IP --proxy-port=代理埠
設定環境變數
platform-tools tools # 新增目錄裡對應的資料夾
設定開發者模式
開啟手機的開發者模式, usb 除錯, usb 安裝
除錯
uiautomatorviewer # 會開啟一個視窗, 點選左上角的手機圖示, 就會在電腦上看到手機介面
使用 python 除錯手機
使用 python 除錯手機, uiautomatorviewer 不能同時執行, 利用"一鍵優化" 或 關機重啟, 殺掉 python 安裝的兩個程序
pip install uiautomator >>> from uiautomator import Device >>> devide = Device() >>> print(device.dump()) # 第一次執行, 會在手機上安裝兩個沒有圖示的程式, 點選允許安裝
開啟微信
>>>from uiautomator import Device >>>device = Device() >>>device(text="微信").click() # 顯示所有連線電腦的手機 adb device -l >>>device = Dvice('串號')
from uiautomator import Device device = Device() print(device.dump()) # 以xml 形式輸入當前手機螢幕的佈局資訊 device(packageName='com.android.systemui') device(className='android.widget.FrameLayout') device(resourceId='com.android.systemui:id/clock') device(text='簡訊') device(index='3', resourceId='com.android.systemui:id/mobile_combo')
獲得螢幕文字
device.dump() title = device(resourceId='id名').text # 如果有多個 title = device(resourceId='id名') for t in title: print(t.text)
滾動螢幕
device(scrollable=True) # 上滾一屏 device(scrollable=True).scroll.vert.forward() # 下滾一屏 device(scrollable=True).scroll.vert.backward() # 右滾一屏 device(scrollable=True).scroll.horiz.forward() # 左滾一屏 device(scrollable=True).scroll.horiz.backward()
滑動螢幕
# 起始x座標, device.swipe(400, 600, 0, 600)
點選螢幕
所有的座標位置, 可以在uiautomatorviewer
裡顯示
# 短按, 長按 device(text="微信").click() device(text="微信").long_click() device.click(230, 567) device.long_click(230, 567)
輸入文字
device(resourceId="ID").set_text("輸入的文字")
判斷元素是否存在
input_box = device(resourceId='ID') if input_box.exists: input_box.set_text('輸入文字') else: print('不存在')
等待載入
input_box = device(resourceId='ID') if input_box.wait.exists(timeout=20000): input_box.set_text('輸入文字') else: print('不存在')
點亮螢幕
# 點亮螢幕 device.wakeup() # 關閉螢幕 device.sleep() if device.screen == 'on': print('當前螢幕為點亮狀態') elif device.screen == 'off': print('當前螢幕為關閉狀態')
操作實體鍵
- power 電源鍵
- back 返回
- menu 選單鍵
- volume_up 音量增大
- volume_down 音量減小
- home 返回左面
device.press.power() device.press.volume_up()
watcher
滿足3個條件, 啟用 watcher
- 找不到元素, 即將報錯
- 當螢幕上出現文字 "文字1"
- 當螢幕上出現文字 "文字2"
from uiautomator import Device device = Device() device.watcher('註冊 watcher 名字').when(text="文字1").when(text="文字2").press.back() ... # 下面為執行的程式碼