記一次埋點信息服務器數據統計

背景:

讓測試人員測試一下,埋點的設備信息上報情況。

需要統計的設備字段如下:

名稱

說明

platform 操作系統平臺
adblock 防廣告軟件:通過是否能插入dom判斷
cpuCoresCpu cpu核心數:通過navigator判斷(cpu類型僅ie能獲取到,不做處理)
audio 聲卡指紋:通過window判斷
WebglVendorAndRenderer 顯卡型號:通過canvas調用獲取
ip 公網、局域網ip
webglKey webgl(不同瀏覽器不統一)
touchSupport 是否支持觸摸:通過navigator判斷,(觸碰點數目,觸碰事件)
hasLiedLanguages 是否修改語言:通過navigator判斷
scrDeviceXDPI 設備的DPI:僅ie能獲取到,不做處理
pixelDepth 顏色分辨率
colorDepth 顏色深度
doNotTrack 是否允許跟蹤

HasLiedResolution

是否修改屏幕分辨率
cookieEnabled 是否啓用cookie

BrowserName

瀏覽器名稱

timeZone 時區

MimeTypes

支持的 MIME 類型的數組(手機無)

systemLanguage

系統語言(僅ie)

BrowserLanguage

瀏覽器語言

Online

系統是否處於脫機模式
wh

屏幕分辨率:寬*高

brand

手機品牌(品牌覆蓋度待測)

執行:

訪問地址:https://testwx.aikaixin.com/vue/go

查看服務器會看到一條如下記錄:

10.10.15.9 - - [11/Feb/2020:09:30:05 +0800] "GET /s.png?Adblock=false&Audio=48000_0_1_0_2_explicit_speakers&BrowserLanguage=zh-CN&BrowserName&CookieEnabled=true&DoNotTrack=false&HasLiedLanguages=true&MimeTypes=&Online=true&TouchSupport=5_true&WebglFp=eff1c22f7a276449cca05e9be289b9ee&WebglVendorAndRenderer=Apple%20Inc.~Apple%20GPU&brand=iPhone&platform=iPhone&startTime=1581384605010&wh=375%2A667 HTTP/1.0" 200 70 "https://testwx.aikaixin.com/vue/go" "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 AliApp(DingTalk/4.7.25) com.laiwang.DingTalk/12472299 Channel/201200 language/zh-Hans-CN UT4Aplus/0.0.6 WK" "49.67.212.46"

產品經理上來就問:測試大概什麼時間能夠測試完成?

我?什麼才叫測試完成呢。

當前在老家辦公,手頭上機器有限,如何才能測出他們想要的結果,又如何將數據導出到產品經理可以看的EXCEL呢。

首先看一下服務器產生的上面這條數據,會發現有些地方被url編碼了:

去站長工具http://tool.chinaz.com/tools/urlencode.aspx 裏面先解一下碼:

10.10.15.9 - - [11/Feb/2020:09:30:05  0800] "GET /s.png?Adblock=false&Audio=48000_0_1_0_2_explicit_speakers&BrowserLanguage=zh-CN&BrowserName&CookieEnabled=true&DoNotTrack=false&HasLiedLanguages=true&MimeTypes=&Online=true&TouchSupport=5_true&WebglFp=eff1c22f7a276449cca05e9be289b9ee&WebglVendorAndRenderer=Apple Inc.~Apple GPU&brand=iPhone&platform=iPhone&startTime=1581384605010&wh=375*667 HTTP/1.0" 200 70 "https://testwx.aikaixin.com/vue/go" "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 AliApp(DingTalk/4.7.25) com.laiwang.DingTalk/12472299 Channel/201200 language/zh-Hans-CN UT4Aplus/0.0.6 WK" "49.67.212.46"

可以看到現在都顯示正常了。

當然可以手動將數據填到excel表裏,爲此還真嘗試了一下,填了兩組數據之後-------眼疼。

對在同一臺手機上,在瀏覽器,qq,微信,釘釘上打開同一個鏈接,經肉眼觀察,數據相差不大,可以初步假設其他手機上也是如此,那假如要大量的數據,用雲真機去訪問下這個鏈接,我再到服務器日誌裏將數據撈出來不就搞定收工了?

