Python除了做爬蟲抓數據還能做什么?其實還能監視和衡量網站性能
借助這份對初學者友好的指南,您可以構建自己的自定義Python腳本來自動測量網站的關鍵速度和性能指標。

在過去的一個月中,Google宣布了許多通過關鍵速度和性能指標來衡量用戶體驗的方法。
巧合的是,我一直在努力編寫一個Python腳本,該腳本使用Google PageSpeed Insights(PSI)API一次收集多個頁面的指標,而無需為每個單獨的URL運行測試。
收到Google的公告后,我認為現在是共享它的絕佳時機,并解釋了如何創建對初學者友好的Python腳本。
關于腳本的最好的事情是,一旦建立了基礎,就可以提取許多不同的指標,這些指標可以在頁面速度測試以及Lighthouse分析中找到。
網絡重要指標簡介
5月初,Google推出了Core Web Vitals,它是其關鍵Web Vitals指標的一部分。
這些指標用于提供有關網站上用戶體驗質量的指導。
Google將其描述為“幫助量化您的網站體驗并確定改進機會”的一種方式,進一步強調了它們向關注用戶體驗的轉變。
核心網絡生命力是真實的,以用戶為中心的指標,用于衡量用戶體驗的關鍵方面。加載時間,互動性和穩定性。
除此之外,Google 上周宣布,他們將引入一個新的搜索排名信號,它將這些指標與現有頁面體驗信號(例如移動設備友好性和HTTPS安全性)結合在一起,以確保它們繼續為高質量網站提供服務給用戶。
監控性能指標
預計此更新將于2021年推出,Google已確認不需要立即采取行動。
但是,為了幫助我們為這些更改做準備,他們更新了用于測量頁面速度的工具,包括PSI,Google Lighthouse和Google Search Console Speed Report。
Pagespeed Insights API從何入手?
Google的PageSpeed Insights是查看網頁效果摘要的有用工具,它使用現場數據和實驗室數據來生成結果。
這是獲得少數URL概述的好方法,因為它是逐頁使用的。
但是,如果您在大型站點上工作,并且希望獲得大規模的見解,那么該API可以有利于一次分析多個頁面,而無需單獨插入URL。
用于衡量性能的Python腳本
我創建了以下Python腳本來大規模度量關鍵性能指標,以節省手動測試每個URL所花費的時間。
該腳本使用Python將請求發送到Google PSI API,以收集和提取在PSI和Lighthouse中顯示的指標。
我決定在Google Colab中編寫此腳本,因為這是開始編寫Python并允許輕松共享的好方法,因此本文將使用Google Colab貫穿整個安裝過程。
但是,它也可以在本地運行,對數據的上傳和下載進行一些調整。
請務必注意,某些步驟可能需要一些時間才能完成,尤其是當每個URL通過API運行時,為了不使請求過載。
因此,您可以在后臺運行腳本,并在完成步驟后返回到腳本。
讓我們逐步介紹啟動和運行此腳本所需的步驟。
步驟1:安裝所需的軟件包
在開始編寫任何代碼之前,我們需要安裝一些Python程序包,然后才能使用該腳本。這些使用導入功能很容易安裝。
我們需要的軟件包是:
- urllib:用于處理,打開,閱讀和解析URL。
- json:允許您將JSON文件轉換為Python或將Python文件轉換為JSON。
- request:一個HTTP庫,用于發送各種HTTP請求。
- pandas:主要用于數據分析和處理,我們正在使用它來創建DataFrames。
- time:一個用于處理時間的模塊,我們正在使用它在請求之間提供時間間隔。
- 文件:通過Google Colab,您可以上傳和下載文件。
- io:用于訪問文件的默認接口。
- # Import required packages
- import json
- import requests
- import pandas as pd
- import urllib
- import time
- from google.colab import files
- import io
第2步:設置API請求
下一步是設置API請求。完整的說明可以在這里找到,但是從本質上講,該命令將如下所示:
- https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url={yourURL}/&strategy=mobile/&key={yourAPIKey}
這將允許您附加URL,策略(臺式機或移動設備)和API密鑰。
要在Python中使用它,我們將使用urllib請求庫urllib.request.urlopen并將其添加到名為result的變量中,以便我們可以存儲結果并在腳本中再次使用它們。
- # Define URL
- url = 'https://www.example.co.uk'
- # API request url
- result = urllib.request.urlopen('https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url={}/&strategy=mobile'\
- .format(url)).read().decode('UTF-8')
- print(result)
步驟3:測試API
為了測試API的正確設置以及對測試過程中生成的內容的理解,我使用簡單的urllib.request方法通過API運行了一個URL。
完成此操作后,我將結果轉換為json文件并下載了它,以便查看結果。
- # Convert to json format
- result_json = json.loads(result)
- print(result_json)
- with open('result.json', 'w') as outfile:
- json.dump(result_json, outfile)
- files.download('result.json')
(請注意,此方法用于在Google Colab中轉換和下載JSON文件。)
步驟4:讀取JSON檔案
JSON文件顯示字段數據(存儲在loadingExperience下)和實驗室數據(可以在lighthouseResult下找到)。
為了提取所需的指標,我們可以利用JSON文件的格式,因為我們能夠看到每個部分下面的指標。
第5步:上傳CSV并存儲為Pandas數據框
下一步是上傳我們要通過PSI API運行的URL的CSV文件。您可以通過抓取工具(例如DeepCrawl)生成站點URL的列表。
當我們使用API時,建議您在此處使用較小的URL示例集,尤其是在您擁有大型站點的情況下。
例如,您可以使用訪問量最高的頁面或產生最大收入的頁面。另外,如果您的站點有模板,則非常適合測試其中的模板。
您還可以在此處添加column-header變量,我們將在遍歷列表時使用該變量。確保此名稱與您上傳的CSV文件中的列標題名稱匹配:
- uploaded = files.upload()
- #if your column header is something other than 'url' please define it here
- column_header='url'
(請注意,此方法用于在Google Colab中上傳CSV文件。)
將其上傳后,我們將使用Pandas庫將CSV轉換為DataFrame,我們可以在以下步驟中進行迭代。
- # Get the filename from the upload so we can read it into a CSV.
- for key in uploaded.keys():
- filename = key
- # Read the selected file into a Pandas Dataframe
- df = pd.read_csv(io.BytesIO(uploaded[filename]))
- df.head()
DataFrame看起來像這樣,從零索引開始。
步驟6:將結果保存到響應對象
下一步涉及使用for循環來迭代剛剛通過PSI API創建的URL的DataFrame。
for循環使我們可以遍歷上載的列表并為每個項目執行命令。然后,我們可以將結果保存到響應對象中,并將其轉換為JSON文件。
- response_object = {}
- # Iterate through the df
- for x in range(0, len(df)):
- # Define request parameter
- url = df.iloc[x][column_header]
- # Make request
- pagespeed_results = urllib.request.urlopen('https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url={}&strategy=mobile'.format(url)).read().decode('UTF-8')
- # Convert to json format
- pagespeed_results_json = json.loads(pagespeed_results)
- # Insert returned json response into response_object
- response_object[url] = pagespeed_results_json
- time.sleep(30)
- print(response_object[url])
我們將在此處使用范圍內的x,它表示循環中正在運行的URL,以及(0,len)允許循環遍歷DataFrame中的所有URL,無論包含多少個URL 。
該響應對象防止通過重寫相互循環,你的網址,使我們能夠保存數據以備將來使用。
這也是在將其轉換為JSON文件之前,將使用列標題變量定義URL請求參數的地方。
我還將此處的睡眠時間設置為30秒,以減少連續進行的API調用次數。
另外,如果您希望更快地提出請求,則可以在URL命令的末尾附加一個API密鑰。
縮進在這里也很重要,因為每個步驟都是for循環的一部分,因此必須在命令中縮進它們。
步驟7:創建一個數據框來存儲響應
我們還需要創建一個DataFrame來存儲我們要從響應對象中提取的指標。
DataFrame是類似于表的數據結構,具有存儲數據的列和行。我們只需要為每個指標添加一列并適當地命名它,如下所示:
- # Create dataframe to store responses
- df_pagespeed_results = pd.DataFrame(columns=
- ['url',
- 'Overall_Category',
- 'Largest_Contentful_Paint',
- 'First_Input_Delay',
- 'Cumulative_Layout_Shift',
- 'First_Contentful_Paint',
- 'Time_to_Interactive',
- 'Total_Blocking_Time',
- 'Speed_Index'])
- print(df_pagespeed_results)
出于此腳本的目的,我使用了Core Web Vital指標以及當前Lighthouse版本中使用的其他負載和交互性指標。
這些指標各自具有不同的權重,然后將它們用于總體績效得分:
- LCP
- FID
- CLS
- FCP
- TTI
- TBT
您可以在上方鏈接的各個目標網頁上找到有關每個指標的更多信息以及如何解釋分數的信息。
我還選擇包括速度指數和整體類別,這些類別將提供慢速,平均或快速得分。
步驟8:從響應對象中提取指標
保存響應對象后,我們現在可以對其進行過濾并僅提取所需的指標。
在這里,我們將再次使用for循環遍歷響應對象文件,并設置一系列列表索引以僅返回特定指標。
為此,我們將從DataFrame中定義列名稱,以及為每個URL從中提取每個指標的響應對象的特定類別。
- for (url, x) in zip(
- response_object.keys(),
- range(0, len(response_object))
- ):
- # URLs
- df_pagespeed_results.loc[x, 'url'] =\
- response_object[url]['lighthouseResult']['finalUrl']
- # Overall Category
- df_pagespeed_results.loc[x, 'Overall_Category'] =\
- response_object[url]['loadingExperience']['overall_category']
- # Core Web Vitals
- # Largest Contentful Paint
- df_pagespeed_results.loc[x, 'Largest_Contentful_Paint'] =\
- response_object[url]['lighthouseResult']['audits']['largest-contentful-paint']['displayValue']
- # First Input Delay
- fid = response_object[url]['loadingExperience']['metrics']['FIRST_INPUT_DELAY_MS']
- df_pagespeed_results.loc[x, 'First_Input_Delay'] = fid['percentile']
- # Cumulative Layout Shift
- df_pagespeed_results.loc[x, 'Cumulative_Layout_Shift'] =\
- response_object[url]['lighthouseResult']['audits']['cumulative-layout-shift']['displayValue']
- # Additional Loading Metrics
- # First Contentful Paint
- df_pagespeed_results.loc[x, 'First_Contentful_Paint'] =\
- response_object[url]['lighthouseResult']['audits']['first-contentful-paint']['displayValue']
- # Additional Interactivity Metrics
- # Time to Interactive
- df_pagespeed_results.loc[x, 'Time_to_Interactive'] =\
- response_object[url]['lighthouseResult']['audits']['interactive']['displayValue']
- # Total Blocking Time
- df_pagespeed_results.loc[x, 'Total_Blocking_Time'] =\
- response_object[url]['lighthouseResult']['audits']['total-blocking-time']['displayValue']
- # Speed Index
- df_pagespeed_results.loc[x, 'Speed_Index'] =\
- response_object[url]['lighthouseResult']['audits']['speed-index']['displayValue']
我已將此腳本設置為提取上面提到的關鍵指標,因此您可以立即使用它來收集此數據。
但是,可以提取在PSI測試以及Lighthouse分析中都可以找到的許多其他有用指標。
在此JSON文件可用于查看每個指標在列表中的位置。
例如,在從Lighthouse審核中提取指標(例如“互動時間”的顯示值)時,將使用以下內容:
- df_pagespeed_results.loc[x, 'Time_to_Interactive'] =\
- response_object[url]['lighthouseResult']['audits']['interactive']['displayValue']
再一次,重要的是要確保每一個都位于循環中,否則它們將不會包含在迭代中,并且只會為一個URL生成一個結果。
步驟9:將DataFrame轉換為CSV文件
最后一步是創建一個摘要文件以收集所有結果,因此我們可以將其轉換為易于分析的格式,例如CSV文件。
- summary = df_pagespeed_results
- df_pagespeed_results.head()
- #Download csv file
- summary.to_csv('pagespeed_results.csv')
- files.download('pagespeed_results.csv')
(請注意,此方法用于在Google Colab中轉換和下載CSV文件。)
進一步探索數據
目前,我們導出的所有指標都存儲為字符串,這是用于文本和字符的Python數據類型。
由于我們提取的某些指標實際上是數字值,因此您可能希望將字符串轉換為數字數據類型,例如整數和浮點數。
整數,也稱為int,是整數的數據類型,例如1和10。
浮點數,也稱為浮點數,是十進制點數,例如1.0和10.1。
為了將字符串轉換為數字,我們需要執行兩個步驟,第一步是將's'字符(用于表示秒)替換為空格。
我們通過在每列上使用.str.replace方法來執行此操作。
- #Replace the 's' with a blank space so we can turn into numbers
- df_pagespeed_results['Largest_Contentful_Paint'] = df_pagespeed_results.Largest_Contentful_Paint.str.replace('s', '')
- df_pagespeed_results['First_Contentful_Paint'] = df_pagespeed_results.First_Contentful_Paint.str.replace('s', '')
- df_pagespeed_results['Time_to_Interactive'] = df_pagespeed_results.Time_to_Interactive.str.replace('s', '')
- df_pagespeed_results['Total_Blocking_Time'] = df_pagespeed_results.Total_Blocking_Time.str.replace('ms', '')
- df_pagespeed_results['Speed_Index'] = df_pagespeed_results.Speed_Index.str.replace('s', '')
然后,我們將使用.astype()方法將字符串轉換為整數或浮點數:
- #Turn strings into intergers or floats
- df_pagespeed_results['Largest_Contentful_Paint'] = df_pagespeed_results.Largest_Contentful_Paint.astype(float)
- df_pagespeed_results['Cumulative_Layout_Shift'] = df_pagespeed_results.Cumulative_Layout_Shift.astype(int)
- df_pagespeed_results['First_Contentful_Paint'] = df_pagespeed_results.First_Contentful_Paint.astype(float)
- df_pagespeed_results['Time_to_Interactive'] = df_pagespeed_results.Time_to_Interactive.astype(float)
- df_pagespeed_results['Speed_Index'] = df_pagespeed_results.Speed_Index.astype(float)
完成此操作后,您可以使用多種不同的方法進一步評估數據。
例如,您可以使用數據可視化庫(例如matplotlib或seaborn)來可視化指標,以及測量指標如何隨時間變化并將結果分組為慢速,中速和快速存儲桶。
由于我們已經介紹了很多內容,因此我不會在本文中介紹這些內容,但是如果您想了解更多信息,請隨時與我們聯系。
結論
該腳本最終幫助我測量了一組URL的關鍵頁面速度和性能指標,并可視化了結果以識別需要改進的頁面。
它還允許您隨時間監視結果并量化已進行的改進。
我還創建了一個腳本來專門測量三個核心Web Vitals的百分比和類別。
我希望這對希望自動化其性能測試并進一步探索PSI API的人有所幫助。
請隨時保存此Colab文件的副本,并使用它來幫助測量和監視您的頁面速度,或者按照自己的步驟進行操作。您可以在此處訪問我在本文中分享的所有代碼段。

























