1. 程式人生 > >使用mitmdump爬取手機

使用mitmdump爬取手機

作業系統:window 10
python 版本:python 3.6.5
抓包工具fiddler、mitmproxy

工具介紹

fiddler就不介紹了,是常用的抓包工具。這裡介紹一下mitmproxy。
mitmproxy是一個支援HTTP和HTTPS的抓包程式,有類似於Fiddler、Charles的功能,只不過它是一個控制檯的形式操作。

mitmproxy還有兩個關聯元件。一個是mitmdump,它是mitmproxy的命令列介面,利用它我們可以對接Python指令碼,用Python實現監聽後的處理。另一個就是mitmweb,它是一個Web程式,通過它我們可以清楚的觀察mitmproxy捕獲的請求。

背景說明

工作需求,需要抓取一些國內熱門軟體的app內的內容,由於這些app存在很高的反爬機制,對url進行了各種加密,試了一段時間,難度太大就放棄了。改用mitmproxy中間人的特性獲取所需資訊。

準備工作

確保已經安裝好了fiddler和mitmproxy,並且手機和PC處於同一區域網下,同時配置好fiddler和mitmproxy的CA證書。

1.fiddler抓包

fiddler運行於自己的PC上,代理埠8888,手機設定PC的IP及8888埠代理。抓取軟體為抖音,需要抓取的內容為點贊後收藏的視訊。找到收藏列表的api;

2.分析json資料

在fiddler上分析api上的json資料找到需要的欄位,獲取無水印視訊地址、封面地址和視訊名稱,程式碼如下:

import json
import random
import pymysql


def response(flow):
    url = 'https://api.amemv.com/aweme/v1/aweme/favorite/'
    if flow.request.url.startswith(url):
        text = flow.response.text
        data = json.loads(text)

        for item in data['aweme_list']:
            desc1 = item['desc']
            if desc1 == ' ' or len(desc1) == 0:
                desc1 = 'adsf' + str(random.randint(1, 9999))
            if '@抖音小助手' in desc1:
                desc1 = desc1.replace('@抖音小助手', '')
            video_url = item['video']['play_addr']['url_list'][0]
            cover_url = item['video']['cover']['url_list'][0]
            print(video_url,cover_url,desc1)

3.mitmdump執行指令碼

命令:mitmdump -s xxx.py
進入抖音,點選收藏列表手動滑動,在控制檯可以看見輸出的視訊地址、圖片地址及名稱。

4.存入資料庫

將獲取的資訊存入mysql資料庫,程式碼省略;

5.下載視訊程式碼

編寫下載視訊的py檔案,這個檔案是需要部署在伺服器上的,從mysql中取地址進行下載。

import os
from urllib.request import urlretrieve
import pymysql

conn = pymysql.connect(
                host='xxxxxx',
                port=3306,
                user='root',
                db='xxxx',
                password='xxxxxxx',
                charset='utf8mb4' #可以儲存文字表情
            )

cursor = conn.cursor()

sql = "select video_url,cover_url,desc1 from xxx"
cursor.execute(sql.encode('utf8'))
data = cursor.fetchall()
for item in data:
    video_url = item[0]
    cover_url = item[1]
    desc1 = item[2]
    path = 'xxxxx'
    if not os.path.exists(path):
        os.mkdir(path)

    video_path = path + '/' + desc1 + '.mp4'
    cover_path = path + '/' + desc1 + '.jpg'
    try:
        if not os.path.exists(video_path):
            urlretrieve(video_url, video_path)
            print(desc1,'視訊下載完成')
        else:
            print(desc1, '該視訊已經下載')
    except OSError:
        print(desc1,'該視訊下載失敗')
    try:
        if not os.path.exists(cover_path):
            urlretrieve(cover_url, cover_path)
            print(desc1,'該封面下載完成')
        else:
            print(desc1, '該封面已經下載')
    except OSError:
        print(desc1,'該封面下載失敗')
conn.close()

這樣在本地獲取地址,存入資料庫,伺服器上的爬蟲在進行下載,雖然操作麻煩了點,但是可以避開需要破解加密的步驟。我這裡由於是隻下載收藏的列表,所以手動滑動,如果量大或者下載首頁的視訊,可以試一下用Appium實現自動化,關於Appium有時間再寫。