python 手机App数据抓取实战二抖音用户的抓取
前言
什么?你問我國慶七天假期干了什么?說出來你可能不信,我爬取了cxk坤坤的抖音粉絲數據,我也不知道我為什么這么無聊。
本文主要記錄如何使用appium自動化工具實現抖音App模擬滑動,然后分析數據得到粉絲用戶信息。
環境準備
fiddler
appium
mitmproxy(mitmdump)
python3.6
自帶root的安卓虛擬機
Android SDK
安卓模擬器需要安裝xposed框架并安裝JustTrustMe組件,因為抖音會有ssl驗證,會導致我們在將數據發送到我們的抓包工具的時候無法聯網,所以需要安裝這個組件來關閉ssl驗證
mitmproxy、AndroidSDK需要加入環境變量,這步就不再敘述
項目準備
首先我們需要給虛擬機安裝fiddler、mitmproxy的證書
1)fiddler 主要設置如下
端口設置可以隨意更改,本文設置為8889
電腦主機打開命令行 輸入ipconfig查看本機IP
設置模擬器的代理
接下來打開瀏覽器,輸入 ip:prot 如本機為 117.90.211.134:8889 下載安裝fiddler證書 如下步驟
接下來我們就可以使用fiddler正確的抓取手機數據包了
2)mitmproxy證書
我們在Windows系統上常用的是mitmproxy的mitmdump 打開cmd輸入mitmdump -p 端口號 就可以啟動服務
為了方便我們將端口號也設置為8889 但是開啟這個的時候需要先關閉fiddler 不然會端口沖突,然后打開模擬器的瀏覽器看看能否接受數據
我們發現出問題了,發現現在直接提示空的響應而不是證書的問題,看到mitmdump報的錯誤是killed by block_global 是什么原因呢?
這是mitmdump的自我保護措施,它防止全球網絡的連接,意思就是如果是本地局域網它不會阻攔,那該怎么辦呢?
有兩種解決辦法:第一種,將模擬器的網絡連接設置為橋接模式,這樣就不會出現問題;
第二種辦法是啟動的時候加入參數mitmdump -p 8889 --set block_global=false如下圖
接下來 安裝mitmproxy的證書 瀏覽器輸入網址 mitm.it 然后安裝證書
現在再打開網頁就不會出現證書的提醒了
這時候我們需要用的主要兩個抓包工具的證書就安裝完成了,需要注意的是我們每次測試都可能需要重新安裝證書,因為我們的主機IP可能會變
App分析
首先呢我們先確認模擬器中的xposed框架的JustTrustMe組件是否開啟 不然我們抖音App不能正常訪問網絡
注意以下步驟只能在網絡橋接模式下使用(或者使用真機與電腦在同一個網絡) 否則fiddler無法抓取到所有的包
首先使用fiddler分析,打開fiddler 并打開抖音進行操作本項目是爬取cxk坤坤的粉絲數據,所以我們先進入他的抖音主頁點進粉絲列表
粉絲好多,我們接下來向下滑動,看看當向下滑動刷新出更多粉絲的時候 fiddler會抓取到什么數據
會發現每次向下滑動的時候都會有一個含有aweme/v1/user/follower/list/ 的網址,我們懷疑這就是粉絲數據的接口 我們把這個網址返回來的數據放入 json.cn 看看
還真的就是粉絲數據,會發現每次滑動更新的是二十個粉絲,所以我們就找對了方向,下面我們來分析這個請求
GET https://aweme-hl.snssdk.com/aweme/v1/user/follower/list/?user_id=103313639528&sec_user_id=MS4wLjABAAAAxj2Cuu75g3I2pGOs7jtw5XN6WMiCKbA-jfIjlONRRvM&max_time=1570336550&count=20&offset=0&source_type=1&address_book_access=1&gps_access=1&openudid=3ca06768d1f58615&version_name=8.1.1&ts=1570336895&device_type=OPPO%20R11&ssmix=a&iid=87664447665&app_type=normal&os_api=19&mcc_mnc=46007&device_id=68799320259&resolution=720*1280&device_brand=OPPO&aid=1128&manifest_version_code=811&app_name=aweme&_rticket=1570336895512&os_version=4.4.2&device_platform=android&version_code=811&update_version_code=8112&ac=wifi&dpi=240&uuid=866174010601603&language=zh&channel=tengxun_new HTTP/1.1
我們會發現這個請求的url帶有很多很多的參數,沒錯,這是抖音自身的加密方法,要破解這個可得好一會了,所以我們無法使用requests直接構造請求來獲得數據了,那我們該如何獲取數據呢?
沒錯就是使用mitmdump,mitmdump有個最大的好處就是可以與python文件交互,我們可以直接使用python寫好命令,使用mitmdump抓包,我們手動的滑動就可以解析出數據了
編寫douyin_mitmdump.py文件 代碼如下:
import json
#函數名必須這樣寫 這是mitmdump規則
def response(flow):
#下面這個網址是通過fiddler獲取到的 但是有些數據我們無法解密,所以需要用mitmdump捕獲數據包然后做分析
if 'aweme-hl.snssdk.com/aweme/v1/user/follower/list' in flow.request.url:
for user in json.loads(flow.response.text)['followers']:
user_info={}
user_info['nickname'] = user['nickname']
user_info['share_id'] = user['uid']
user_info['douyin_id'] = user['short_id']
#有的用戶修改了抖音號
if user_info['douyin_id'] == '0':
user_info['douyin_id'] = user['unique_id']
print(user_info)
現在打開cmd并切換到項目目錄下 執行命令 mitmdump -p 8889 -s douyin_mitmdump.py
接下來手動滑動界面看看會不會解析數據
好的 現在我們已經成功的分析出來了粉絲數據,但是我們總不能一直鼠標滑動吧?所以我們現在需要使用Appium進行自動化測試模擬滑動
Appium自動化測試模擬滑動
配置信息
Appium是一個開源測試自動化框架,可用于原生,混合和移動Web應用程序測試。 它使用WebDriver協議驅動iOS,Android和Windows應用程序。
比如本文我們就使用appium來實現從點開程序到模擬滑動的全部操作。
首先我們需要在電腦上安裝Appium
這個相當于appium服務端,我們在執行自動化測試的時候需要先在電腦上打開服務端,然后我們使用程序連接虛擬機或真機執行腳本進行自動化測試點擊start server打開服務端
我們首先使用appium 自帶的測試程序來試一下如何操作 點擊右上角的放大鏡符號
進入配置選項界面 開始填寫選項信息
下面我來解釋每個參數都是如何得到的
1)platformName 這是平臺名稱 我們填寫 Andriod 相信不用過多解釋
2)platformVersion 這是問平臺版本信息,根據各個手機不同自主填寫,本文使用的是 Andriod4.4.2
3)deviceName 這個是設備的名稱,我們如何獲取呢?
這個時候就用到了我們AndroidSDK中的adb工具了 adb是用來連接電腦與手機的工具 我們把手機進入開發者選項并打開允許USB調試,然后打開命令行輸入命令 adb devices看看有沒有輸出
返回的127.0.0.1:52001就是設備名稱 這個是模擬器的名稱,使用真機會不同 (如果沒有返回就關閉開發者模式重新打開USB調試多試幾次)
4)appPackage、appActivity這倆個參數非常重要,它指定了我們自動化測試的app,這兩個參數獲取有點麻煩,下面詳解如何獲取
首先手機打開App,本文就是抖音了,然后電腦命令行輸入 adb shell 進入交互界面 然后輸入命令dumpsys activity | grep mFocusedActivity
第一個就是包名,第二個就是activity名 我們記下來一會編寫進去(activity名稱前要跟著包名)
即 包名com.ss.android.ugc.aweme activity名com.ss.android.ugc.aweme.main.MainActivity
5)noReset unicodekeyboard resetkeyboard解釋會在一會的程序中
然后點擊右下方保存配置信息并start session 如果點擊start session發現手機自動打開抖音時,就說明我們的配置信息寫對了,就可以開始使用了
這些配置信息一會要在我們的python腳本中使用,所以一定要填寫正確
內容分析
其實app自動化測試跟網頁爬蟲很相似,首先分析我們該怎么做
點開抖音這一步已經不用我們去做 然后我們需要依次點左上角放大鏡按鈕、點擊搜索框輸入抖音號、點擊搜索、點擊用戶、點擊進入主頁、點擊粉絲、向上滑動
我們該如何定位按鈕以及輸入信息呢?
這又得使用AndroidSDK中的工具了 這次使用 AndroidSDK oolsmonitor.bat 中的monitor 可能有的小伙伴會問 為什么不使用可以查看xpath的魔改版的uiautomatorviewer呢?這是因為我在測試的時候發現現在抖音加入了某種時鐘,我們都知道uiautomatorviewer無法獲取動態頁面的數據,而我發現monitor有的界面卻可以,所以使用monitor,下面開始
首先用鼠標點擊左邊畫藍色圈的地方獲取當前手機界面數據,然后鼠標點擊我們需要的控件,之后右邊出現的就是我們需要的信息,我們可以通過resource-id查找指定數據
現在先來編寫douyin_appium.py文件測試下能否自動打開抖音并點擊左上方放大鏡按鈕
from appium import webdriver
#WebDriverWait用來加入時間判斷,有時候控件元素需要過一段時間才會出現
from selenium.webdriver.support.ui import WebDriverWait
import time
#配置信息
option={
"platformName": "Android",
"platformVersion": "4.4.2",
"deviceName": "127.0.0.1:52001",
#自動化測試包名
"appPackage": "com.ss.android.ugc.aweme",
#自動化測試Activity
"appActivity": "com.ss.android.ugc.aweme.main.MainActivity",
#再次啟動不需要再次安裝
"noReset": True,
#unicode鍵盤 我們可以輸入中文
"unicodekeyboard": True,
#操作之后還原回原先的輸入法
"resetkeyboard":True
}
#其中的4723就是appium服務啟動時的端口號
driver = webdriver.Remote("http://localhost:4723/wd/hub",option)
#放大鏡按鈕
try:
#使用resource-id查找按鈕
if WebDriverWait(driver,5).until(lambda x:x.find_element_by_id('com.ss.android.ugc.aweme:id/b3o')):
#點擊按鈕
driver.find_element_by_id('com.ss.android.ugc.aweme:id/b3o').click()
except:
pass
運行之前首先要開啟 appium 服務端,即start server
然后運行python文件
好的我們發現已經可以自動的點擊放大鏡按鈕了,那么接下來只需要繼續編寫文件即可以完成自動化操作了 代碼如下
from appium import webdriver
#WebDriverWait用來加入時間判斷,有時候控件元素需要過一段時間才會出現
from selenium.webdriver.support.ui import WebDriverWait
import time
#配置信息
option={
"platformName": "Android",
"platformVersion": "4.4.2",
"deviceName": "127.0.0.1:52001",
#自動化測試包名
"appPackage": "com.ss.android.ugc.aweme",
#自動化測試Activity
"appActivity": "com.ss.android.ugc.aweme.main.MainActivity",
#再次啟動不需要再次安裝
"noReset": True,
#unicode鍵盤 我們可以輸入中文
"unicodekeyboard": True,
#操作之后還原回原先的輸入法
"resetkeyboard":True
}
#其中的4723就是appium服務啟動時的端口號
driver = webdriver.Remote("http://localhost:4723/wd/hub",option)
#放大鏡按鈕
try:
#使用resource-id查找按鈕
if WebDriverWait(driver,5).until(lambda x:x.find_element_by_id('com.ss.android.ugc.aweme:id/b3o')):
#點擊按鈕
driver.find_element_by_id('com.ss.android.ugc.aweme:id/b3o').click()
except:
pass
#得到窗口大小
def get_size():
x=driver.get_window_size()['width']
y=driver.get_window_size()['height']
return (x,y)
#搜索框
try:
# 定位搜索框
if WebDriverWait(driver,3).until(lambda x:x.find_element_by_id('com.ss.android.ugc.aweme:id/ad1')):
#點擊搜索框
driver.find_element_by_id('com.ss.android.ugc.aweme:id/ad1').click()
#輸入抖音號并點解搜索
driver.find_element_by_id('com.ss.android.ugc.aweme:id/ad1').send_keys("1307311292")
driver.find_element_by_id('com.ss.android.ugc.aweme:id/dy8').click()
#點擊用戶 注意寫法 這個控件由于無法獲取resource_id與xpath的值 所以只能通過text來查找
driver.find_element_by_android_uiautomator("text("用戶")").click()
except:
pass
#點進去具體界面
try:
if WebDriverWait(driver,5).until(lambda x:x.find_element_by_id('com.ss.android.ugc.aweme:id/bck')):
#進入用戶信息界面
driver.find_element_by_id('com.ss.android.ugc.aweme:id/bck').click()
time.sleep(2)
#點擊粉絲數
driver.find_element_by_id('com.ss.android.ugc.aweme:id/akf').click()
except:
pass
#得到屏幕尺寸
size = get_size()
#定義滑動
x1 = int(size[0]*0.5)
x2 = int(size[0]*0.7)
y1 = int(size[1]*0.9)
y2 = int(size[1]*0.2)
while(True):
time.sleep(0.5)
#模擬滑動
driver.swipe(x1, y1, x2, y2)
效果如下gif圖 可以實現從打開抖音到滑動的模擬操作
數據入庫
現在我們已經完成了appium的自動化模擬滑動,同時我們最開始又寫了獲取粉絲數據的mitmdump腳本,現在我們將這兩個腳本結合起來就可以實現自動分析數據了
第一步運行mitmdump腳本 即到項目目錄下運行命令
D:pythonworkAppSpidersdouyin_test>mitmdump -s douyin_mitmdump.py -p 8889 --set block_global=false
--set block_global=false如果手機和電腦在同一個局域網可以不加這條指令
然后將手機連接代理到我們主機 ,接著運行douyin_appium.py 現在就可以完成自動拉取粉絲數據了
效果如下圖
我們還差什么呢?我們總不能在命令行看粉絲數據吧,所以我們需要把抓取到的數據放入本地mongo數據庫,首先編寫一個douyin_db.py 代碼如下
import pymongo
from pymongo.collection import Collection
client = pymongo.MongoClient(host='127.0.0.1',port=27017)
#數據庫名
db = client['douyin_test']
#存入獲取的粉絲數據部分信息
def save_task(item):
task_id_collection = Collection(db, 'task_id')
#updata方法,如果存在相同的share_id就更新,不存在就構建
task_id_collection.update({'share_id':item['share_id']},item,True)
然后我們在 douyin_mitmdump.py中引用這個剛剛編寫的入庫函數 douyin_mitmdump.py引用如下:
import json
#導入編寫的入庫函數
from douyin_test.douyin_db import save_task
#函數名必須這樣寫 這是mitmdump規則
def response(flow):
#下面這個網址是通過fiddler獲取到的 但是有些數據我們無法解密,所以需要用mitmdump捕獲數據包然后做分析
if 'aweme-hl.snssdk.com/aweme/v1/user/follower/list' in flow.request.url:
for user in json.loads(flow.response.text)['followers']:
user_info={}
user_info['nickname'] = user['nickname']
user_info['share_id'] = user['uid']
user_info['douyin_id'] = user['short_id']
#有的用戶修改了抖音號
if user_info['douyin_id'] == '0':
user_info['douyin_id'] = user['unique_id']
#數據入庫
save_task(user_info)
再次運行mitmdump命令與douyin_appium.py 現在就可以實現數據入庫了,結果如下
以上就是我們爬取到的cxk的粉絲數據,有小伙伴可能會說這種模擬滑動的很慢,可是有些app做了很高級別的加密,我們迫不得已只能用這種方式爬取,本次教程到此結束
喜歡的覺得有用的就點個贊吧,點波關注不迷路呦
總結
以上是生活随笔為你收集整理的python 手机App数据抓取实战二抖音用户的抓取的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android之网络编程利用PHP操作M
- 下一篇: 如何通过软件项目开发来提高自身的实力。