分析的背景
截至今年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來獲取店鋪相關的信息
- 分析一個達人到底在推廣哪些商品,和那一些店鋪在合作。
- 通過大規模的數據抓取以分析,就可以分析出那些店鋪在抖音做大規模的推廣
關於呼呼:會點爬蟲,會點后端,會點前端,會點數據分析,會點算法,一個喜歡陳奕迅的👨
here can contact me
本文為作者原創,我一個一個字打出來的,嚶嚶,如需轉載請注明原文鏈接
本文的目的只有一個就是學習爬蟲技術,如果有人利用本文技術進行非法操作帶來的后果都是操作者自己承擔,和本文以及本文作者沒有任何關系。