Python自動化爬取App數據

歡迎點擊右上角關注小編,除了分享技術文章之外還有很多福利,私信學習資料可以領取包括不限於Python實戰演練、PDF電子文檔、面試集錦、學習資料等。

Python自動化爬取App數據

基本環境配置

版本:Python3

系統:Windows

需要安裝:

1.JDK - Download JDK,Appium要求用戶必須配置JAVA環境, 否則啟動Seesion報錯。

2.Appium - Download Appium, 安裝過程請自行搜索。

3.Android SDK - Download SDK

4. Selenium - 建議使用低版本的Python Selenium庫,在Chrome高版本可能會報錯。例如:

pip3 install selenium==2.48.0

5. chromedriver.exe - Download Chromedriver, 確保版本要匹配, 然後將 .exe 程序放在"..Python\\Python36\\Scripts"目錄下。

6. pymongo

pip3 install pymongo

7. MongoDB Server - Download MongoDB

爬取思路

爬取思路:

  • 模擬登錄
  • 抓取動態
  • 保存數據

Android SDK的安裝與配置

打開Android Studio, 選擇"Configure->SDK Manager->Apperance&Behavior->System Settings->Android SDK", 選擇對應安卓機版本的SDK,如圖:

Python自動化爬取App數據

此外,還需要將SDK所在路徑添加到系統環境變量中,否則報錯。

Desired Capabilites 參數

分別是:platfornName, deviceName, appPackage, appActivity。前兩個可通過如下命令獲取, 前提是連接手機、打開USB調試:

adb devices -l
Python自動化爬取App數據

後兩個參數請移步:獲取appPackage和appActivity

開啟安卓的" 開發者選項、USB調試 "

測試之前,確保打開 開發者選項、USB調試。開發者模式確保調試程序在手機安裝輔助軟件:Unlock, Appium Settings;USB調試主要是利用Appium內置驅動打開APP。此外,要保持屏幕常亮。

5. 節點ID或XPATH值獲取

安卓微信節點獲取,相對比較容易獲取,比如獲取"登錄"ID值,啟動Session後只需點擊屏幕左側安卓屏的登錄按鈕,中間就會自動定位到所在節點,最右側還會顯示該節點的所有屬性。如圖:

Python自動化爬取App數據

對於文本輸入框,只需要點擊最右側的"send text"即可。

"是否匹配通訊錄"

這裡選擇"否", 理由:重新登錄進入微信後會自動加載本地數據,耗時較長,如果匹配通訊錄好友,增加耗時,可能在TIMEOUT時間內獲取不到節點,導致程序終止。我這裡選擇了"是", 如圖:

Python自動化爬取App數據

朋友圈信息獲取思路

獲取當前顯示的朋友圈每條狀態對應的區塊元素,遍歷每個區塊元素,再獲取內部顯示的用戶名、正文、發佈時間,代碼如下:

# items存儲當前頁面所有發佈的朋友圈信息
items = self.wait.until(
EC.presence_of_all_elements_located(
# 每個ej9節點對應一條朋友圈數據
(By.XPATH, '//*[@resource-id="com.tencent.mm:id/ej9"]/android.widget.LinearLayout')))
for item in items:
try:
# 暱稱
nickname = item.find_element_by_id('com.tencent.mm:id/b5o').get_attribute('text')
# 正文
content = item.find_element_by_id('com.tencent.mm:id/ejc').get_attribute('text')
# 日期
date = item.find_element_by_id('com.tencent.mm:id/eec').get_attribute('text')
# 處理日期
date = self.processor.date(date)
data = {
'nickname': nickname,
'content': content,
'date': date,
}

日期處理

日期處理的實現方式,代碼如下:

class Processor():
def date(self, datetime):
"""
格式化時間
:param date: 原始時間
:return: 處理後時間
"""

if re.match('\\d+分鐘前', datetime):
minute = re.match('(\\d+)', datetime).group(1)
datetime = time.strftime('%Y-%m-%d', time.localtime(time.time() - float(minute) * 60))
if re.match('\\d+小時前', datetime):
hour = re.match('(\\d+)', datetime).group(1)
datetime = time.strftime('%Y-%m-%d', time.localtime(time.time() - float(hour) * 60 * 60))
if re.match('昨天', datetime):
datetime = time.strftime('%Y-%m-%d', time.localtime(time.time() - 24 * 60 * 60))
if re.match('\\d+天前', datetime):
day = re.match('(\\d+)', datetime).group(1)
datetime = time.strftime('%Y-%m-%d', time.localtime((time.time()) - float(day) * 24 * 60 * 60))
return datetime

完整代碼

Python自動化爬取App數據

注意事項:

  1. 代碼中所有節點都須提前通過 Appium新建Session獲取(親測同版本的微信中vivo_x7和Mi_8節點相同,其餘機型未知)
  2. 建議使用高性能手機測試(MI_8|MI_9等)

運行結果

Python自動化爬取App數據


分享到:


相關文章: