當前位置:首頁 » 手機資訊 » 怎樣爬取手機app上的數據
擴展閱讀

怎樣爬取手機app上的數據

發布時間: 2023-03-29 05:16:21

① 爬取某筆公考app公基題庫的操作

最近在准備上岸,備考中需做大量的練習,手機APP讓練習無處不在,但有個缺點,就是每次只能練習10-20道題目,不能用題海戰術,海量做題。能不能把網站的題庫及解析都弄下來,在本地電腦上做題呢?以下是我的思路:1、分析並爬取手機軟體的題庫;2、調整好格式存入xls文件中;3、導入PC版可自定義的考試系統中(如教之初考試系統免費版);4、自行設置考試模式,海量練習。

倒騰了兩天,終於搞定,後續再更新文章!

涉及到幾個點。

1、關於手機網路數據的分析,我是用Fiddler 4進行的分析。

2、關於excel表格的操控,之前想用xlwings模塊,後因沒裝office,用的是wps2013政府閹割版,無法操控,後改用xlrd、xlutils、shutil、os模塊自己寫了一個excel操縱類對象,發現還是有問題,後卸載閹割版wps,換了wps2016最新版的,就可以操作了。後來也沒換xlwings模塊了,將就著用自寫模塊。 大坑:xlrd模塊好像不支持中文路徑,全部換用英文路徑,最後再把文件夾及文纖顫和件名轉換成中文的。

3、題庫分類保存。

1、Fiddler抓包手機APP的網路請求

Fiddler是一款非常流行並且實用的http抓包工具,它的原理是在本機開啟了一個http的代理伺服器,然後它會轉發所有的http請求和響應,不僅如此,它還洞豎可以支持請求重放等一些高級功能。顯然它是可以支持對手機應用進行http抓包的。

設置在同一區域網下電腦端Fiddler抓取手機APP應用網路請求的步驟:

(1)電腦端啟動Fiddler,打開菜單欄中的 Tools > Fiddler Options,打開「Fiddler Options」對話框。

(2)在Fiddler Options」對話框切換到「Connections」選項卡,然後勾選「Allow romote computers to connect」後面毀盯的復選框,然後點擊「OK」按鈕。( 小技巧: HTTPS標簽中可以設置下拉框為...from remote clients only , 貌似 就只接收遠程端的網路請求了)

(3)在電腦端的命令行輸入:ipconfig,找到本機的ip地址。(我的區域網IP:192.168.1.10)

(4)在手機端,打開android設備的「設置」->「WLAN」,找到你要連接的網路,在上面長按,然後選擇「修改網路」,彈出網路設置對話框,然後勾選「顯示高級選項」。 (其實蘋果手機也是類似的)

(5)在「代理」後面的輸入框選擇「手動」,在「代理伺服器主機名」後面的輸入框輸入電腦的ip地址,在「代理伺服器埠」後面的輸入框輸入8888,然後點擊「保存」按鈕。

(6)然後啟動android設備中的APP應用,在fiddler中可以看到完整的請求和響應數據。

2、手機APP應用網路數據分析

手機上打開某筆公考軟體後,從Fiddler左側欄中可以看到大量的請求鏈接。

點擊上圖黃色區域的鏈接,可看到右側詳細數據。

在右側詳細數據欄中,我們可以看到請求的網址:POST http:// xxx bi.com/android/sydw/exercises?&platform=android22&version=6.4.3&vendor=Tencent&app=gwy&deviceId=F4J/K8kXx6+C24yqFuzAiA==&av=8&kav=3 HTTP/1.1

post請求的參數keypointId=621638&type=3&limit=15

返回的數據為Json格式,從返回數據中我們可以找出questionIds對應的題目編號,如2084744.

點擊上上圖(Fiddler網路請求響應)中紅色框中的鏈接地址,我們可以看到右側詳細數據欄的數據

從上圖中我們可以找到ID號為2084744的題目的題干、選項、題型、答案等有用數據。

分析基本結束,此手機APP應用的模式基本是這樣:先請求15道題的ids,再根據meiti的ids請求題目相關數據。後續測試發現,請求questionIds時,修改參數,能一次最多請求到100道題的ids。

另外,從左側請求鏈接可以找出對應的章節分類請求鏈接,根據分類號再查找對應的questionids,就可以把所有的題目抓取出來。

3、xls操控

將就著基於xlrd模塊編寫自用模塊。

源碼在此,可能格式錯亂。需整理。

