1. 程式人生 > >如何用Python抓抖音上的小姐姐

如何用Python抓抖音上的小姐姐

爬蟲的案例我們已講得太多。不過幾乎都是網頁爬蟲。即使有些手機才能訪問的網站,我們也可以通過 Chrome 開發者工具手機模擬功能來訪問,以便於分析請求並抓取。(比如 3分鐘破譯朋友圈測試小遊戲 文章裡用的方法)

但有些 App 根本就沒有提供網頁端,比如今年火得不行的抖音。(網上有些教程也是用網頁手機模擬的方法,但此法現已失效。)

對於這種情況,我們能不能抓取?要怎麼抓取?今天就來分享一下。

手機抓包

本文的重點就在於如何獲取手機 App 發出的請求

手機 App 不像電腦上的網頁能直接通過瀏覽器檢視相關資訊,在手機裝置上也不方便使用工具一邊流量一邊除錯。所以常用的方式就是通過在電腦上裝一些“抓包”軟體

,將手機上的網路請求全部顯示出來。

那為什麼電腦能看到手機上的網路請求?這裡就要提下“代理”這個概念。我們之前的文章 聽說你好不容易寫了個爬蟲,結果沒抓幾個就被封了? 中也講過代理。形象的解釋就是字面的理解:所有你發出的請求不再是直接發到目的地,而是先發給這個代理,再由代理幫你發出。所以通過代理,可以實現隱藏 IP、進入專用網路、翻…咳咳那啥等功能,也包括我們今天說的:手機抓包

順帶說句,在公共場所別隨便連不確定的免費 wifi,理論上來說,人家也可以抓你的包。

這裡,我們要用的工具是 Fiddler。它是一個較成熟的免費抓包工具。可以抓取網頁、桌面軟體、手機 App 的網路請求,並可以執行在 Windows、Mac、Linux 平臺上,支援 iOS 和 Android。(雖說都支援,但強烈建議 Windows Android

,後面我會有吐槽)

上週我們的送書活動收到不少同學的專案和程式碼,其中 @離島 同學提交了一個 Fiddler 手機抓包的教程。
segmentfault.com/a/1190
本文中部分內容和圖片就轉自她這篇文章。她的部落格上還有不少文章和學習筆記,可以關注交流。也歡迎其他同學給我們投稿。

下載安裝

搜尋一下 fiddler 很容易找到它們的官網 telerik.com/fiddler,點選 download 下載即可(有個表格隨便填下)。

Windows 下載後正常安裝。如果是 Mac,還會有安裝步驟提示,告訴你需要先安裝一個叫做 Mono 的框架,以便可以執行 Fiddler.exe。另外 Mac 版還有幾個小坑:

1. 執行 mono 命令用 sudo

2. 如果報一堆錯閃退,請用 mono --arch=32 Fiddler.exe(這個引數還必須放在檔名前面)

3. 第一次正確執行時,程式會卡住很長時間,以至於我以為還是掛了,這時請耐心等待。(我要不是正好有事走開,回來發現成功了,可能就放棄嘗試了)

4. 即使正常運行了,Mac 上介面也會有各種顯示的 bug,切記不要開啟的彈窗的情況下切換程式,不然回來就找不到彈窗了……

5. 軟體中無法複製……

6. 在 iOS 上無法抓取 HTTPS 請求(這基本就是廢了),需要額外建立一個證書,但這個證書工具只能在 Windows 下執行……

所以可以的話,還是用 Windows 來做。Mac 上還有個比較知名的工具 Charles,有用過的可以留言評價下。

配置

安裝好工具後,需要做一些必要配置才能抓包。

1. Fiddler 配置

設定允許抓取 HTTPS 資訊包。開啟下載好的 fiddler,找到 Tools -> Options,然後在 HTTPS 的工具欄下勾選 Decrpt HTTPS traffic,在新彈出的選項欄下勾選 Ignore server certificate errors。這樣,fiddler 就會抓取到 HTTPS 的資訊包。

設定允許外部裝置傳送 HTTP/HTTPS 到 fiddler。設定埠號,並在 Connections 選項欄下勾選 Allow remote computers to connect

配置好後需重啟軟體。

2. 設定手機代理