於是我百度了下,首先用衆測試了下,新用戶有免費30分鐘,但是用過之後發現巨卡。後來還是用了wetest,巨貴,扣起時間來也毫不手軟,30分鐘要19.8,然後花了兩個19.8,選用了主流品牌的幾款高端機型點擊了一下鏈接。

數據有了,接下來就是將數據導出來:cat access.log |grep "GET /s.png" > 5.log

隨便取兩條

10.10.15.9 - - [11/Feb/2020:09:30:05 +0800] "GET /s.png?Adblock=false&Audio=48000_0_1_0_2_explicit_speakers&BrowserLanguage=zh-CN&BrowserName&CookieEnabled=true&DoNotTrack=false&HasLiedLanguages=true&MimeTypes=&Online=true&TouchSupport=5_true&WebglFp=eff1c22f7a276449cca05e9be289b9ee&WebglVendorAndRenderer=Apple%20Inc.~Apple%20GPU&brand=iPhone&platform=iPhone&startTime=1581384605010&wh=375%2A667 HTTP/1.0" 200 70 "https://testwx.aikaixin.com/vue/go" "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 AliApp(DingTalk/4.7.25) com.laiwang.DingTalk/12472299 Channel/201200 language/zh-Hans-CN UT4Aplus/0.0.6 WK" "49.67.212.46"

10.10.15.9 - - [11/Feb/2020:09:30:36 +0800] "GET /s.png?Adblock=false&Audio=48000_0_1_0_2_explicit_speakers&BrowserLanguage=zh-CN&BrowserName=WeChat&CookieEnabled=true&DoNotTrack=false&HasLiedLanguages=true&MimeTypes=&Online=true&TouchSupport=5_true&WebglFp=eff1c22f7a276449cca05e9be289b9ee&WebglVendorAndRenderer=Apple%20Inc.~Apple%20GPU&brand=iPhone&platform=iPhone&startTime=1581384636223&wh=375%2A667 HTTP/1.0" 200 70 "https://testwx.aikaixin.com/vue/go" "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.10(0x17000a21) NetType/WIFI Language/zh_CN" "49.67.212.46"

第一步現將數據url解碼,將導出來的日誌文件解碼後存入到新的文件裏面

def filedecode():
    #導出log文件,通過這種命令導出cat access.log |grep "GET /s.png" > 5.log
    with open('5.log','r') as f:
        content = f.readlines()

    #將導出的文件解碼,解碼後的文件存到6.txt
    with open('6.txt','w') as f:
        for line in content:
            contentdecode = parse.unquote(line)
            f.write(contentdecode)

第二步對每一行的數據通過“&”分段,用到字符串處理split函數

datalist = line.split('&')

數據處理之後大概是這樣子的一個列表:

['10.10.15.9 - - [11/Feb/2020:09:30:05 +0800] "GET /s.png?Adblock=false','Audio=48000_0_1_0_2_explicit_speakers'.......,'wh=375*667 HTTP/1.0" 200 70 "https://testwx.aikaixin.com/vue/go" "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 AliApp(DingTalk/4.7.25) com.laiwang.DingTalk/12472299 Channel/201200 language/zh-Hans-CN UT4Aplus/0.0.6 WK" "49.67.212.46"']

可以看到列表的第一個元素和最後一個元素需要特殊處理,中間的字段是 A=B的形式。

處理第一個元素,獲取Adblock=flase:

datalist[0] = datalist[0].split('?')[1]

處理最後一個元素,獲取wh

lastdatalist = datalist[-1].split(' ')

datalist[-1] = lastdatalist[0]

我們的最終目的是將是將數據處理成一條條的字典,然後再將這些字典寫入到excel的指定位置。

將處理完成的數據轉化爲字典 將A=B的這種,A作爲字典的key值,B作爲value值,因爲數據裏有這種A=,或者A的情況,沒有B所以他的value將沒有值,這裏需要特殊處理一下,將沒有值的給他一個默認值“無數據”

            dlist = d.split('=')

            if len(dlist) == 2 and dlist[1] != '':

                dkey = dlist[0]

                dvalue = dlist[1]

            else:

                dkey = dlist[0]

                dvalue = '無數據'

            datadict[dkey] = dvalue

數據處理完成後,就是將其寫入到EXCEL表中,這裏用到的是openpyxl

表格樣式如下:

爲了使得數據靈活一些,這裏直接使用表格中第二行的值作爲key值,如果這個key值在我們處理的數據中不存在,那麼就給他默認“無數據”

這個就比較簡單了。

詳細代碼如下:

from urllib import parse
import openpyxl
from openpyxl.styles import colors,PatternFill
#讀取文件信息,進行url解碼

def filedecode():
    #導出log文件,通過這種命令導出cat access.log |grep "GET /s.png" > 5.log
    with open('5.log','r') as f:
        content = f.readlines()

    #將導出的文件解碼,解碼後的文件存到6.txt
    with open('6.txt','w') as f:
        for line in content:
            contentdecode = parse.unquote(line)
            f.write(contentdecode)


#對數據文件進行處理
def dealdata():
    #對文件解碼
    filedecode()
    #讀取需要處理的數據文件
    with open('6.txt','r') as f:
        data = f.readlines()

    #定義一個數組用於存儲處理完成的字典數據
    datadonelist = []
    #對每一行數據進行處理
    for line in data:
        #將一行的數據通過&和?符號分隔開來
        datalist = line.split('&')

        #第一次處理後,數組裏的第一個元素和最後一個元素需要進行進一步處理,獲取準確的數據
        #數組裏的第一個元素獲取Adblock
        datalist[0] = datalist[0].split('?')[1]

        #數組裏最後一個元素取wh和ip地址
        lastdatalist = datalist[-1].split(' ')
        datalist[-1] = lastdatalist[0]
        #取ip,然後將其加到數組裏去
        lastdata = "ip="+lastdatalist[-1]
        datalist.append(lastdata)

        #將數據處理成字典格式
        #1.先通過“=”分隔數據,左側爲key,右側爲value
        #2.定義一個字典用於存儲數據
        datadict = {}
        for d in datalist:
            #因爲有的字段爲空值,所以要判斷數組長度
            dlist = d.split('=')
            if len(dlist) == 2 and dlist[1] != '':
                dkey = dlist[0]
                dvalue = dlist[1]
            else:
                dkey = dlist[0]
                dvalue = '無數據'
            datadict[dkey] = dvalue
        datadonelist.append(datadict)               

    return datadonelist

#將處理好的數據寫入excel表
def writexls():
    #1.讀取excel表格數據
    wb = openpyxl.load_workbook('data.xlsx')
    #2.定位表格
    sheet1 = wb['Sheet1']
    #3.獲取最大列
    maxcolumn = sheet1.max_column
    #獲取處理好的數據
    data = dealdata()
    print(len(data))
    #從第三行開始寫入excel表,根據第二行的值來寫
    for i in range(3,len(data)+3):
        for j in range(1,maxcolumn+1):
            titlekey = sheet1.cell(2,j).value
            #需要判斷鍵值是否在字典中存在,因爲存在鍵值不存在的情況
            sheet1.cell(i,j).value = data[i-3].get(titlekey,'無數據')
    
    #對結果數據進行標識處理,將無數據的標黃
    fillcolor = PatternFill(fill_type='solid',fgColor=colors.YELLOW)
    #遍歷表格數據,如果爲無數據,將它標黃
    #獲取最大行
    maxrow = sheet1.max_row
    for i in range(1,maxrow+1):
        for j in range(1,maxcolumn+1):
            if sheet1.cell(i,j).value == '無數據':
                sheet1.cell(i,j).fill = fillcolor
    #保存表格
    wb.save('data.xlsx')


writexls()







最終處理結果如下:

第一階段測試搞定收工!後續就等開發他們優化,增加了字段之後,只要小改代碼就行了

發佈了23 篇原創文章 · 獲贊 15 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章