分析的背景
截至今年7月,抖音日活已突破3.2億。抖音總裁張楠預測,到2020年,國內短視頻行業的總日活用戶數,將達到10億。抖音推出多元變現方式,要讓1000萬創做者賺到錢 ,抖音說要讓這1000萬創做者賺到錢,其中變現的方式有不少種,我今天主要是想分享抖音背後的淘寶產業鏈,咱們刷抖音視頻的過程當中,咱們會發現有些視頻是在推廣淘寶的商品,這個就是創做者變現的渠道之一,從淘寶店鋪角度來講,抖音達人幫其推廣商品,須要付給達人必定的廣告費用;從淘寶角度來講,淘寶有一個叫淘寶聯盟的平臺,每個幫淘寶推銷商品的人,淘寶聯盟將其定義爲淘寶客,只要淘寶客推廣的商品有人購買,那麼淘寶聯盟會支付給淘寶客必定比例的佣金。簡而言之,抖音達人有兩部分收入:淘寶商家的廣告費+淘寶聯盟的佣金(交易成功的前提下)。本文主要分析抖音達人發帖到淘寶之間的過程。html
抖音的帖子
帖子的正文前端
咱們能夠看到左下角有一個購物車的標示。沒錯,他就是淘寶商品的連接,點擊打開以下java
這個就是達人帖子推廣的商品,點擊便可跳到淘寶APPnode
綜上所述,咱們能夠抓取某個達人的列表數據來分析背後的商品數據,從而能夠獲得對應的淘寶店鋪的數據。python
抖音APP抓包
本次使用的iphone 的抖音version8.0.0的版本,anyproxy做爲代理的抓包工具mysql
anyproxy是阿里巴巴開發的一個優秀的代理的輪子,固然啦,國外還有一個mitmproxygit
anyproxy 的安裝教程能夠參考:github
https://link.zhihu.com/?target=https%3A//www.jianshu.com/p/d978d3b8f2aa
anyproxy 的官方連接: 貌似須要穩定的國際網絡環境才能夠訪問算法
https://link.zhihu.com/?target=http%3A//anyproxy.io
anyproxy 的項目地址:sql
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
本文爲做者原創,我一個一個字打出來的,嚶嚶,如需轉載請註明原文連接
本文的目的只有一個就是學習爬蟲技術,若是有人利用本文技術進行非法操做帶來的後果都是操做者本身承擔,和本文以及本文做者沒有任何關係。
原文出處:https://www.cnblogs.com/nn839155963/p/11557411.html