1. 程式人生 > >爬取手機app

爬取手機app

本文轉自:https://blog.csdn.net/c406495762/article/details/76850843



1 前言

    暑假回家,”小皇帝”般的生活持續了幾天,頭幾天還挺舒服,閒久了頓時覺得好沒意思。眼看著10天的假期就要結束,曾信誓旦旦地說要回家學習,可拿回家的兩本書至今一頁未翻,強烈的負罪感一直催促著:”你該學習了,你該學習了…”

    我之前的爬蟲部落格,爬的都是網頁的資訊,什麼下載小說啊,下載動漫啊,下載帥哥圖、妹子圖啊。玩這些東西的時候,你想過爬取手機APP裡面的東西嗎?


2 實戰背景

    程式設計師的鄙視鏈,您聽說過嗎?話說:老婆漂亮的程式設計師,鄙視老婆不漂亮的程式設計師;有老婆的程式設計師,鄙視沒有老婆的程式設計師;沒有老婆有女朋友的程式設計師,鄙視單身狗;在單身狗之間,才有語言、編輯器和作業系統的互相鄙視。不知為何,看到這句話的時候,我的內心陣陣絞痛。現在看看,這遊戲也是如此。玩星際的,鄙視玩dota的;玩dota的,鄙視玩lol的;玩lol的,鄙視玩王者榮耀的。雖說王者榮耀處於遊戲鄙視鏈的低端,但是不得不說,它確實有自己獨到的魅力,正因為它降低了玩家的門檻,才有瞭如今的全民王者的熱潮。你永遠不知道自己匹配的隊友和對手是老人,還是小孩。或者換種說法,是人,還是動物?

    毫無疑問,王者榮耀從全民熱度等諸多表現上看,是非常成功的遊戲。可謂男女老少通吃,本文不討論到底是女大學生坑,還是小學生坑,這樣高難度的問題。咱玩點簡單的,讓我先看一款王者榮耀神器-王者榮耀盒子。《王者榮耀盒子》是專門為《王者榮耀》玩家量身打造的一款攻略應用,可謂上分必備神器,這裡有職業選手教你英雄出裝、銘文搭配和各種對線團戰技巧,同時它也整合最全的遊戲諮詢以及遊戲實時動態。先看看它長什麼樣:

    APP下載地址:APP下載–>點我

    本節課的內容,就是爬取《王者榮耀盒子》這款APP上的資訊,廢話不多說,直接開始實戰!


3 準備工作

1 什麼是Fiddler?

    Fiddler是位於客戶端和伺服器端的HTTP代理,也是目前最常用的http抓包工具之一 。 它能夠記錄客戶端和伺服器之間的所有 HTTP請求,可以針對特定的HTTP請求,分析請求資料、設定斷點、除錯web應用、修改請求的資料,甚至可以修改伺服器返回的資料,功能非常強大,是web除錯的利器。

    既然是代理,也就是說:客戶端的所有請求都要先經過Fiddler,然後轉發到相應的伺服器,反之,伺服器端的所有響應,也都會先經過Fiddler然後傳送到客戶端,基於這個原因,Fiddler支援所有可以設定http代理為127.0.0.1:8888的瀏覽器和應用程式。使用了Fiddler之後,web客戶端和伺服器的請求如下所示:

    利用可以設定代理的這個特點,我們就可以對手機APP進行抓包了。怎麼設定?不急不急,讓我先把Fiddler安裝上吧!

     Fiddler下載地址:Fiddler下載–>點我

    傻瓜式安裝,一鍵到底。Fiddler軟體介面如圖所示:

2 手機APP抓包設定

1 Fiddler設定

    開啟Fiddler軟體,開啟工具的設定。(Fiddler軟體選單欄:Tools->Options)

    在HTTPS中設定如下:

    在Connections中設定如下,這裡使用預設8888埠,當然也可以自己更改,但是注意不要與已經使用的埠衝突:

2 安全證書下載

    在電腦瀏覽器中輸入地址:http://localhost:8888/,點選FiddlerRoot certificate,下載安全證書:

3 安全證書安裝

    證書是需要在手機上進行安裝的,這樣在電腦Fiddler軟體抓包的時候,手機使用電腦的網絡卡上網才不會報錯。

    將下載好的FiddlerRoot.cer安裝證書拷貝到手機中,然後進行證書安裝(以小米5手機為例),設定(Settings)->(系統和裝置中的)更多設定->系統安全->從儲存裝置安裝:

    然後找到拷貝的FiddlerRoot.cer進行安裝即可。安裝好之後,可以在信任的憑證中找到我們已經安裝好的安全證書,在使用者中可以看到證書如下:

