1. 程式人生 > 實用技巧 >抖音爬蟲教程-APP資料採集常見思路

抖音爬蟲教程-APP資料採集常見思路

其實所謂抓取APP資料和抓取網頁資料是存在一定的不同,抓取網頁資料可以採用模擬訪問網站然後抓取網頁接收內容的模式進行資料抓取。而APP則更傾向於通過截獲資料傳輸包的形式進行(Wireshark和Fiddler+Python)。
一般來說,我們用WireShark+Fiddler來獲取大部分資料是沒有多大問題的。但這裡有個問題是,如果你碰到的是用SSL/TLS等加密手段加密過的網路資料的時候,往往我們只能束手無策。在過去的話,如果我們擁有的該傳輸會話的私鑰的話我們還是可以將它提供給WireShark來讓其對這些加密資料包進行解密的,但這已經是想當年還用RSA進行網路資料加密的年代的事情了。當今大家都已經逐漸擁抱前向加密技術PFS的時代了,所以該方法就不再適用了。因為前向加密技術的目的就是讓每個資料互動都使用的是不同的私鑰,所以你像以前RSA時代一樣想只用一個私鑰就能把整個session會話的網路資料包都破解出來的話是不可能的了(其實可以也通過類似瀏覽器的Session Key功能解決)。

1.App資料抓取分析

凡是可以看到的APP資料都可以抓取。
分析研究過不下300個APP抓包。
50%的app,通過抓包軟體就可以分析出抓取引數並抓取到資訊。
30%的app,可能需要適當的反編譯,分析出加密演算法並抓取到資訊。
10%的app,可能加固,需要脫殼,然後反編譯,分析出加密演算法並抓取到資訊。
10%的app,通過各式各樣的簽名,證書,裝置繫結等方法,隱藏加密演算法。
總的來說,沒有不能抓取的app,只是時間成本的問題。

2.爬取思路

1.抓包
2. HOOK

2.1.抓包

有程式碼經驗或APP開發的同學都很容易理解,其實很多APP,走的都是webservice通訊協議的方式,並且由於是公開資料,而且大部分是無加密的。所以只要對網路埠進行監測,對APP進行模擬操作,即可知道APP裡面的資料是如何獲取的。
我們只需要寫程式碼模擬其請求,無論POST還是GET,即可得到該請求所返回的資訊。再通過對返回的資訊結構化解析,即可得到我們想要的資料。

public static void main(String[] args) {
 Spider.create(new GithubRepoPageProcessor())
 
     //從https://github.com/****開始抓
 
     .addUrl("https://github.com/****")
 
     //設定Scheduler,使用Redis來管理URL佇列
 
     .setScheduler(new RedisScheduler("localhost"))
 
     //設定Pipeline,將結果以json方式儲存到檔案
 
     .addPipeline(new JsonFilePipeline("D:\\data\\webmagic"))
 
     //開啟5個執行緒同時執行
 
     .thread(5)
 
     //啟動爬蟲
 
    .run();
}

2.2.HOOK技術

HOOK技術是一種走作業系統核心的技術,由於安卓系統是開源的,所以可以藉助一些框架修改核心,從而實現你要的功能。HOOK的形式,我們走的是Xposed框架。Xposed是一款可以在不修改任何其他開發者開發的應用(包括系統服務)的情況下,改變程式執行的一個開源框架服務。基於它可以製作出許多功能強大的模組,以此來達到應用程式按照你的意願執行的目的。
如果把安卓手機看做一座城堡,那Xposed可以讓你擁有一個上帝視角,城裡的運作細節盡收你眼底,還能讓你插一手改變城堡的運作規律。
什麼意思呢?簡單的說就是你可以通過他,自動化的控制你的APP。如果將我們的APP開在模擬器上,我們可以通過編碼,通過他告訴APP這一步幹什麼,下一步幹什麼。你把它理解成類似按健精靈或遊戲打怪外掛就可以了。
而他每走一步,APP與服務端互動的資料,均可獲取下來。這種方式廣泛用於一些成熟的APP。比如某信採集。

public class HookActivity implements IXposedHookLoadPackage {
 
 @Override
 
 public void handleLoadPackage(LoadPackageParam lpparam) throws Throwable {
 
   final String packageName = lpparam.packageName;
 
   XposedBridge.log("--------------------: " + packageName);
 
   try {
 
     XposedBridge.hookAllMethods
 
     (Activity.class, "onCreate", new XC_MethodHook() {
 
       @Override
 
       protected void afterHookedMethod(MethodHookParam param)
 
       throws Throwable {
 
         XposedBridge.log("=== Activity onCreate: " + param.thisObject);
 
       }
 
     });
 
   } catch (Throwable error) {
 
     XposedBridge.log("xxxxxxxxxxxx: " + error);
 
   }
 
 }
 
}

3.需要爬的坑

坑一:簽名演算法

以某信的文章列表頁及某資訊頁為例,對其http訪問進行抓包,會發現其url的一個核心引數是我們無法知道如何生成的,這就導致,我們不可能直接用該url進行資訊爬取;簽名演算法如果無法破解,HTTP這條路就是死路了。

坑二:http爬取回來的資訊和頁面顯示不一致

以某信的某資訊頁為例,對比直接訪問某信頁面及http爬取的資訊,可明顯發現http爬取到的資訊較少。造成得兩種方式都用,才能既照顧速度又照顧完整性。

坑三:模擬器中的坑

APP自動識別你的執行環境進行遮蔽,最厲害的還是某信,連你是用模擬器開啟還是真機開啟,是什麼核心的,全部進行限制。曾經見過牛人,找某手機廠商專門定做真機來配合。

坑四:帳號的坑

這個坑就有點大了,要找號、養號,都不是件容易的事情,更慘的是封號,真真讓你一夜回到解放前。

4.難度評估

1.一星

此類app沒有進行特殊的防護,可以直接在網頁訪問app中請求的url
困難點:無

2.二星

此類app使用的cookie和session等技術,對資料的請求需要cookie等資訊
困難點:
1、請求頭需要附帶cookie值

3.三星

此類app在發起請求時,在headers中新增md5驗證欄位,該欄位對請求的url的引數進行特殊的處理然後進行hash;如果想爬這類app,需要對app進行反向編譯,經過大量的程式碼閱讀,分析該app的hash演算法和引數拼接;
困難點:
1、反編譯
2、Android程式碼的閱讀能力
3、花費大量時間和精力也不一定能找到,這是最蛋疼的。。。。

4.四星

此類app對請求發起url請求,後臺收到請求後在返回的資料中,針對有效資料進行加密,所以在用抓包工具進行分析時,無法看到具體的資料;如果想爬取這類app,只能先去反編譯,然後分析出如何對請求資料加密的演算法,只有完成了演算法的破解才能進行資料的分析。
困難點:
1、無法通過抓包工具對所需資料進行分析
2、反編譯
3、Android程式碼的閱讀能力,尋找加密資料的演算法
3、花費大量時間和精力也不一定能找到,這是最蛋疼的。。。。

5.工具

1. 抓包工具

mac系統 Wireshark
Mac系統 charles
windows Fiddler

2.反編譯

Apktool,dex2jar,jd-gui-windows
Jadx-gui
能直接反編譯dex檔案,方便好用
JD-GUI
需要將dex檔案轉到jar檔案,可以跳轉函式
JEB
用的較少
3.hook 工具
Xposed
Frida


TiToData:專業的短視訊、直播資料介面服務平臺,網址: TiToData

覆蓋主流平臺:抖音,快手,小紅書,TikTok,YouTube