抖音的數據抓取與數據背後的淘寶

  • 2019 年 10 月 3 日
  • 筆記

分析的背景

 截至今年7月,抖音日活已突破3.2億。抖音總裁張楠預測,到2020年,國內短視頻行業的總日活用戶數,將達到10億。抖音推出多元變現方式,要讓1000萬創作者賺到錢 ,抖音說要讓這1000萬創作者賺到錢,其中變現的方式有很多種,我今天主要是想分享抖音背後的淘寶產業鏈,我們刷抖音視頻的過程中,我們會發現有些視頻是在推廣淘寶的商品,這個就是創作者變現的渠道之一,從淘寶店鋪角度來說,抖音達人幫其推廣商品,需要付給達人一定的廣告費用;從淘寶角度來說,淘寶有一個叫淘寶聯盟的平台,每一個幫淘寶推銷商品的人,淘寶聯盟將其定義為淘寶客,只要淘寶客推廣的商品有人購買,那麼淘寶聯盟會支付給淘寶客一定比例的傭金。簡而言之,抖音達人有兩部分收入:淘寶商家的廣告費+淘寶聯盟的傭金(交易成功的前提下)。本文主要分析抖音達人發帖到淘寶之間的過程。

 

抖音的帖子

 

 

 

 

帖子的正文

 

我們可以看到左下角有一個購物車的標示。沒錯,他就是淘寶商品的鏈接,點擊打開如下

 

 

 

 

這個就是達人帖子推廣的商品,點擊即可跳到淘寶APP

綜上所述,我們可以抓取某個達人的列表數據來分析背後的商品數據,從而可以得到對應的淘寶店鋪的數據。

 

抖音APP抓包

 

本次使用的iphone 的抖音version8.0.0的版本,anyproxy作為代理的抓包工具

anyproxy是阿里巴巴開發的一個優秀的代理的輪子,當然啦,國外還有一個mitmproxy

anyproxy 的安裝教程可以參考:

https://link.zhihu.com/?target=https%3A//www.jianshu.com/p/d978d3b8f2aa

anyproxy 的官方鏈接: 貌似需要穩定的國際網絡環境才可以訪問

https://link.zhihu.com/?target=http%3A//anyproxy.io

anyproxy 的項目地址:

https://link.zhihu.com/?target=https%3A//github.com/alibaba/anyproxy

 

我們可以使用anyproxy和mitmproxy來作為抓包的分析工具,

anyproxy 是基於nodeJs開發的 (推薦熟悉nodeJs的人使用)

mitmproxy 是基於python開發的 (推薦熟悉python的人使用)

使用這個兩個工具主要是可以做數據的攔截與轉發,這兩者的都是利用到來中間人的攻擊的原理,後面的我們爬蟲開發也是利用這個原理。當然了單純的做數據分析,可以使用fidder和charles等常見的抓包工具。

安裝好anyproxy 需要手機設置信任證書以及代理

代理的設置,anyproxy 默認使用8001端口作為代理的端口

 

 

 設置代理

 

 

 

 

 設置信任證書

 

 

手機打開抖音APP其中的一個達人帖子的列表

 

 

 

 某個達人的帖子列表頁面

 

電腦打開: 可以看到流經手機所有的數據,其中當然也包含了抖音APP的數據.  可以看見抖音達人的帖子鏈接

做一下URL的條件過濾:

 

 

 

 

通過這個分析可以看到每一篇帖子都有simple_promotions的字段,這個字段就是攜帶推廣商品的信息,我們可以先把這個ID存到數據,再根據商品的ID來獲取到淘寶店鋪的其他信息

 

 

 

 

 

anyproxy默認的代理攔截與轉發的設置

 

 

 

這裡說明一下,默認在終端執行anyproxy -i ,anyproxy 會自動加載在/usr/local/lib/node_modules/anyproxy/lib/rule_default.js的文件,我們需要攔截抖音的數據,我們需要在其同級的目錄新建一個douyin.js 文件即可,執行anuproxy -i douyin.js,那麼anyproxy就根據douyin.js裏面的邏輯做攔截轉發的操作。這個mac的文件的默認位置,window的默認文件位置自己全局搜索一下rule_default.js即可以找到

具體的文件douyin.js代碼如下

 

  1 'use strict';    2    3 module.exports = {    4    5   summary: 'the default rule for AnyProxy',    6    7   /**    8    *    9    *   10    * @param {object} requestDetail   11    * @param {string} requestDetail.protocol   12    * @param {object} requestDetail.requestOptions   13    * @param {object} requestDetail.requestData   14    * @param {object} requestDetail.response   15    * @param {number} requestDetail.response.statusCode   16    * @param {object} requestDetail.response.header   17    * @param {buffer} requestDetail.response.body   18    * @returns   19    */   20   *beforeSendRequest(requestDetail) {   21     console.log('this is request')   22     return null;   23   },   24   25   26   /**   27    *   28    * 設置截取抖音的數據   29    * @param {object} requestDetail   30    * @param {object} responseDetail   31    */   32   *beforeSendResponse(requestDetail, responseDetail) {   33       if (requestDetail.url.indexOf('https://api-hl.amemv.com/aweme/v1/aweme/post/') >= 0) {    //抖音達人的詳細信息app端   34           const newResponse = responseDetail.response;   35           newResponse.body = newResponse.body.toString();   36           const posturl="/WebCrawler/douyin/AppUserData"   37           HttpPost(newResponse.body,requestDetail.url,posturl)   38           console.log('傳送app端達人的詳細信息')   39   40       }   41   42   43   44     return null;   45   },   46   47   48   /**   49    * default to return null   50    * the user MUST return a boolean when they do implement the interface in rule   51    *   52    * @param {any} requestDetail   53    * @returns   54    */   55   *beforeDealHttpsRequest(requestDetail) {   56     return null;   57   },   58   59   /**   60    *   61    *   62    * @param {any} requestDetail   63    * @param {any} error   64    * @returns   65    */   66   *onError(requestDetail, error) {   67     return null;   68   },   69   70   71   /**   72    *   73    *   74    * @param {any} requestDetail   75    * @param {any} error   76    * @returns   77    */   78   *onConnectError(requestDetail, error) {   79     return null;   80   },   81   82   83   /**   84    *   85    *   86    * @param {any} requestDetail   87    * @param {any} error   88    * @returns   89    */   90   *onClientSocketError(requestDetail, error) {   91     return null;   92   },   93 };   94   95   96 //傳輸數據到本地自己的服務器進行入庫存儲的操作   97 function HttpPost(json,url,path) {//將json發送到服務器,str為json內容,url為歷史消息頁面地址,path是接收程序的路徑和文件名   98     console.log("開始執行轉發操作");   99     try{  100     var http = require('http');  101     var data = {  102         json: json,  103         url: encodeURIComponent(url),  104         data:'Im jiehuhu'  105     };  106     data = require('querystring').stringify(data);  107     var options = {  108         method: "POST",  109         host: "127.0.0.1",//注意沒有http://,這是服務器的域名。  110         port: 8080,  111         path: path,//接收程序的路徑和文件名  112         headers: {  113             'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',  114             "Content-Length": data.length  115         }  116     };  117     var req = http.request(options, function (res) {  118         res.setEncoding('utf8');  119         res.on('data', function (chunk) {  120             console.log('BODY: ' + chunk);  121         });  122     });  123     req.on('error', function (e) {  124         console.log('problem with request: ' + e.message);  125     });  126  127     req.write(data);  128     req.end();  129     }catch(e){  130         console.log("錯誤信息:"+e);  131     }  132  133     console.log("轉發操作結束"+req);  134 }

 

 

 

具體的後端有一個項目來接收anyproxy 攔截轉發的數據,我這的使用的javaWeb項目名字叫做WebCrawler項目來處理請求

大體的抖音APP數據的採集流程圖如下:

 

 

這裡採用的是 java+tomcat8+mysql的技術框架,這是我一年前的技術棧 ,當然現在的我更加喜歡用mongoDB和Python,處理起來的時間比較快

也可以使用python + mongoDb 來處理anyproxy 傳送過來的數據

 

 

具體的自動化的操作部分暫時沒有完成,可以使用手機自動化測試工具Appium或者按鍵精靈

數據結果如下:抖音的部分數據

 

 

 

 

 

根據商品的ID獲取到淘寶店鋪的數據

 

 

 

 

 

根據淘寶商品的ID來獲取淘寶店鋪的信息也是需要開發一個新的爬蟲。這裡不作過多說明,難度還是有一點,商品爬蟲關鍵需要搞懂淘寶的簽名機制

淘寶H5的簽名機制,感興趣自己慢慢研究。。。。反正我是研究出來了哈哈哈哈

 

具體的爬下來的數據我放在百度雲,鏈接如下:有興趣的可以看一下

 

鏈接: 密碼:1abc

 

以上就是抖音數據的抓取過程,以及延伸至淘寶的過程,大致的思路

  • 抖音APP通過anyproxy來獲取抖音達人所有的帖子
  • 分析帖子裏面推廣的商品的ID,根據商品的ID來獲取店鋪相關的信息
  • 分析一個達人到底在推廣哪些商品,和那一些店鋪在合作。
  • 通過大規模的數據抓取以分析,就可以分析出那些店鋪在抖音做大規模的推廣

關於呼呼:會點爬蟲,會點後端,會點前端,會點數據分析,會點算法,一個喜歡陳奕迅的?

here can contact me

 

 

 

本文為作者原創,我一個一個字打出來的,嚶嚶,如需轉載請註明原文鏈接