'''python

#!/usr/bin/env python3

# -*- coding: utf-8 -*-

"""

Created on 2018-05-14 12:48:07

@author: wangzheng

Sys_Env : Windows_AMD64 Python3.5.2

Wechat : hrcl2015(微信)

Filename: MyXls.py

Description : xls文件操控類MyXls

            注意:文件路徑中不能有中文名,否則出錯

"""

from xlrd import open_workbook

from xlutils. import

import os,shutil

class MyXls:

    def __init__(self,fpath=None,modelfpath=None,sheetindex=None,protectrow=None,overwrite=True):

        self.openxlspath=''#已打開的xls文件

        self.sheetindex=None#當前工作表索引

        self.rb=None#

        self.wb=None#workbook工作簿

        self.ws=None#worksheet工作表

        self.headrow=0#開頭保護行數

        if (fpath is not None) and (modelfpath is not None):

            self.open__xls(modelfpath,fpath,True)

        elif fpath is not None:self.open_xls(fpath)

        if sheetindex is not None:self.get_sheet(sheetindex)

        if protectrow is not None:self.headrow=protectrow

    def open_xls(self,fpath):

        path=fpath

        try:

            rb = open_workbook(path)

        except Exception as err:

            print("File not exists: "+str(err))

            return False

        #通過sheet_by_index()獲取的sheet沒有write()方法

        #rs = rb.sheet_by_index(0)

        #rs = rb.sheet_by_name('sheet 1')

        self.wb = (rb)

        self.openxlspath=path

        return True

    def get_sheet(self,sheet_index=0):

        sheets=sheet_index

        #通過get_sheet()獲取的sheet有write()方法

        self.ws = self.wb.get_sheet(sheets)

        self.sheetindex=sheets

    def write_xls(self,row_index,column_index,data_str):

        row,col,data=row_index,column_index,data_str

        #寫入數據

        self.ws.write(row,col,data)#write(行,列,內容),索引從0開始

    def write_xls_bycolname(self,row_index,column_name,data_str):

        column_index=self.colname_to_num(column_name)

        row,col,data=row_index,column_index,data_str

        #寫入數據

        self.ws.write(row,col,data)#write(行,列,內容),索引從0開始

    def write_xls_bysheet(self,sheetindex,row_index,column_name,data_str):

        '''在指定工作表的指定行列表格中寫入數據'''

        if self.sheetindex != sheetindex :self.get_sheet(sheetindex)

        self.write_xls_bycolname(row_index,column_name,data_str)

    def save_xls(self,fpath=None):

        if fpath is None:

            self.wb.save(self.openxlspath)

            print('saved '+self.openxlspath)

        else:

            path=fpath

            self.wb.save(path)#保存xls文件

            print('saved '+path)

        return True

    def open__xls(self,model_fpath,new_fpath,overwrite=True):

        '''參照模板文件,復制並打開xls文件'''

        if os.path.exists(model_fpath) :

            new_fpath=self.auto_mkdir(new_fpath)

            if (not os.path.exists(new_fpath)) or overwrite:

                #print('[%s]to[%s]'%(model_fpath,new_fpath))

                shutil.(model_fpath,new_fpath)

                return self.open_xls(new_fpath)

            else:print('新文件已存在,請修改新文件名!');return False

        else:print('模板文件不存在,不能復制到新文件!');return False

    def num_to_colname(self,col_index,start=0):

        #列索引轉列名,基數start從0開始,0-->A

        if type(col_index) != int:

            return col_index

        if start==0:

            x=col_index+1

        elif start==1:

            x=col_index

        s=''

        flag=False#借位標志

        while x>26:

            y=x%26#取餘0-25

            if y==0:y=26;flag=True;

            d=chr(y+64)#低位

            s=d+s

            x=x//26#整除取商

            if flag:x=x-1;flag=False;#如果借位,商要先-1

        g=chr(x+64)#高位

        s=g+s

        return s

    def colname_to_num(self,colname,start=0):

        #列名轉列索引 A-->0,B->1,開始基數start為0

        if type(colname) is not str:

            return colname

        colname=colname.upper()#轉成大寫

        col = 0

        power  = 1

        #print(len(colname))#位數

        for i in range(len(colname) - 1, -1, -1):#range(start=0,stop,step=1)

            ch = colname[i] #倒序取字母

            #print(ch)#所在位上的字母

            col += (ord(ch) - ord('A') +  1 ) * power

            power *= 26

        #print(col-1)

        if start==0:return col-1

        if start==1:return col

    def auto_mkdir(self,fpath):

        '''自動補全目錄,目錄不存在就創建目錄'''

        #fpath='D:\\MyPython\\粉筆公考題庫提取\\678\\980\\test.txt'

        fpath=fpath.replace('\\','/')

        if not os.path.exists(fpath):

            plst=fpath.split(sep='/')

            path=''

            if not fpath.endswith('/'):plst=plst[:-1]

            for p in plst:

                path=path+p+'/'

                if not os.path.exists(path):os.mkdir(path)

            return fpath

if __name__=='__main__':

    model_fpath='D:\\MyPython\\model.xls'

    new_fpath='D:\\MyPython\\abc\\123/out.xls'

#    myxls=MyXls()

#    myxls.open__xls(model_fpath,new_fpath)

#    myxls.get_sheet(0)

    myxls=MyXls(new_fpath,model_fpath,2,3)

    myxls.write_xls_bycolname(6,'K','K列6行數據')

#    myxls.save_xls(new_fpath)

    myxls.save_xls()

    pass

'''

