爬蟲的案例我們已講得太多。不過幾乎都是 網頁爬蟲 。即使有些手機才能訪問的網站,我們也可以通過 Chrome 開發者工具 的 手機模擬 功能來訪問,以便於分析請求並抓取。(比如 3分鐘破譯朋友圈測試小遊戲 文章裡用的方法)
但有些 App 根本就沒有提供網頁端,比如今年火得不行的 抖音 。(網上有些教程也是用網頁手機模擬的方法,但此法現已失效。)
對於這種情況,我們能不能抓取?要怎麼抓取?今天就來分享一下。
手機抓包
本文的重點就在於 如何獲取手機 App 發出的請求 。
手機 App 不像電腦上的網頁能直接通過瀏覽器檢視相關資訊,在手機裝置上也不方便使用工具一邊流量一邊除錯。所以常用的方式就是通過在電腦上裝一些 “抓包”軟體 ,將手機上的網路請求全部顯示出來。
那為什麼電腦能看到手機上的網路請求?這裡就要提下“ 代理 ”這個概念。我們之前的文章 聽說你好不容易寫了個爬蟲,結果沒抓幾個就被封了? 中也講過代理。形象的解釋就是字面的理解: 所有你發出的請求不再是直接發到目的地,而是先發給這個代理,再由代理幫你發出 。所以通過代理,可以實現 隱藏 IP、進入專用網路、翻…咳咳那啥 等功能,也包括我們今天說的: 手機抓包 。
順帶說句,在公共場所別隨便連不確定的免費 wifi,理論上來說,人家也可以抓你的包。
這裡,我們要用的工具是 Fiddler 。它是一個較成熟的免費抓包工具。可以抓取網頁、桌面軟體、手機 App 的網路請求,並可以執行在 Windows、Mac、Linux 平臺上,支援 iOS 和 Android。(雖說都支援,但強烈建議 Windows + Android ,後面我會有吐槽)
上週我們的送書活動收到不少同學的專案和程式碼,其中 @離島 同學提交了一個 Fiddler 手機抓包的教程。
segmentfault.com/a/119000001…
本文中部分內容和圖片就轉自她這篇文章。她的部落格上還有不少文章和學習筆記,可以關注交流。也歡迎其他同學給我們投稿。
下載安裝
搜尋一下 fiddler 很容易找到它們的官網 www.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/ 進行安裝。
手機訪問前面設定的電腦的 IP 地址加埠 8888 訪問,比如圖中例子是:http://192.168.23.1: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 的抓取 ,關鍵是 配置、代理、證照 ,難點是 對請求的分析 。最終程式碼只有簡單兩步, 獲取視訊列表、下載視訊 。
這是我的Python交流學習裙:862672474。有任何學習不懂的困惑隨時來問我,學專業知識記得多跟有經驗的人交流,這樣可以少走很多彎路,看看曾經別人走過的彎路,給自己節省很多時間。