抖音的資料抓取與資料背後的淘寶
分析的背景
截至今年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其中的一個達人帖子的列表
某個達人的帖子列表頁面
電腦開啟:http://localhost:8002/ 可以看到流經手機所有的資料,其中當然也包含了抖音APP的資料. 可以看見抖音達人的帖子連結
做一下URL的條件過濾:https://api-hl.amemv.com/aweme/v1/aweme/post/
通過這個分析可以看到每一篇帖子都有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的簽名機制,感興趣自己慢慢研究。。。。反正我是研究出來了哈哈哈哈
具體的爬下來的資料我放在百度雲,連結如下:有興趣的可以看一下
連結:https://pan.baidu.com/s/1O5CYJeJYiL6uB7e56_WPUA 密碼:1abc
以上就是抖音資料的抓取過程,以及延伸至淘寶的過程,大致的思路
- 抖音APP通過anyproxy來獲取抖音達人所有的帖子
- 分析帖子裡面推廣的商品的ID,根據商品的ID來獲取店鋪相關的資訊
- 分析一個達人到底在推廣哪些商品,和那一些店鋪在合作。
- 通過大規模的資料抓取以分析,就可以分析出那些店鋪在抖音做大規模的推廣
關於呼呼:會點爬蟲,會點後端,會點前端,會點資料分析,會點演算法,一個喜歡陳奕迅的