原創(chuàng)文章,歡迎轉(zhuǎn)載。轉(zhuǎn)載請(qǐng)注明:轉(zhuǎn)載自IT人故事會(huì),謝謝!
原文鏈接地址:「docker實(shí)戰(zhàn)篇」python的docker-抖音appium模擬滑動(dòng)操作(22)
上次代碼寫(xiě)到了可以通過(guò)接口獲取粉絲的數(shù)據(jù)了,但是當(dāng)時(shí)有個(gè)問(wèn)題,需要人為的手動(dòng)進(jìn)行點(diǎn)擊頭像,然后點(diǎn)擊粉絲,進(jìn)入粉絲列表,然后在下拉刷新獲取最新的粉絲。之前都說(shuō)過(guò)appium模擬器可以幫咱們做這些事,下面通過(guò)appium來(lái)進(jìn)行操作吧。源碼:https://github.com/limingios/dockerpython.git (douyin)
抖音短視頻的操作步驟(一)
1.首先通過(guò)模擬器打開(kāi)抖音,等待加載完畢。
2.完全進(jìn)去后,左上角有個(gè)放大鏡的窗口,點(diǎn)擊搜索框,輸入抖音ID(191433445)
3.點(diǎn)擊用戶(hù)的標(biāo)簽,點(diǎn)擊頭像,在點(diǎn)擊進(jìn)入“陳赫” 前,先看看關(guān)注的標(biāo)簽是否存在
4.進(jìn)入“陳赫”頁(yè)面后,點(diǎn)擊粉絲,然后進(jìn)行模擬滑動(dòng),通過(guò)上節(jié)的實(shí)際使用的(mitmdump)解析粉絲數(shù)據(jù)存入數(shù)據(jù)庫(kù)中。
編寫(xiě)python的腳本通過(guò)appium操作抖音(二)
- 準(zhǔn)備工作
1.取消模擬器代理
2.下載抖音apk
http://acj3.pc6.com/pc6_soure/2019-2/com.ss.android.ugc.aweme_500.apk
3.查看抖音apk的信息
查看appPackage和appActivity
1.進(jìn)入安卓sdk目錄下找到build-tools
2.隨便選擇一個(gè)版本號(hào)
3.通過(guò)cmd進(jìn)入這個(gè)目錄
4.輸入命令獲取aapt.exe dump badging 包名(必須在sdk的build-tools的版本的版本號(hào)的 aapt.exe目錄下執(zhí)行)
只能獲取appPackage=com.ss.android.ugc.aweme,appActivity獲取不到
用另一個(gè)變態(tài)的方式
#獲取列表
adb devices
#進(jìn)入監(jiān)控日志
adb -s 127.0.0.1:62025 logcat>E:/log.txt
#啟動(dòng)后,點(diǎn)開(kāi)抖音,然后查看E盤(pán)目錄下的log.txt文件
搜Displayed
獲取到信息
appPackage: com.ss.android.ugc.aweme
appActivity:com.ss.android.ugc.aweme.main.MainActivity
3.獲取安卓的版本號(hào)
打開(kāi)模擬器,進(jìn)入關(guān)于手機(jī)查看android的版本4.4.2
4.測(cè)試配置
1.啟動(dòng)安卓模擬器
2.啟動(dòng)appium應(yīng)用
3.啟動(dòng)測(cè)試的python代碼
4.順序必須上找上邊的
測(cè)試的python代碼
#!/usr/bin/env python
import time
from appium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
cap = {
"platformName": "Android",
"platformVersion": "4.4.2",
"deviceName": "127.0.0.1:62001",
"appPackage": "com.ss.android.ugc.aweme",
"appActivity": "com.ss.android.ugc.aweme.main.MainActivity",
"noReset": True,
"unicodeKeyboard":True,
"resetkeyboard":True
}
driver = webdriver.Remote("http://localhost:4723/wd/hub",cap)
def get_size():
x = driver.get_window_size()['width']
y = driver.get_window_size()['height']
return(x,y)
開(kāi)始解析頁(yè)面的xpath信息(三)
1.關(guān)閉上邊測(cè)試用的appium,單獨(dú)啟動(dòng)下抖音app
2.暫停播放,啟動(dòng)uiautomatorviewer。源碼包中有加強(qiáng)版的uiautomatorviewer。看過(guò)之前文章的老鐵都懂。一定要暫停,否則uiautomatorviewer。
還需要感嘆一句的是,一天時(shí)間抖音app升級(jí)了,昨天寫(xiě)一半的文章,今天在看【搜索】按鈕換到了右邊,沒(méi)事,只要頁(yè)面有【搜索】按鈕就可以了。
搜索按鈕的xpath
//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.support.v4.view.ViewPager[1]/android.widget.FrameLayout[1]/android.support.v4.view.ViewPager[1]/android.widget.TabHost[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.view.View[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.LinearLayout[2]/android.widget.FrameLayout[1]/android.widget.ImageView[1]
3.進(jìn)入搜索頁(yè)面后,需要先點(diǎn)擊搜索框,如果框中存在“191433445”,直接點(diǎn)擊,不存在需要在搜索框中輸入“191433445”,然后點(diǎn)擊右邊的搜索按鈕
- 輸入框紅色的xpath
//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[2]/android.widget.EditText[1]
- 黃色的xpath
//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.support.v7.widget.RecyclerView[1]/android.widget.LinearLayout[1]/android.widget.TextView[1]
3.紫色部分搜索按鈕xpath
//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.LinearLayout[1]/android.widget.TextView[1]
3.搜索結(jié)果頁(yè)面,點(diǎn)擊【用戶(hù)】,點(diǎn)擊【頭像】,進(jìn)入【用戶(hù)信息界面】。
1.用戶(hù)xpath
//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.HorizontalScrollView[1]/android.widget.LinearLayout[1]/android.support.v7.app.ActionBar$Tab[3]/android.widget.LinearLayout[1]/android.widget.TextView[1]
2.用戶(hù)xpath
//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.support.v4.view.ViewPager[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[2]/android.view.View[1]/android.support.v7.widget.RecyclerView[1]/android.widget.RelativeLayout[1]/android.widget.RelativeLayout[1]/android.widget.ImageView[1]
4.進(jìn)入【用戶(hù)信息界面】,點(diǎn)擊紅色粉絲這個(gè)位置。進(jìn)入粉絲列表
1.粉絲xpath
//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.widget.HorizontalScrollView[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.view.View[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[5]/android.widget.LinearLayout[3]/android.widget.TextView[2]
python代碼的編寫(xiě)
按照上邊的業(yè)務(wù)邏輯開(kāi)始代碼的編寫(xiě)
#!/usr/bin/env python
import time
from appium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
cap = {
"platformName": "Android",
"platformVersion": "4.4.2",
"deviceName": "127.0.0.1:62001",
"appPackage": "com.ss.android.ugc.aweme",
"appActivity": "com.ss.android.ugc.aweme.main.MainActivity",
"noReset": True,
"unicodeKeyboard":True,
"resetkeyboard":True
}
driver = webdriver.Remote("http://localhost:4723/wd/hub",cap)
def get_size():
x = driver.get_window_size()['width']
y = driver.get_window_size()['height']
return(x,y)
try:
#點(diǎn)擊搜索
print('點(diǎn)擊搜索')
if WebDriverWait(driver,60).until(lambda x:x.find_element_by_xpath("http://android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.support.v4.view.ViewPager[1]/android.widget.FrameLayout[1]/android.support.v4.view.ViewPager[1]/android.widget.TabHost[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.view.View[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.LinearLayout[2]/android.widget.FrameLayout[1]/android.widget.ImageView[1]")):
driver.find_element_by_xpath("http://android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.support.v4.view.ViewPager[1]/android.widget.FrameLayout[1]/android.support.v4.view.ViewPager[1]/android.widget.TabHost[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.view.View[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.LinearLayout[2]/android.widget.FrameLayout[1]/android.widget.ImageView[1]").click()
except:
#[26,76][115,165]
driver.tap([(26,76),(115,165)],500)
#定位搜索框
if WebDriverWait(driver,60).until(lambda x:x.find_element_by_xpath("http://android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[2]/android.widget.EditText[1]")):
#獲取douyin_id進(jìn)行搜索
driver.find_element_by_xpath("http://android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[2]/android.widget.EditText[1]").send_keys('191433445')
while driver.find_element_by_xpath("http://android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[2]/android.widget.EditText[1]").text != '191433445':
driver.find_element_by_xpath("http://android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[2]/android.widget.EditText[1]").send_keys('191433445')
time.sleep(0.1)
#點(diǎn)擊搜索
driver.find_element_by_xpath("http://android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.LinearLayout[1]/android.widget.TextView[1]").click()
#點(diǎn)擊用戶(hù)標(biāo)簽
if WebDriverWait(driver,10).until(lambda x:x.find_element_by_xpath("http://android.widget.TextView[@text='用戶(hù)']")):
driver.find_element_by_xpath("http://android.widget.TextView[@text='用戶(hù)']").click()
#點(diǎn)擊頭像
if WebDriverWait(driver,10).until(lambda x:x.find_element_by_xpath("http://android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.support.v4.view.ViewPager[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[2]/android.view.View[1]/android.support.v7.widget.RecyclerView[1]/android.widget.RelativeLayout[1]/android.widget.RelativeLayout[1]/android.widget.ImageView[1]")):
driver.find_element_by_xpath("http://android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.support.v4.view.ViewPager[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[2]/android.view.View[1]/android.support.v7.widget.RecyclerView[1]/android.widget.RelativeLayout[1]/android.widget.RelativeLayout[1]/android.widget.ImageView[1]").click()
#點(diǎn)擊粉絲按鈕
if WebDriverWait(driver,10).until(lambda x:x.find_element_by_xpath("http://android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.widget.HorizontalScrollView[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.view.View[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[5]/android.widget.LinearLayout[3]/android.widget.TextView[2]")):
driver.find_element_by_xpath("http://android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.widget.HorizontalScrollView[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.view.View[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[5]/android.widget.LinearLayout[3]/android.widget.TextView[2]").click()
x1 = int(driver.get_window_size()['width']*0.5)
y1 = int(driver.get_window_size()['height']*0.75)
y2 = int(driver.get_window_size()['height']*0.25)
while True:
if '沒(méi)有更多了' in driver.page_source:
break
driver.swipe(x1,y1,x1,y2)
time.sleep(0.5)
PS:因用的是模擬器,導(dǎo)致電腦很卡,如果是真機(jī)就好些了,開(kāi)啟usb調(diào)試,通過(guò)adb devices,查看真機(jī)的名稱(chēng),然后修改python的代碼。