4、文件保存

保存成xls文件,和txt文件,txt文件再轉換成word文檔列印出來。大概有7個大類,100+小類,12737道題。

5、導入題庫軟體

xls文件導入題庫中。

6、大功告成

PS:某筆app更新後,加入了防抓取數據的功能,貌似安卓5.1以上的都不能抓取了。

據資深網友反應,使用安卓模擬器(系統版本4.4)還可以抓到明文數據,有興趣的讀者可以試一試。

② python 怎麼爬取app端數據

可以,但是不提倡這種行為 1,在手機上設置代理,代理到你的電腦上 2,再在電腦上用tcpmp或者其他圖形化的抓包工具獲得數據包,分析這些數據包找到你要的數據 3,根據前兩步的結果,寫代碼模擬app的操作獲得你需要的數據

③ 4種Python爬蟲(4. 手機APP,如,樂刻運動)

目錄:
1. PC網頁爬蟲
2. H5網頁爬蟲
3. 微信小程序爬蟲
4. 手機APP爬蟲

爬取樂刻運動手機APP的課表數據。Android和iOS都可以。坦渣

要制定具體方案,還是要從抓包分析開羨信碧始。
如果你在前一章《三、微信小程序爬蟲》中已經搭建好了Charles+iPhone的抓包環境,可以直接啟動「樂刻APP」再來抓一波。

LefitAppium.py

LefitMitmAddon.py

接下來就是見證奇跡的時刻了!
可以看到左側的手機已經自動跑起來了!
所有流過的數據都盡在掌握!

這個方案的適應能力非常強,兄舉不怕各種反爬蟲機制。
但是如果要去爬取淘寶、攜程等海量數據時,肯定也是力不從心。

④ 爬蟲可以爬取手機上app應用中的內容嗎例如新聞、商品信息、用戶信息等等。

搜索引緩羨擎爬蟲不能抓取app應用中的內容。
搜索引擎爬蟲只可以抓擾讓拍取pc或者一定網頁內容。網路爬蟲是一種自動獲取網頁內容的程序,是搜索引擎的重要滑森組成部分。

⑤ App中的數據可以用網路爬蟲抓取么

可以,你可以用抓包,然後通過代理ip的方式,讓你的手機和電腦處在唯笑一個網指州含絡,然後通過發送請求的方式跡扒去獲取

⑥ 不用root手機直接查看APP資料庫文件

1.首先進入shell,打開命令行終端,輸入:

2.進入指定app的正雀余舉滾data目錄:

3.進入到目錄後,可以運行「ls」命令查看文件列表,如果想要將某個文件拷貝到電腦上歲正可以使用以下命令:

4.退出adb shell或重新打開一個命令行窗口:

5.拷貝到電腦後可以通過命令行的方式"sqlite3"查看也可以通過工具查看,往下就不寫具體的了。

⑦ 如何爬取京東手機上萬的商品數據,這個神器可以幫你

Charles是一個網路抓包工具,我們可以用它來做App的抓包分析,得到App運行過程中發生的所有網路請求和響應內容,這就和Web端瀏覽器的開發者工具Network部分看到的結果一致。

相比Fiddler來說,Charles的功能更強大,而且跨平台支持更好。所以我們選用Charles作為主要的移動端抓包工具,用於分析移動App的數據包,輔助完成App數據抓碧檔取工作。

一、本節目標

本節我們以京東App為例,通過Charles抓取App運行過程中的網路數據包,然後查看具體的Request和Response內容,以此來了解Charles的用法。

二、准備工作

請確保已經正確安裝Charles並開啟了代理服務,手機和Charles處於同一個區域網下,Charles代理和CharlesCA證書設置好。

三、原理

首先Charles運行在自己的PC上,Charles運行的時候會在PC的8888埠開啟一個代理服務,這個服務實際上是一個HTTP/HTTPS的代理。

確保手機和PC在同一個區域網內,我們可以使用手機模擬器通過虛擬網路連接,也可以使用手機真機和PC通過無線網路連接。

