一、app爬取
前面都是介紹爬取Web網頁的內容,隨着移動互聯網的發展,越來越多的企業並沒有提供Web頁面端的服務,
而是直接開發了App,更多信息都是通過App展示的
App爬取相比Web端更加容易 反爬蟲能力沒有那么強,而且數據大多數是以JSON形式傳遞的 解析更加簡單
在Web端 我們可以通過瀏覽器開發者工具 監聽到各個網絡請求和響應過程 在App端 查看內容就需要抓包軟件
例如 WireShark Fiddler Charles mitmproxy AnyProxy等 它們原理基本相同
可以通過設置代理的方式將手機處於抓包軟件的監聽下 就可以看到App運行過程中發生的所有請求和響應
相當於分析Ajax一樣
如果參數程序是有規律的 直接用程序模擬爬取即可
如果沒有規律 可以通過mitmdump 對接Python腳本 處理response
如果需要自動化 可以使用Appium
1.charles的使用
簡介 : 是一個網絡抓包工具 可以用它來做app抓包分析 類似Web瀏覽器的開發者工具
安裝 官網:
https://www.charlesproxy.com
下載地址 :
https://www.charlesproxy.com/dowload
默認安裝即可
charles 是收費軟件 免費試用30天
證書配置
現在很多頁面都在向HTTPS方向發展 HTTPS通信協議應用越來越廣泛 如果一個App通信應用了HTTPS協議
那么它的通信數據都會被加密 常規的截包方法無法識別內部數據
需要配置SSL證書
Charles是運行在PC端的 抓取的是App端的數據 所以PC和移動端都要安裝證書
PC端安裝證書
打開charles 點擊Help -> SSL Proxying -> Install Charles Root Certificate 進入安裝證書的頁面
點擊安裝證書 點擊下一步 選擇將所有證書放入下列存儲 點擊瀏覽 選擇存儲位置為 受信任的根證書頒發機構 點擊確定
如果報錯 存儲已滿 或者只讀 解決辦法
win+R 輸入mmc 點擊文件 添加刪除管理單元
點擊證書 點擊添加 選擇計算機賬戶 下一步 確定
重新導入證書
移動端安裝證書
首先保證手機和電腦在同一局域網 (有網線的情況下) 手機設置選擇wifi 手動代理 添加charles的ip和端口
設置完電腦會彈出是否信任此設備 點擊allow即可
手機瀏覽器(盡量不要用默認的瀏覽器 可以使用QQ瀏覽器)打開chls.pro/ssl 給證書添加個名字 點擊確定就能完成證書的安裝
手機訪問互聯網 數據包會流經charles charles再轉發數據包到真實服務器 服務器在返回數據包 流經charles
在轉發給手機
設置好charles並且配置好證書
示例 打開京東 選一個商品 打開商品評論頁面 不斷下拉加載評論
左側會有一個api.m.jd.com 點擊其中一條 切換到contents選項卡 可以看到JSON數據 核對結果 和app上看到的內容一致
這樣就捕獲到了在上拉刷新的請求和響應內容
重發 charles另一個強大功能可以將捕獲的請求加以修改並重新發送
可以用來做調試
2.mitmproxy的使用
是一個支持HTTP和HTTPS的抓包程序類似Fiddler charles 只不過是一個控制台形式操作
mitmproxy還有兩個相關組件 mitmdump 命令行接口 利用它可以對接python腳本
另一個是mitmweb 一個web程序 通過它可以清楚觀察捕獲的請求
安裝
下載地址:
https://github.com/mitmproxy/mitmproxy/releases
默認安裝即可
證書配置
啟動mitmdump 找到mitmproxy文件下ca證書 雙擊mitmproxy-ca.pl2 默認下一步即可
選擇將所有證書放入下列存儲 點擊瀏覽 選擇存儲位置為 受信任的根證書頒發機構 點擊確定
手機 將文件發送到手機 點擊安裝
通過 手機微信助手 發送 mitmproxy-ca-cert.cer 手機點擊wifi 高級設置 安裝證書 默認download 返回上一級 內部存儲空間
tencent -> MicroMsg -> Download 點擊安裝
運行 mitmdump 是mitmproxy的命令行接口 同時可以對接python腳本
示例:
可以使用命令啟動mitmproxy 例如 mitmdump -w outfile 截獲的數據都會被保存到此文件中
指定腳本來處理截獲的數據 使用-s參數
mitmdump -s test.py
腳本文件內容如下
def request(flow): flow.request.headers['User-Agent'] = 'MitmProxy' print(flow.request.headers)
這里 定義一個request() 方法 參數為flow 通過request屬性獲取當前請求對象 打印輸出請求的請求頭
將User-Agent修改成了MitmProxy
手機端訪問 http://httpbin.org/get
日志輸出
mitmdump 提供了專門的日志傳輸系統 可以設定不同顏色輸出結果 修改腳本如下:
確保安裝好mitmproxy pip install mitmproxy
from mitmproxy import ctx def request(flow): flow.request.headers['User-Agent'] = "MitmProxy" ctx.log.info(str(flow.request.headers))#輸出白色 ctx.log.warn(str(flow.request.headers))#輸出黃色 ctx.log.error(str(flow.request.headers))#輸出紅色
request
示例
from mitmproxy import ctx def request(flow): request = flow.request info = ctx.log.info info(request.url) info(str(request.headers)) info(str(request.cookies)) info(request.host) info(request.method) info(str(request.post)) info(request.scheme)
修改腳本 手機打開百度 分別輸出 請求鏈接 請求頭 cookies host 請求方法 端口 協議
同時還可以對任意屬性進行修改 就像最初修改Headers一樣 直接賦值
示例:
def request(flow): url = 'https://httpbin.org/get' flow.request.url = url
更多屬性參考 http://docs.mitmproxy.org/en/latest/scripting/api.html
響應
response() 方法
示例:
from mitmproxy import ctx def response(flow): response = flow.response info = ctx.log.info info(str(response.status_code)) info(str(response.headers)) info(str(response.cookies)) info(str(response.text))
打印出響應狀態碼 headers cookies 網頁源代碼等