4 區域網設定

    想要使用Fiddler進行手機抓包,首先要確保手機和電腦的網路在一個內網中,可以使用讓電腦和手機都連線同一個路由器。當然,也可以讓電腦開放WIFI熱點,手機連入。這裡,我使用的方法是,讓手機和電腦同時連入一個路由器中。最後,讓手機使用電腦的代理IP進行上網。

    首先,檢視電腦的IP地址,在cmd中使用命令ipconfig檢視電腦IP地址。找到無線區域網WLAN的IPv4地址,記下此地址。

    在手機上,點選連線的WIFI進行網路修改,新增代理。進行手動設定,主機名即為上圖中找到的IP地址,埠號即為Fiddler設定中的埠號8888:

5 Fiddler手機抓包測試

    上述步驟都設定完成之後,用手機瀏覽器開啟百度首頁,我們就可以順利抓包了,截圖如下:


點選放大圖片


4 實戰走起

1 下載英雄圖片

    先來個簡單的例子熱熱身,我想將《英雄聯盟盒子》中的英雄圖片下載下來,該如何操作?

    先使用Fiddler抓包看一下,在手機APP《英雄聯盟盒子》中的選單中點選英雄,電腦Fiddler就會抓包如下:


點選放大圖片

    可以看到,GET請求的url地址,和返回的JSON格式的資訊。那麼編寫程式碼如下:

#-*- coding: UTF-8 -*-
import requests

