python3編寫網絡爬蟲19-app爬取


一、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 網頁源代碼等


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM