爬蟲的案例咱們已講得太多。不過幾乎都是 網頁爬蟲 。即便有些手機才能訪問的網站,咱們也能夠經過 Chrome 開發者工具 的 手機模擬 功能來訪問,以便於分析請求並抓取。(好比 3分鐘破譯朋友圈測試小遊戲 文章裏用的方法)編程
但有些 App 根本就沒有提供網頁端,好比今年火得不行的 抖音 。(網上有些教程也是用網頁手機模擬的方法,但此法現已失效。)json
對於這種狀況,咱們能不能抓取?要怎麼抓取?今天就來分享一下。網頁爬蟲
本文的重點就在於 如何獲取手機 App 發出的請求 。segmentfault
手機 App 不像電腦上的網頁能直接經過瀏覽器查看相關信息,在手機設備上也不方便使用工具一邊流量一邊調試。因此經常使用的方式就是經過在電腦上裝一些 「抓包」軟件 ,將手機上的網絡請求所有顯示出來。api
那爲何電腦能看到手機上的網絡請求?這裏就要提下「 代理 」這個概念。咱們以前的文章 據說你好不容易寫了個爬蟲,結果沒抓幾個就被封了? 中也講過代理。形象的解釋就是字面的理解: 全部你發出的請求再也不是直接發到目的地,而是先發給這個代理,再由代理幫你發出 。因此經過代理,能夠實現 隱藏 IP、進入專用網絡、翻…咳咳那啥 等功能,也包括咱們今天說的: 手機抓包 。瀏覽器
順帶說句,在公共場所別隨便連不肯定的免費 wifi,理論上來講,人家也能夠抓你的包。微信
這裏,咱們要用的工具是 Fiddler 。它是一個較成熟的免費抓包工具。能夠抓取網頁、桌面軟件、手機 App 的網絡請求,並能夠運行在 Windows、Mac、Linux 平臺上,支持 iOS 和 Android。(雖然說都支持,但強烈建議 Windows + Android ,後面我會有吐槽)網絡
上週咱們的送書活動收到很多同窗的項目和代碼,其中 @離島 同窗提交了一個 Fiddler 手機抓包的教程。
https://segmentfault.com/a/1190000015571256
本文中部份內容和圖片就轉自她這篇文章。她的博客上還有很多文章和學習筆記,能夠關注交流。也歡迎其餘同窗給咱們投稿。
搜索一下 fiddler 很容易找到它們的官網 https://www.telerik.com/fiddler,點擊 download 下載便可(有個表格隨便填下)。框架
Windows 下載後正常安裝。若是是 Mac,還會有安裝步驟提示,告訴你須要先安裝一個叫作 Mono 的框架,以即可以執行 Fiddler.exe。另外 Mac 版還有幾個小坑:ide
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 的抓取 ,關鍵是 配置、代理、證書 ,難點是 對請求的分析 。最終代碼只有簡單兩步, 獲取視頻列表、下載視頻 。
全部代碼其實就上面兩段,也上傳了,獲取地址請在公衆號( Crossin的編程教室 )回覆關鍵字 抖音
想看其餘十多個項目代碼實例(電影票、招聘、貪吃蛇、代理池等),回覆關鍵字 項目
下課!
════
其餘文章及回答:
如何自學Python | 新手引導 | 精選Python問答 | 如何debug? | Python單詞表 | 知乎下載器 | 人工智能 | 嘻哈 | 爬蟲 | 我用Python | 高考 | requests | AI平臺
歡迎微信搜索及關注: Crossin的編程教室