如何使用Python来监控和测试网站性能

使用此适合初学者的指南构建您自己的自定义 Python 脚本,以自动测量您网站的关键速度和性能指标。

在过去的一个月里,谷歌宣布了一些进步,他们将如何通过关键速度和性能指标来衡量用户体验。

巧合的是,我一直在努力构建一个Python脚本,该脚本使用Google PageSpeed Insights(PSI)API一次收集多个页面的指标,而无需为每个单独的URL运行测试。

在Google的公告之后,我认为现在是分享它的最佳时机,并解释如何创建这个初学者友好的Python脚本。

关于脚本的最好的事情是,一旦你设置了基础,你将能够提取许多不同的指标,这些指标可以在页面速度测试以及灯塔分析中找到。

网络生命指标简介

五月初,谷歌推出了核心网页指标,这是其关键网页指标的一个子集。

这些指标用于提供有关网站用户体验质量的指导。

谷歌将它们描述为“帮助量化您网站的体验并确定改进机会”的一种方式,进一步强调了它们向关注用户体验的转变。

核心 Web 指标是以用户为中心的真实指标,用于衡量用户体验的关键方面;加载时间、交互性和稳定性。

我不会在这篇文章中详细介绍这些 - 你可以在这里找到更多信息 - 但这些新指标是:

  • 最大的内容绘画。

  • 首次输入延迟。

  • 累积布局偏移。

除此之外,谷歌上周宣布,他们将推出一个新的搜索排名信号,将这些指标与现有的页面体验信号(如移动友好性和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。

  • requests:一个用于发送各种 HTTP 请求的 HTTP 库。

  • pandas:主要用于数据分析和操作,我们用它来创建数据帧。

  • time:一个用于处理时间的模块,我们使用它来提供请求之间的时间中断。

  • files:通过谷歌合作,这将允许您上传和下载文件

  • 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 文件通常如下所示。

这很难理解,但使用在线 JSON 查看器将使您能够将其转换为可读的树视图。

JSON 文件显示字段数据,存储在 loadExperience 下,以及实验室数据,您可以在 lighthouseResult 下找到。

为了提取所需的指标,我们可以利用 JSON 文件的格式,因为我们可以看到每个部分下有哪个指标。

例如,在 loadExperience 下找到第一个输入延迟。

而第一个内容绘画是在灯塔结果下找到的。

灯塔结果审计下还存储了许多其他指标,例如:

  • 速度指数。

  • 第一次内容丰富的绘画。

  • 累积布局偏移。

第 5 步:将 CSV 和存储作为熊猫数据帧上传

下一步是上传我们希望通过 PSI API 运行的 URL 的 CSV 文件。您可以通过抓取工具(如 DeepCrawl)生成网站网址列表。

由于我们正在使用 API,因此我建议在此处使用较小的 URL 示例集,尤其是在您有一个大型网站的情况下。

例如,您可以使用流量最高的网页或产生最多收入的网页。或者,如果您的网站有模板,它将非常适合测试这些模板集。

您还可以在此处添加一个列标题变量,我们将在循环访问列表时使用它。确保此名称与您上传的 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 转换为数据帧,我们可以在以下步骤中循环访问。

# 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()

数据帧将如下所示,从零索引开始。

步骤 6:将结果保存到响应对象

下一步涉及使用 for 循环来迭代我们刚刚通过 PSI API 创建的 URL 的数据帧。

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),它允许循环运行数据帧中的所有 URL,无论包含多少个。

响应对象可防止 URL 在您循环时相互覆盖,并允许我们保存数据以供将来使用。

这也是我们将使用列标题变量来定义 URL 请求参数的地方,然后再将其转换为 JSON 文件。

我还将此处的睡眠时间设置为 30 秒,以减少连续进行的 API 调用次数。

或者,如果您希望发出更快的请求,可以将 API 密钥附加到 URL 命令的末尾。

缩进在这里也很重要,因为由于每个步骤都是 for 循环的一部分,因此必须在命令中缩进它们。

步骤 7:创建数据帧以存储响应

我们还需要创建一个数据帧,用于存储我们要从响应对象中提取的指标。

数据帧是一种类似于表的数据结构,具有存储数据的列和行。我们只需要为每个指标添加一个列并适当地命名它,如下所示:

# 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)

出于此脚本的目的,我使用了核心 Web 生命指标,以及当前 Lighthouse 版本中使用的其他加载和交互指标。

这些指标各有不同的权重,然后用于总体效果得分:

您可以在上面链接的各个登录页面上了解有关每个指标的更多信息,以及如何解释分数。

我还选择包括速度指数和整体类别,这将提供慢速、平均或快速分数。

步骤 8:从响应对象中提取指标

保存响应对象后,我们现在可以对其进行筛选并仅提取所需的指标。

在这里,我们将再次使用 for 循环遍历响应对象文件,并设置一系列列表索引以仅返回特定指标。

为此,我们将定义数据帧中的列名称,以及我们将从中提取每个指标的响应对象的特定类别,用于每个 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测试和灯塔分析中找到。

这是 JSON 文件可用于查看每个指标在列表中的位置的地方。

例如,从轻量应用服务器审核中提取指标(例如交互时间的显示值)时,应使用以下方法:

df_pagespeed_results.loc[x, 'Time_to_Interactive'] =\
response_object[url]['lighthouseResult']['audits']['interactive']['displayValue']

同样,重要的是要确保其中的每一个都位于循环中,否则它们将不会包含在迭代中,并且只会为一个 URL 生成一个结果。

我们的最终数据帧将如下所示;

步骤 9:将数据帧转换为 CSV 文件

最后一步是创建一个摘要文件来收集所有结果,因此我们可以将其转换为可以轻松分析的格式,例如 CSV 文件。

summary = df_pagespeed_results

df_pagespeed_results.head()

#Download csv file 
summary.to_csv('pagespeed_results.csv')
files.download('pagespeed_results.csv')

(请注意,此方法用于在谷歌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 指标的百分位数和类别。你可以在这里找到它。

我希望这对任何希望自动化性能测试并进一步探索 PSI API 的人都有帮助。

请随时保存此 Colab 文件的副本,并使用它来帮助测量和监控您的页面速度,或按照步骤编写您自己的页面速度。您可以在此处访问我在这篇文章中分享的所有代码片段。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值