設置手機代理為Charles的代理地址,這樣手機訪問互聯網的數據包就會流經Charles,Charles再轉發這些數據包到真實的伺服器,伺服器返回的數據包再由Charles轉發回手機,Charles就起到中間人的作用,所有流量包都可以捕捉到,因此所有HTTP請求和響應都可以捕獲到。同時Charles還有權力對請求和響應進行修改。

四、抓包

初始狀態下Charles的運行界面如下圖所示。

Charles會一直監聽PC和手機發生的網路數據包,捕獲到的數據包就會顯示在左側,隨著時間的推移,捕獲的數據包越來越多,左側列表的內容也會越來越多。

可以看到,圖中左側顯示了Charles抓取到的請求站點,我們點擊任意一個條目便可以查看對應請求的詳細信息,其中包括Request、Response等內容。

接下來清空Charles的抓取結果,點擊左側的掃帚按鈕即可清空當前捕獲到的所有請求。然後點擊第二個監聽按鈕,確保監聽按鈕是打開的,這表示Charles正在監聽App的網路數據流,如下圖所示。

這時打開手機京東,注意一定要提前設置好Charles的代理並配置好CA證書,否則沒有效果。

打開任意一個商品,如iPhone,然後打開它的商品評論頁面,如下圖示。

不斷上拉載入評論,可以看到Charles捕獲到這個過程中京東App內發生的所有網路請求,如下圖所示。

左側列表中會出現一個api.m.jd.com鏈接,而且它在不停閃動,很可能就是當前App發出的獲取評論數據的請求被Charles捕獲到了。我們點擊將其展開,繼續上拉刷新評論。隨著上拉的進行,此處又會出現一個個網路請求記錄,這時新出現的數據包請求確定就是獲取評論的請求。

為了驗證其正確性,我們點擊查看其中一個條目的詳情信息。切換到Contents選項卡,這時我們發現一些JSON數據,核對一下結果,結果有commentData欄位,其內容和我們在App中看到的評論內容一致,如下圖所示。

這時可以確定,此請求對應的介面就是獲取商品評論的介面。這樣我們就成功捕獲到了在上拉刷新的過程中發生的請求和響應內容。

五、分析

現在分析一下這個請求和響應的詳細信息。首先可以回到Overview選項卡,上方顯示了請求的介面URL,接著是響應狀態Status Code、請求方式Method等,悔裂亂如下圖所示。

這個結果和原本在源伏Web端用瀏覽器開發者工具內捕獲到的結果形式是類似的。

接下來點擊Contents選項卡,查看該請求和響應的詳情信息。

上半部分顯示的是Request的信息,下半部分顯示的是Response的信息。比如針對Reqeust,我們切換到Headers選項卡即可看到該Request的Headers信息,針對Response,我們切換到JSON TEXT選項卡即可看到該Response的Body信息,並且該內容已經被格式化,如下圖所示。

由於這個請求是POST請求,我們還需要關心POST的表單信息,切換到Form選項卡即可查看,如下圖所示。

這樣我們就成功抓取App中的評論介面的請求和響應,並且可以查看Response返回的JSON數據。

至於其他App,我們同樣可以使用這樣的方式來分析。如果我們可以直接分析得到請求的URL和參數的規律,直接用程序模擬即可批量抓取。

六、重發

Charles還有一個強大功能,它可以將捕獲到的請求加以修改並發送修改後的請求。點擊上方的修改按鈕,左側列表就多了一個以編輯圖標為開頭的鏈接,這就代表此鏈接對應的請求正在被我們修改,如下圖所示。

我們可以將Form中的某個欄位移除,比如這里將partner欄位移除,然後點擊Remove。這時我們已經對原來請求攜帶的Form Data做了修改,然後點擊下方的Execute按鈕即可執行修改後的請求,如下圖所示。

可以發現左側列表再次出現了介面的請求結果,內容仍然不變,如下圖所示。

刪除Form表單中的partner欄位並沒有帶來什麼影響,所以這個欄位是無關緊要的。

有了這個功能,我們就可以方便地使用Charles來做調試,可以通過修改參數、介面等來測試不同請求的響應狀態,就可以知道哪些參數是必要的哪些是不必要的,以及參數分別有什麼規律,最後得到一個最簡單的介面和參數形式以供程序模擬調用使用。

七、結語

以上內容便是通過Charles抓包分析App請求的過程。通過Charles,我們成功抓取App中流經的網路數據包,捕獲原始的數據,還可以修改原始請求和重新發起修改後的請求進行介面測試。

知道了請求和響應的具體信息,如果我們可以分析得到請求的URL和參數的規律,直接用程序模擬即可批量抓取!

手機爬蟲非常有意思,而且可以爬取的數據非常多,當然還有很多東西要學。以後我也會寫一些實戰的有趣案例給大家。