当前位置: 首页 > 科技观察

Python除了爬取数据还能做什么?事实上,监控和衡量网站性能

时间:2023-03-16 11:41:04 科技观察

有了这个适合初学者的指南,您可以构建自己的自定义Python脚本来自动衡量网站的关键速度和性能指标。在过去的一个月里,谷歌宣布了多种通过关键速度和性能指标来衡量用户体验的方法。巧合的是,我一直在努力编写一个Python脚本,该脚本使用GooglePageSpeedInsights(PSI)API一次收集多个页面的指标,而无需为每个单独的URL运行测试。收到Google的公告后,我认为现在是分享它并解释如何创建对初学者友好的Python脚本的最佳时机。该脚本最好的一点是,一旦建立了基础,就可以提取许多不同的指标,这些指标可以在页面速度测试和Lighthouse分析中找到。引入WebVitals5月初,Google推出了CoreWebVitals,这是其关键WebVitals指标的一部分。这些指标用于提供有关网站用户体验质量的指导。谷歌将其描述为“帮助量化您的网站体验并确定改进机会”的一种方式,进一步强调了他们转向关注用户体验的转变。核心网络生命力是真实的、以用户为中心的指标,用于衡量用户体验的关键方面。加载时间、交互性和稳定性。除此之外,谷歌上周宣布,他们将引入一个新的搜索排名信号,将这些指标与现有的页面体验信号(例如移动友好性和HTTPS安全性)相结合,以确保它们继续为高质量网站提供服务给用户.监控性能指标该更新预计将于2021年推出,谷歌已确认无需立即采取行动。然而,为了帮助我们为这些变化做好准备,他们更新了用于测量页面速度的工具,包括PSI、GoogleLighthouse和GoogleSearchConsoleSpeedReport。从哪里开始使用PagespeedInsightsAPI?Google的PageSpeedInsights是查看网页性能摘要的有用工具,它使用现场和实验室数据生成结果。这是一个很好的方式来了解一些URL的概况,因为它是逐页使用的。但是,如果您在大型网站上工作并希望获得大规模的洞察力,则该API非常适合一次分析多个页面,而无需单独插入URL。用于测量性能的Python脚本我创建了以下Python脚本来大规模测量关键性能指标,以节省手动测试每个URL所花费的时间。该脚本使用Python向GooglePSIAPI发送请求,以收集和提取PSI和Lighthouse中显示的指标。我决定在GoogleColab中编写此脚本,因为它是开始编写Python并允许轻松共享的好方法,因此本文将在整个安装过程中使用GoogleColab。但是,它也可以在本地运行,只需对数据的上传和下载进行一些调整。请务必注意,某些步骤可能需要一些时间才能完成,尤其是当每个URL都通过API运行时,以免请求过载。因此,您可以在后台运行脚本,并在完成这些步骤后返回。让我们逐步了解启动和运行此脚本所需的步骤。第1步:安装所需的包在我们开始编写任何代码之前,我们需要先安装一些Python包,然后才能使用此脚本。这些很容易使用导入功能安装。我们需要的包是:urllib:用于处理、打开、读取和解析URL。json:允许您将JSON文件转换为Python或将Python文件转换为JSON。request:用于发送各种HTTP请求的HTTP库。pandas:主要用于数据分析和处理,我们用它来创建DataFrames。time:一个处理时间的模块,我们用它来提供请求之间的时间间隔。文件:使用GoogleColab,您可以上传和下载文件。io:访问文件的默认接口。#Importrequiredpackagesimportjsonimportrequestsimportpandasaspdimporturllibimporttimefromgoogle.colabimportfilesimportio第2步:设置API请求下一步是设置API请求。可以在此处找到完整说明,但基本上命令将如下所示:https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url={yourURL}/&strategy=mobile/&key={yourAPIKey}这将允许您附上URL、策略(桌面或移动)和API密钥。要在Python中使用它,我们将使用urllib请求库urllib.request.urlopen并将其添加到名为result的变量中,以便我们可以存储结果并在脚本中再次使用它们。#DefineURLurl='https://www.example.co.uk'#APIrequesturlresult=urllib.request.urlopen('https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url={}/&strategy=mobile'\.format(url)).read().decode('UTF-8')print(result)第三步:测试API为了测试API设置是否正确以及对调用过程中产生的内容的理解测试,我使用一个简单的urllib.request方法通过API运行一个URL。这样做之后,我将结果转换为json文件并下载它,以便我可以看到结果。#Converttojsonformatresult_json=json.loads(result)print(result_json)withopen('result.json','w')asoutfile:json.dump(result_json,outfile)files.download('result.json')(请注意这个方法用于在GoogleColab中转换和下载JSON文件。)第4步:读取JSON存档JSON文件显示现场数据(存储在loadingExperience下)和实验室数据(可以在lighthouseResult下找到)。为了提取所需的指标,我们可以利用JSON文件的格式,因为我们能够在每个部分下看到指标。第5步:上传CSV并存储为PandasDataframe下一步是上传我们要通过PSIAPI运行的URL的CSV文件。您可以通过DeepCrawl等爬虫工具生成站点URL列表。当我们使用API时,建议您在此处使用一小部分URL示例,尤其是在您拥有大型网站的情况下。例如,您可以使用访问次数最多的页面或产生最多收入的页面。此外,如果您的站点有模板,那么非常适合测试其中的模板。您还可以在此处添加列标题变量,我们将在遍历列表时使用它。确保此名称与您上传的CSV文件中的列标题名称匹配:uploaded=files.upload()#ifourcolumnheaderissomethingotherthan'url'pleasedefineitherecolumn_header='url'(请注意,此方法用于在GoogleColab中上传CSV文件。)一旦它上传后,我们将使用Pandas库将CSV转换为DataFrame,我们可以在以下步骤中对其进行迭代。#GetthefilenamefromtheuploadsowecanreaditintoaCSV.forkeyinuploaded.keys():filename=key#ReadtheselectedfileintoaPandasDataframedf=pd.read_csv(io.BytesIO(uploaded[filename]))df.head()DataFrame看起来像这样,从零索引开始。第6步:将结果保存到响应对象下一步涉及使用for循环迭代刚刚通过PSIAPI创建的URL的DataFrame。for循环允许我们遍历上传的列表并为每个项目执行命令。然后我们可以将结果保存到响应对象中并将其转换为JSON文件。response_object={}#Iteratethroughthedfforxinrange(0,len(df)):#Definerequestparameterurl=df.iloc[x][column_header]#Makerequestpagespeed_results=urllib.request.urlopen('https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url={}&strategy=mobile'.format(url)).read().decode('UTF-8')#Converttojsonformatpagespeed_results_json=json.loads(pagespeed_results)#Insertreturnedjsonresponseintoresponse_objectresponse_object[url]=pagespeed_results_)打印(response_object[url])我们将在此处使用xinscope,它表示循环中正在运行的URL,以及(0,len)以允许循环遍历DataFrame中的所有URL,无论它包含多少个URL。Response对象通过重写您的URL来防止内部循环,使我们能够保存数据以备将来使用。这也是在将其转换为JSON文件之前使用列标题变量定义URL请求参数的地方。我还将此处的休眠时间设置为30秒,以减少连续进行的API调用次数。此外,如果您想更快地发出请求,可以将API密钥附加到URL命令的末尾。缩进在这里也很重要,因为每个步骤都是for循环的一部分,所以它们必须在命令中缩进。第7步:创建一个DataFrame来存储响应我们还需要创建一个DataFrame来存储我们要从响应对象中提取的指标。DataFrame是一种类似表的数据结构,有列和行来存储数据。我们只需要为每个指标添加一列并适当命名,如下所示:#Createdataframetostoresponsesdf_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)出于此脚本的目的,我使用了CoreWebVital指标以及当前Lighthouse版本中使用的其他负载和交互指标。这些指标各自具有不同的权重,然后用于整体性能得分:LCP、FID、CLS、FCP、TTI、TBT您可以在上面链接的相应登录页面上找到有关每个指标以及如何解释分数的更多信息。我还选择包括一个速度指数和一个可以提供慢速、平均或快速分数的整体类别。第8步:从响应对象中提取指标保存响应对象后,我们现在可以对其进行过滤并仅提取所需的指标。在这里,我们将再次使用for循环遍历响应对象文件,并设置一系列列表索引以仅返回特定指标。为此,我们将从DataFrame中定义列名称,并为每个URL定义从中提取每个指标的响应对象的特定类。对于(url,x)inzip(response_object.keys(),范围(0,len(response_object))):#URLsdf_pagespeed_results.loc[x,'url']=\response_object[url]['lighthouseResult']['finalUrl']#OverallCategorydf_pagespeed_results.loc[x,'Overall_Category']=\response_object[url]['loadingExperience']['overall_category']#CoreWebVitals#LargestContentfulPaintdf_pagespeed_results.loc[x,'Largest_Contentful_Paint']=\response_object[url]['lighthouseResult']['audits']['largest-contentful-paint']['displayValue']#FirstInputDelayfid=response_object[url]['loadingExperience']['metrics']['FIRST_INPUT_DELAY_MS']df_pagespeed_results.loc[x,'First_Input_Delay']=fid['percentile']#CumulativeLayoutShiftdf_pagespeed_results.loc[x,'Cumulative_Layout_Shift']=\response_object[url]['lighthouseResult']['audits']['cumulative-layout-shift']['displayValue']#AdditionalLoadingMetrics#FirstContentfulPaintdf_pagespeed_results.loc[x,'First_Contentful_Paint']=\response_object[url]['lighthouseResult']['audits']['first-contentful-paint']['displayValue']#AdditionalInteractivityMetrics#TimetoInteractivedf_pagespeed_results.loc[x,'Time_to_Interactive']=\response_object[url]['lighthouseResult']['audits']['interactive']['displayValue']#TotalBlockingTimedf_pagespeed_results.loc[x,'Total_Blocking_Time']=\response_object[url]['lighthouseResult']['audits']['total-blocking-time']['displayValue']#SpeedIndexdf_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_resultsdf_pagespeed_results.head()#Downloadcsvfilesummary.to_csv('pagespeed_results.csv')files.download('pagespeed_results.csv')(请注意,此方法用于在GoogleColab中转换和下载CSV文件。)进一步探索数据目前,我们导出的所有指标都存储为字符串,这是文本和字符的Python数据类型。由于我们提取的一些指标实际上是数值,您可能希望将字符串转换为数字数据类型,例如整数和浮点数。Integer,又称int,是整数的数据类型,如1、10。浮点数,又称float,是小数点后的数字,如1.0、10.1。为了将字符串转换为数字,我们需要执行两个步骤,第一步是将's'字符(用于表示秒)替换为空格。我们通过在每一列上使用.str.replace方法来做到这一点。#Replacethe'withablankspacesowecanturnintononnumbersdf_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'd'sult,speed)[pagespeed'dfr.replace()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()方法将字符串转换为整数或浮点数:#Turnstringsintointergersorfloatsdf_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的关键页面速度和性能指标,并将结果可视化以识别需要改进的页面。它还允许您随着时间的推移监控结果并量化已做出的改进。我还创建了一个脚本来专门衡量三个核心WebVitals的百分比和类别。我希望这可以帮助那些希望自动化性能测试并进一步探索PSIAPI的人。请随意保存此Colab文件的副本,并使用它来帮助测量和监控您的页面速度,或者您自己按照这些步骤操作。您可以在此处访问我在本文中共享的所有代码片段。