1. 程式人生 > >Python爬取手機APP

Python爬取手機APP

之前寫了一個自動簽到的指令碼,我姐本來讓我給她寫一個手機app自動簽到的指令碼的,後來發現自己不會爬手機app,現在抽時間找了教程,看完教程後來爬一下手機app試一試。在爬手機app時先要安裝的的軟體是Fiddler :

  1. 下載地址: https://pan.baidu.com/s/1dQx4-ADztgKTCK__uG7xUw 密碼: r8kg
  2. 安裝好Fiddler後開啟.exe檔案,開始配置,首先點選"tools" -> "Teletik Fiddler Options",按照下面圖進行配置
  3. 將下載的證書傳到手機上,並進行安裝

​​​​​​​

我的手機是華為nova2,安裝的時候是從資料夾搜尋並安裝的,我也不知道為什麼不能在系統安全那直接安裝。

安裝好證書後,修改手機WLAN的配置 ,並且手機與電腦需要保證在同一區域網中。需要修改的是 : 將所連WiFi的代理改為手動,伺服器主機名一項填寫自己電腦的IP地址,伺服器埠一項填寫8888(因為Fiddler一般預設埠是8888),然後儲存。就可以開始抓包了。開啟一個手機app,這裡選的是王者榮耀盒子,會看到Fiddler中出現很多資訊,只需挑選有用的即可 :

左邊選中的連結是顯示英雄頁面,右下方可以對比手機頁面,可以看是否將所有的英雄顯示。接下來將英雄資訊爬取下來 :

import requests

def main():
    headers = {
    	# 將Fiddler右上方的內容填在headers中
        "Accept-Charset": "UTF-8",
        "Accept-Encoding": "gzip,deflate",
        "User-Agent": "Dalvik/2.1.0 (Linux; U; Android 7.0; HUAWEI CAZ-TL10 Build/HUAWEICAZ-TL10)",
        "X-Requested-With": "XMLHttpRequest",
        "Content-type": "application/x-www-form-urlencoded",
        "Connection": "Keep-Alive",
        "Host": "gamehelper.gm825.com"
    }
    # 右上方有個get請求,將get後的網址賦給heros_url
    heros_url = "http://gamehelper.gm825.com/wzry/hero/list?channel_id=90001a&app_id=h9044j&game_id=7622&game_name=%E7%8E%8B%E8%80%85%E8%8D%A3%E8%80%80&vcode=13.0.1.0&version_code=13010&cuid=F6DFAFC3BED1C29825EC8D404110F5C5&ovr=7.0&device=HUAWEI_HUAWEI+CAZ-TL10&net_type=1&client_id=&info_ms=&info_ma=hoeVma%2BgYmXjgZG7TVJzaoLyRRILGMIaVltuIflvZFE%3D&mno=0&info_la=mh%2FAbS1DsM0kM7IDlFIbYQ%3D%3D&info_ci=mh%2FAbS1DsM0kM7IDlFIbYQ%3D%3D&mcc=0&clientversion=13.0.1.0&bssid=zRqQJG5mLlFy6mYG4YA%2BE0UcqUCBAXmZcXNHROzwWy8%3D&os_level=24&os_id=c0be30adbd11c768&resolution=1080_1788&dpi=480&client_ip=192.168.2.114&pdunid=WWUDU16A29002522"
    # 英雄的列表顯示在json格式下
    res = requests.get(url=heros_url, headers=headers).json()
    # 列印列表
    print(res['list'])
    # 計算有多少個英雄
    print(len(res['list']))

if __name__ == "__main__":
    main()

上述程式碼可以將英雄爬下來,下面是執行結果 (上面還有好多):

 可以觀察到,每個英雄的圖片也各自的字典的"cover"下,接下來將圖片下載到電腦 :

import requests
import os
from urllib.request import urlretrieve

# 右上方有個get請求,將get後的網址賦給heros_url
heros_url = "http://gamehelper.gm825.com/wzry/hero/list?channel_id=90001a&app_id=h9044j&game_id=7622&game_name=%E7%8E%8B%E8%80%85%E8%8D%A3%E8%80%80&vcode=13.0.1.0&version_code=13010&cuid=F6DFAFC3BED1C29825EC8D404110F5C5&ovr=7.0&device=HUAWEI_HUAWEI+CAZ-TL10&net_type=1&client_id=&info_ms=&info_ma=hoeVma%2BgYmXjgZG7TVJzaoLyRRILGMIaVltuIflvZFE%3D&mno=0&info_la=mh%2FAbS1DsM0kM7IDlFIbYQ%3D%3D&info_ci=mh%2FAbS1DsM0kM7IDlFIbYQ%3D%3D&mcc=0&clientversion=13.0.1.0&bssid=zRqQJG5mLlFy6mYG4YA%2BE0UcqUCBAXmZcXNHROzwWy8%3D&os_level=24&os_id=c0be30adbd11c768&resolution=1080_1788&dpi=480&client_ip=192.168.2.114&pdunid=WWUDU16A29002522"


def imgs_download(heros_url, headers):
    res = requests.get(url=heros_url, headers=headers).json()
    hero_path = "heros_img"
    for hero in res['list']:
        img_url = hero['cover']
        hero_name = hero['name'] + ".png"
        filename = hero_path + "/" + hero_name
        if hero_path not in os.listdir():
            os.makedirs(hero_path)
        urlretrieve(url=img_url, filename=filename)


def main():
    headers = {
        # 將Fiddler右上方的內容填在headers中
        "Accept-Charset": "UTF-8",
        "Accept-Encoding": "gzip,deflate",
        "User-Agent": "Dalvik/2.1.0 (Linux; U; Android 7.0; HUAWEI CAZ-TL10 Build/HUAWEICAZ-TL10)",
        "X-Requested-With": "XMLHttpRequest",
        "Content-type": "application/x-www-form-urlencoded",
        "Connection": "Keep-Alive",
        "Host": "gamehelper.gm825.com"
    }
    # 英雄的列表顯示在json格式下
    # res = requests.get(url=heros_url, headers=headers).json()
    # 列印列表
    # print(res['list'])
    # 計算有多少個英雄
    # print(len(res['list']))
    imgs_download(heros_url, headers)


if __name__ == "__main__":
    main()

上述是下載圖片的原始碼,下載有點慢,部分結果如下圖 (是按照拼音首字母排序,本來最新的一個是司馬懿的):

 接下來就是列印每個英雄的歷史背景與使用技巧,個人覺得英雄出裝和銘文這種東西得靠自己摸索(說實話是我懶得我爬他的銘文和推薦出裝了)

import requests
# import os
# from urllib.request import urlretrieve

# 右上方有個get請求,將get後的網址賦給heros_url
heros_url = "http://gamehelper.gm825.com/wzry/hero/list?channel_id=90001a&app_id=h9044j&game_id=7622&game_name=%E7%8E%8B%E8%80%85%E8%8D%A3%E8%80%80&vcode=13.0.1.0&version_code=13010&cuid=F6DFAFC3BED1C29825EC8D404110F5C5&ovr=7.0&device=HUAWEI_HUAWEI+CAZ-TL10&net_type=1&client_id=&info_ms=&info_ma=hoeVma%2BgYmXjgZG7TVJzaoLyRRILGMIaVltuIflvZFE%3D&mno=0&info_la=mh%2FAbS1DsM0kM7IDlFIbYQ%3D%3D&info_ci=mh%2FAbS1DsM0kM7IDlFIbYQ%3D%3D&mcc=0&clientversion=13.0.1.0&bssid=zRqQJG5mLlFy6mYG4YA%2BE0UcqUCBAXmZcXNHROzwWy8%3D&os_level=24&os_id=c0be30adbd11c768&resolution=1080_1788&dpi=480&client_ip=192.168.2.114&pdunid=WWUDU16A29002522"

def hero_info(heros_url, headers):
    res = requests.get(url=heros_url, headers=headers).json()
    for hero in res['list']:
        id = hero['hero_id']
        info_url = "http://gamehelper.gm825.com/wzry/hero/detail?hero_id=" + id + "&channel_id=90001a&app_id=h9044j&game_id=7622&game_name=%E7%8E%8B%E8%80%85%E8%8D%A3%E8%80%80&vcode=13.0.1.0&version_code=13010&cuid=F6DFAFC3BED1C29825EC8D404110F5C5&ovr=7.0&device=HUAWEI_HUAWEI+CAZ-TL10&net_type=1&client_id=UTAH2jTRdl%2FfxnOjEiOS4A%3D%3D&info_ms=%2BpdbZccbIPeH%2BTpoBwY0gw%3D%3D&info_ma=hoeVma%2BgYmXjgZG7TVJzaoLyRRILGMIaVltuIflvZFE%3D&mno=0&info_la=mh%2FAbS1DsM0kM7IDlFIbYQ%3D%3D&info_ci=mh%2FAbS1DsM0kM7IDlFIbYQ%3D%3D&mcc=0&clientversion=13.0.1.0&bssid=zRqQJG5mLlFy6mYG4YA%2BE0UcqUCBAXmZcXNHROzwWy8%3D&os_level=24&os_id=c0be30adbd11c768&resolution=1080_1788&dpi=480&client_ip=192.168.2.114&pdunid=WWUDU16A29002522"
        res = requests.get(url=info_url, headers=headers).json()
        print(hero['name'] + " : ")
        print("歷史上的他/她 : " + res['info']['history_intro'])
        print("背景故事 : " + res['info']['background_story'])
        print("對抗技巧 : " + res['info']['hero_tips'])
        print("團戰思想 : " + res['info']['melee_tips'] + "\n")


def main():
    headers = {
        # 將Fiddler右上方的內容填在headers中
        "Accept-Charset": "UTF-8",
        "Accept-Encoding": "gzip,deflate",
        "User-Agent": "Dalvik/2.1.0 (Linux; U; Android 7.0; HUAWEI CAZ-TL10 Build/HUAWEICAZ-TL10)",
        "X-Requested-With": "XMLHttpRequest",
        "Content-type": "application/x-www-form-urlencoded",
        "Connection": "Keep-Alive",
        "Host": "gamehelper.gm825.com"
    }
    hero_info(heros_url, headers)


if __name__ == "__main__":
    main()

上述程式碼將app中描述英雄的背景與實戰技巧打印出來,具體結果例項如下 :

以上就是爬取手機app資訊的內容,自己也還是處於入門階段,所以只有先試水一下這種簡單一點。