if __name__ == '__main__':   
    headers = {'Accept-Charset': 'UTF-8',
            'Accept-Encoding': 'gzip,deflate',
            'User-Agent': 'Dalvik/2.1.0 (Linux; U; Android 6.0.1; MI 5 MIUI/V8.1.6.0.MAACNDI)',
            'X-Requested-With': 'XMLHttpRequest',
            'Content-type': 'application/x-www-form-urlencoded',
            'Connection': 'Keep-Alive',
            'Host': 'gamehelper.gm825.com'}
    heros_url = "http://gamehelper.gm825.com/wzry/hero/list?channel_id=90009a&app_id=h9044j&game_id=7622&game_name=%E7%8E%8B%E8%80%85%E8%8D%A3%E8%80%80&vcode=12.0.3&version_code=1203&cuid=2654CC14D2D3894DBF5808264AE2DAD7&ovr=6.0.1&device=Xiaomi_MI+5&net_type=1&client_id=1Yfyt44QSqu7PcVdDduBYQ%3D%3D&info_ms=fBzJ%2BCu4ZDAtl4CyHuZ%2FJQ%3D%3D&info_ma=XshbgIgi0V1HxXTqixI%2BKbgXtNtOP0%2Fn1WZtMWRWj5o%3D&mno=0&info_la=9AChHTMC3uW%2BfY8%2BCFhcFw%3D%3D&info_ci=9AChHTMC3uW%2BfY8%2BCFhcFw%3D%3D&mcc=0&clientversion=&bssid=VY%2BeiuZRJ%2FwaXmoLLVUrMODX1ZTf%2F2dzsWn2AOEM0I4%3D&os_level=23&os_id=dc451556fc0eeadb&resolution=1080_1920&dpi=480&client_ip=192.168.0.198&pdunid=a83d20d8"
    req = requests.get(url = heros_url, headers = headers).json()
    print(req['list'])
  

        從程式碼執行結果中可以看到,百里玄策的英雄ID為104,他的圖片存放地址為http://pic.wankacn.com/2017-08-04_59844776a6adf.png


    點選放大圖片

        知道了這些資訊,我們就可以將這些英雄的圖片進行下載了,編寫程式碼如下:

    #-*- coding: UTF-8 -*-
    from urllib.request import urlretrieve
    import requests
    import os
    
    """
    函式說明:下載《英雄聯盟盒子》中的英雄圖片
    
    Parameters:
        heros_url - GET請求地址,通過Fiddler抓包獲取
        header - header資訊
    Returns:
        無
    Author:
        Jack Cui
    Blog:
        http://blog.csdn.net/c406495762
    Modify:
        2017-08-07
    """
    def hero_imgs_download(heros_url,header):
        req = requests.get(url = heros_url, headers = header).json()
        hero_num = len(req['list'])
        print('一共有%d個英雄' % hero_num)
        hero_images_path = 'hero_images'
        for each_hero in req['list']:
            hero_photo_url = each_hero['cover']
            hero_name = each_hero['name'] + '.jpg'
            filename = hero_images_path + '/' + hero_name
            if hero_images_path not in os.listdir():
                os.makedirs(hero_images_path)
            urlretrieve(url = hero_photo_url, filename = filename)
    
    if __name__ == '__main__':   
        headers = {'Accept-Charset': 'UTF-8',
                'Accept-Encoding': 'gzip,deflate',
                'User-Agent': 'Dalvik/2.1.0 (Linux; U; Android 6.0.1; MI 5 MIUI/V8.1.6.0.MAACNDI)',
                'X-Requested-With': 'XMLHttpRequest',
                'Content-type': 'application/x-www-form-urlencoded',
                'Connection': 'Keep-Alive',
                'Host': 'gamehelper.gm825.com'}
        heros_url = "http://gamehelper.gm825.com/wzry/hero/list?channel_id=90009a&app_id=h9044j&game_id=7622&game_name=%E7%8E%8B%E8%80%85%E8%8D%A3%E8%80%80&vcode=12.0.3&version_code=1203&cuid=2654CC14D2D3894DBF5808264AE2DAD7&ovr=6.0.1&device=Xiaomi_MI+5&net_type=1&client_id=1Yfyt44QSqu7PcVdDduBYQ%3D%3D&info_ms=fBzJ%2BCu4ZDAtl4CyHuZ%2FJQ%3D%3D&info_ma=XshbgIgi0V1HxXTqixI%2BKbgXtNtOP0%2Fn1WZtMWRWj5o%3D&mno=0&info_la=9AChHTMC3uW%2BfY8%2BCFhcFw%3D%3D&info_ci=9AChHTMC3uW%2BfY8%2BCFhcFw%3D%3D&mcc=0&clientversion=&bssid=VY%2BeiuZRJ%2FwaXmoLLVUrMODX1ZTf%2F2dzsWn2AOEM0I4%3D&os_level=23&os_id=dc451556fc0eeadb&resolution=1080_1920&dpi=480&client_ip=192.168.0.198&pdunid=a83d20d8"
        hero_imgs_download(heros_url,headers)
      

          執行上述程式碼,看下結果,72個英雄的圖片,分分鐘搞定:

          是不是很簡單?接下來,再玩一個加點難度的。

      2 英雄推薦出裝查詢助手

          點選百里玄策這個英雄,可以看到,裡面有他的簡介,包括技能介紹,以及推薦出裝等。那麼,我們就了利用這個做一個自己的英雄出裝查詢小助手吧。

          手機點選百里玄策這個英雄,可以在電腦Fiddler看到如下抓包內容:


      點選放大圖片

          我們看下GET請求的URL:

      http://gamehelper.gm825.com/wzry/hero/detail?hero_id=104&channel_id=90009a&app_id=h9044j&game_id=7622&game_name=%E7%8E%8B%E8%80%85%E8%8D%A3%E8%80%80&vcode=12.0.3&version_code=1203&cuid=2654CC14D2D3894DBF5808264AE2DAD7&ovr=6.0.1&device=Xiaomi_MI+5&net_type=1&client_id=1Yfyt44QSqu7PcVdDduBYQ%3D%3D&info_ms=fBzJ%2BCu4ZDAtl4CyHuZ%2FJQ%3D%3D&info_ma=XshbgIgi0V1HxXTqixI%2BKbgXtNtOP0%2Fn1WZtMWRWj5o%3D&mno=0&info_la=9AChHTMC3uW%2BfY8%2BCFhcFw%3D%3D&info_ci=9AChHTMC3uW%2BfY8%2BCFhcFw%3D%3D&mcc=0&clientversion=&bssid=VY%2BeiuZRJ%2FwaXmoLLVUrMODX1ZTf%2F2dzsWn2AOEM0I4%3D&os_level=23&os_id=dc451556fc0eeadb&resolution=1080_1920&dpi=480&client_ip=192.168.0.198&pdunid=a83d20d8
        

            很有特點發現了嗎?在url的hero_id為104,在上個小例項中,我們發現,這個104正好是英雄的id,那麼是不是可以通過設定這個id來訪問不同的英雄介面呢?測試一下答案就出來了,我們將id改為103,也就是女媧的hero_id,編寫程式碼如下:

        #-*- coding: UTF-8 -*-
        import requests
        
        if __name__ == '__main__':   
            headers = {'Accept-Charset': 'UTF-8',
                    'Accept-Encoding': 'gzip,deflate',
                    'User-Agent': 'Dalvik/2.1.0 (Linux; U; Android 6.0.1; MI 5 MIUI/V8.1.6.0.MAACNDI)',
                    'X-Requested-With': 'XMLHttpRequest',
                    'Content-type': 'application/x-www-form-urlencoded',
                    'Connection': 'Keep-Alive',
                    'Host': 'gamehelper.gm825.com'}
            hero_url = "http://gamehelper.gm825.com/wzry/hero/detail?hero_id={}&channel_id=90009a&app_id=h9044j&game_id=7622&game_name=%E7%8E%8B%E8%80%85%E8%8D%A3%E8%80%80&vcode=12.0.3&version_code=1203&cuid=2654CC14D2D3894DBF5808264AE2DAD7&ovr=6.0.1&device=Xiaomi_MI+5&net_type=1&client_id=1Yfyt44QSqu7PcVdDduBYQ%3D%3D&info_ms=fBzJ%2BCu4ZDAtl4CyHuZ%2FJQ%3D%3D&info_ma=XshbgIgi0V1HxXTqixI%2BKbgXtNtOP0%2Fn1WZtMWRWj5o%3D&mno=0&info_la=9AChHTMC3uW%2BfY8%2BCFhcFw%3D%3D&info_ci=9AChHTMC3uW%2BfY8%2BCFhcFw%3D%3D&mcc=0&clientversion=&bssid=VY%2BeiuZRJ%2FwaXmoLLVUrMODX1ZTf%2F2dzsWn2AOEM0I4%3D&os_level=23&os_id=dc451556fc0eeadb&resolution=1080_1920&dpi=480&client_ip=192.168.0.198&pdunid=a83d20d8".format('103')
            req = requests.get(url = hero_url, headers = headers).json()
            print(req['info'])
          

              執行上述程式碼,我們可以看到,列印的資訊確實是英雄女媧的資訊,返回的資訊顯示,這個英雄還沒有上線。推薦出裝儲存在equip_choice中,可以看到這裡沒有給出裝備的名字,只有裝備的equip_id,那麼在寫推薦出裝小程式之前,我們需要獲取所有裝備的ID。


          點選放大圖片

              怎樣獲取武器的資訊?抓包方法同上,點選裝備大全:

              通過Fiddler抓包資訊,編寫程式碼如下:

          #-*- coding: UTF-8 -*-
          import requests
          
          if __name__ == '__main__':   
              headers = {'Accept-Charset': 'UTF-8',
                      'Accept-Encoding': 'gzip,deflate',
                      'User-Agent': 'Dalvik/2.1.0 (Linux; U; Android 6.0.1; MI 5 MIUI/V8.1.6.0.MAACNDI)',
                      'X-Requested-With': 'XMLHttpRequest',
                      'Content-type': 'application/x-www-form-urlencoded',
                      'Connection': 'Keep-Alive',
                      'Host': 'gamehelper.gm825.com'}
              weapon_url = "http://gamehelper.gm825.com/wzry/equip/list?channel_id=90009a&app_id=h9044j&game_id=7622&game_name=%E7%8E%8B%E8%80%85%E8%8D%A3%E8%80%80&vcode=12.0.3&version_code=1203&cuid=2654CC14D2D3894DBF5808264AE2DAD7&ovr=6.0.1&device=Xiaomi_MI+5&net_type=1&client_id=1Yfyt44QSqu7PcVdDduBYQ%3D%3D&info_ms=fBzJ%2BCu4ZDAtl4CyHuZ%2FJQ%3D%3D&info_ma=XshbgIgi0V1HxXTqixI%2BKbgXtNtOP0%2Fn1WZtMWRWj5o%3D&mno=0&info_la=9AChHTMC3uW%2BfY8%2BCFhcFw%3D%3D&info_ci=9AChHTMC3uW%2BfY8%2BCFhcFw%3D%3D&mcc=0&clientversion=&bssid=VY%2BeiuZRJ%2FwaXmoLLVUrMODX1ZTf%2F2dzsWn2AOEM0I4%3D&os_level=23&os_id=dc451556fc0eeadb&resolution=1080_1920&dpi=480&client_ip=192.168.0.198&pdunid=a83d20d8"
              req = requests.get(url = weapon_url, headers = headers).json()
              print(req['list'])
            

                這樣我們就輕鬆得到了各個裝備的資訊:


            點選放大圖片

                到這裡,我們就可以整合程式碼了,首先通過獲取每個英雄的ID,然後根據每個英雄的ID,再獲得英雄的詳細資訊,包括推薦出裝,最後通過推薦的裝備ID,找到裝備的資訊並打印出來。

                根據實現效果,自己編寫程式碼試一試如何?《王者榮耀》出裝小助手,執行效果如圖所示:

                如果功能已經實現了,那麼先恭喜一聲!


            5 總結

            • 本文的例子沒有什麼實際價值,不過對於入門手機APP內容的爬取有一定的幫助作用。
            • 趁著《王者榮耀盒子》APP沒有更新,很好爬,趕緊動手實踐吧!
            • 爬取APP的內容和爬取網頁的思路是一樣的,都是通過抓包進行分析。


            更多案例及完整程式碼請關注“思享會Club”公眾號或者關注思享會部落格:http://gkhelp.cn/

            在這裡插入圖片描述