1. 爬取前的分析
mitmdump
是mitmproxy的命令列介面,比Fiddler、Charles等工具方便的地方是它可以對接Python指令碼。
有了它我們可以不用手動截獲和分析HTTP請求和響應,只需寫好請求和響應的處理邏輯即可。
它還可以實現資料的解析、儲存等工作,這些過程都可以通過Python實現。
1.1 啟動mitmdump 儲存到檔案
使用命令
mitmdump -w crawl.txt
複製程式碼
其中 crawl.txt 可以為任意檔名,就可以儲存相應的結果了
1.2 呼叫指令碼檔案
mitmdump -s script.py
複製程式碼
script.py 檔案中編寫如下程式碼
# 修改UA
def request(flow):
flow.request.headers['User-Agent'] = 'MitmProxy'
print(flow.request.headers)
複製程式碼
在夜神模擬器中開啟http://httpbin.org/get
出現如下內容
手機惠農APP
,看一下如何去捕獲相應的請求
2. 捕獲手機惠農APP請求
這個地方千萬不要單獨依賴mitmdump,要不你會直接卡死的,你可以採用mitmweb,開啟APP之後,等待一會,點選一個選單進入。比如點選下面的供應大廳。
之後在mitmweb中捕獲到列表頁的資料連線,儲存地址 https://truffle.cnhnb.com/banana/supply/query/list 方便進行後續的操作。3. 完善script指令碼
指令碼主要有兩部分構成,資料獲取與資料儲存,資料獲取要注意,當訪問的url匹配到剛才的地址的時候,就表示可以進行處理了
from mitmproxy import ctx
import json
import pymongo
# def request(flow):
# #flow.request.headers['User-Agent'] = 'MitmProxy'
# print(flow.request.headers)
def response(flow):
start_url = "https://truffle.cnhnb.com/banana/supply/query/list"
response = flow.response
info = ctx.log.info
if flow.request.url.startswith(start_url):
text = response.text
data = json.loads(text)
save(data)
def save(data):
DATABASE_IP = '127.0.0.1'
DATABASE_PORT = 27017
DATABASE_NAME = 'sun'
client = pymongo.MongoClient(DATABASE_IP, DATABASE_PORT)
db = client.sun
db.authenticate("dba", "dba")
collection = db.huinong # 準備插入資料
print(data["data"]["datas"])
collection.insert_many(data["data"]["datas"])
複製程式碼
實現的效果
注意,現在還沒有設定手機自動操作,所以操作是我手動滑動的。左側資料已經成功的捕獲到了。
4. 入庫效果
資料儲存到mongodb中,在處理就比較簡單了
5. 其他說明
mitmdump提供了專門的日誌輸出功能,可以設定不同級別以不同顏色輸出結果。 ctx模組有log功能,呼叫不同的輸出方法就可以輸出不同顏色的結果,以方便我們做除錯。
ctx.log.warn(str(flow.request.query))
ctx.log.error(str(flow.request.headers))
複製程式碼
更多的指令碼例子,可以去參考。
https://github.com/mitmproxy/mitmproxy/tree/master/examples/simple
後續,我們將嘗試將剛才的手動滑動修改成自動操作......
歡迎關注 非本科程式設計師 公眾賬號