在抓包前,確保你的電腦和手機是在一個可以互訪的區域網中。最簡單的情況就是都連在同一個 wifi 上,特殊情況這裡不展開討論(有些商用 wifi 並不能互訪)。

開啟軟體,滑鼠放在右上角的 Online 上可以看到本機的 IP。或者也可以通過命令列中的 ipconfig 命令(Mac/Linux 是 ifconfig)檢視。(截圖僅為演示,以你自己的 IP 為準)

手機設定代理 IP。開啟手機無線網路連線,選擇已經連線的網路連線,點選一個小圓圈歎號進入可以看到下圖(安卓也類似),選擇配置代理,進入後把剛剛的 IP 地址輸入進去,就是 fiddler 中設定的 8888。

3. 安裝證書

獲取 HTTPS 請求必須要驗證證書。電腦端訪問:http://localhost:8888/ 進行安裝。

有些安卓需要手動從設定裡進入並匯入證書,否則無法生效。

4. 測試

開啟 fiddler 的狀態下,開啟手機隨便一個 APP,應對可以正常訪問,並且在 fiddler 中看到所發出的網路請求。

如果能訪問但看不到請求,確認下有沒有代理有沒有生效。如果不能訪問,檢查下證書是否都下載並驗證。還是不行則按照上述步驟再仔細配置一遍。

分析請求

完成這一步之後,接下來的事情就和網頁爬蟲沒太大區別了。無非就是從這些請求中,找到我們需要的那幾個。

fiddler 裡記錄的是所有請求,比較多。在操作 App 前,記得清空已有請求,方便觀察。然後再配合上 filter 篩選器,定義篩選規則,會較容易找你需要的內容。找到請求後,在軟體裡檢視你要的資訊,或者右鍵點選選擇將請求匯出。

經過操作 觀察,可以定位到獲取使用者上傳視訊列表的請求是

https://api.amemv.com/aweme/v1/aweme/post/?…

WebForms 欄裡可以檢視請求的詳細引數資訊。返回值是一個組 JSON 資料,裡面包含了視訊的下載地址。

這是一個需要經驗積累的活兒,不同的網站/App,規則都不一樣,但套路是相似的。對網頁爬蟲還不熟悉的話,先看看之前的文章 爬蟲必備工具,掌握它就解決了一半的問題

程式碼抓取

得到地址之後,經過在瀏覽器和程式碼裡的一番嘗試,找到了此請求的正確解鎖方式:

1. 需要提供以下引數:max_cursor=0&user_id=94763945245&count=20&aid=1128,其中 user_id 是你要抓取的使用者 ID,其他引數都可以固定不用改。

2. 需要使用手機的 User-Agent,最簡單的就是 {'user-agent': 'mobile'}

請求程式碼:

import requests as rs
uid = 94763945245
url = 'https://api.amemv.com/aweme/v1/aweme/post/?max_cursor=0&user_id=%d&count=20&aid=1128' % uid
h = {'user-agent': 'mobile'}
req = rs.get(url, headers=h, verify=False)
data = req.json()
print(data)

uid 替換成你想抓的使用者 ID。獲取使用者 ID 有個簡單方法:在使用者頁面選擇分享,連結發到微信上,從網頁開啟就可以看到 user_id。

提取視訊列表並下載:

import urllib.request
for video in data['aweme_list']:
    name = video['desc'] or video['aweme_id']    
    url_v = video['video']['download_addr']['url_list'][0]
    print(name, url_v, '\n')
    urllib.request.urlretrieve(url_v, name  '.mp4')

此方法截止國慶假期還是有效的,可以通過 Chrome 開發者工具進行模擬。之後能使用多久這就沒法保證了,爬蟲程式碼都不會是一勞永逸的。

總結下,重點是 fiddler 的抓取,關鍵是 配置、代理、證書,難點是 對請求的分析。最終程式碼只有簡單兩步,獲取視訊列表、下載視訊

所有程式碼其實就上面兩段,也上傳了,獲取地址請在公眾號(Crossin的程式設計教室)回覆關鍵字 抖音
想看其他十多個專案程式碼例項(電影票、招聘、貪吃蛇、代理池等),回覆關鍵字 專案

下課!

歡迎微信搜尋及關注:Crossin的程式設計教室