python爬蟲之Appium手機APP爬蟲


一、Appium工作原理(詳情見:https://www.cnblogs.com/sophia194910/p/7515165.html

 

 Appium的功能其實很簡單:監聽一個端口,然后接收由client發送來的command,翻譯這些command,把這些command轉成移動設備可以理解的形式發送給移動設備,然后移動設備執行完這些command后把執行結果返回給appium server,appium server再把執行結果返回給client。

在這里client其實就是發起command的設備,一般來說就是我們代碼執行的機器,執行appium測試代碼的機器。狹義點理解,可以把client理解成是代碼,這些代碼可以是java/ruby/python/js的,只要它實現了webdriver標准協議就可以。

二、Appium環境搭建

1、需要用到的軟件包如下:

(1)node.js

(2)Java SDK

(3)Android SDK

(4)Appium Windows

(5)夜神模擬器

(6)Python

(7)Appium-python-Client

2、node.js(參考:https://blog.csdn.net/u010654583/article/details/85125377

(1)下載地址:http://nodejs.cn/download/

(2)安裝好后,執行npm install -g appium-doctor(npm是node.js的包管理工具,下載appium-doctor可以檢測Appium的環境搭建是否成功)

(3)執行appium-doctor檢測Appium的環境搭建情況

 

 上圖打對勾的地方即是要堅持的環境變量配置情況,只有全部打對勾,才說明環境搭配成功

3、Java SDK

(1)下載地址:https://www.oracle.com/technetwork/java/javase/downloads/index.html

(2)安裝Java SDK文件,並配置環境變量,最后檢測是否安裝成功(參考:https://jingyan.baidu.com/article/d45ad148ba5ab169552b80d3.html

4、Android SDK

(1)下載地址:https://developer.android.com/studio/(現在已經沒有單獨的解壓包了,只有跟Android Studio一起下載)

(2)安裝好后,配置環境變量,最后檢測是否安裝成功(參考:https://www.cnblogs.com/nebie/p/9145627.html

5、Appium Windows

(1)下載地址:http://appium.io/

(2)安裝Appium Windows

6、夜神模擬器

(1)下載地址:https://www.yeshen.com/

(2)安裝

7、Python與Appium-Python-Client的安裝就不講了

8、使用appium-doctor檢測環境是否安裝成功,同第2步

9、測試是否能正常啟動

根據appium的工作原理:

(1)測試client與appium是否能通信成功

 

 

 

 

 當運行代碼時,Appium就會響應,雖然是404,但只是因為Appium沒有找到執行命令的設備

(2)測試appium與模擬器是否能通信成功

 

 

 

 

 

 不管遇見什么樣的錯誤,只要把Origin error:后面的報錯信息復制到百度上找尋解決辦法基本都能找到,這里表示不能找到連接了的安卓設備,所以我們先要連接安裝設備,

在命令行中:

檢測是否有連接的設備,下面表示沒有連接的設備

 

 連接已經打開的安卓設備,連接成功

 

 再檢測一下,發現有了

 

 接下來就可以點擊Start session,將Appium連接上安卓設備,連接成功與設備同步

 

 

 

 現在我們使用代碼驅動Appium,Appium再將命令轉給安卓設備,模擬器打開,說明成功了,可以正式開始抓取APP的數據了

 

 現在可以解釋一下platformName、platformVersion、deviceName、appPackage、appActivity、noReset這幾個參數的來歷了

platformName(系統名稱):Android、IOS、Windows、Linux

plaformVersion(系統版本)

deviceName(設備名稱,即設備運行的地址,默認為127.0.0.1:62001)

appPackage(要打開哪個軟件)、appActivity(要打開的軟件的活動頁面)

appPackage、appActivity兩個參數可以通過點開模擬器上想要打開的軟件,然后通過命令行獲取

 

 10、用法基本與selenium類似,下附簡單的代碼(定位時,能使用id,盡量不使用xpath)

#!/usr/bin/env python
# coding: utf-8

# In[63]:


from appium import webdriver


# In[64]:


from time import sleep


# In[65]:


from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait


# In[66]:


from selenium.webdriver.common.by import By


# In[67]:


desired_caps = {
    "platformName": "Android",
    "platformVersion": "5.1.1",
    "deviceName": "127.0.0.1:62001",
    "appPackage": "com.wuba",
    "appActivity": ".activity.launch.LaunchActivity",
    "noReset": "False"  # 清除緩存
}


# In[68]:


driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)


# In[69]:


# 獲取手機屏幕長寬
screenWidth = driver.get_window_size()["width"]
screenHeight = driver.get_window_size()["height"]


# In[70]:


# beijing_xpath = "/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.support.v4.view.ViewPager/android.widget.RelativeLayout/android.support.v7.widget.RecyclerView/android.widget.LinearLayout/android.widget.LinearLayout[2]/android.view.View/android.widget.LinearLayout[1]"
# WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, beijing_xpath))).click()


# In[72]:


hotCityId = "com.wuba:id/fl_hot"
hotCity = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "com.wuba:id/fl_hot")))


# In[73]:


hotCity.find_element_by_xpath("//android.widget.LinearLayout[1]").click()


# In[74]:


# driver.find_element_by_id("com.wuba:id/launch_op_bt_ok").click()
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "com.wuba:id/launch_op_bt_ok"))).click()


# In[75]:


ershoufang_xpath = "/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.view.View/android.view.View/android.widget.LinearLayout/android.widget.LinearLayout[1]/android.widget.GridView/android.view.View[4]/android.widget.ImageView"

WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, ershoufang_xpath))).click()


# In[76]:


ershoufang_xpath = "/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.View/android.support.v4.view.ViewPager/android.widget.FrameLayout/android.widget.RelativeLayout[1]/android.widget.FrameLayout/android.widget.RelativeLayout/android.support.v7.widget.RecyclerView/android.widget.LinearLayout[1]/android.widget.LinearLayout/android.widget.LinearLayout/android.view.View[1]/android.widget.LinearLayout[1]/android.widget.TextView"

WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, ershoufang_xpath))).click()


# In[78]:


items_id = "com.wuba:id/recyclerView"
items = driver.find_element_by_id(items_id)

while 1:
    driver.swipe(screenWidth*0.5, screenHeight*0.85, screenWidth*0.5, screenHeight*0.25, 500)
    ls = items.find_elements_by_xpath("//android.widget.LinearLayout")
    sleep(3)


# In[ ]:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM