Laisser Python mesurer le score moyen d'une page à l'aide de l'API PageSpeed Insights

introduction

Le produit auquel j'appartiens dispose désormais de PageSpeed Insights (PSI) dans le but d'afficher des résultats de recherche plus élevés et de réduire le stress lors de la navigation sur le site. Nous mesurons l'amélioration de la vitesse de la page en utilisant.

Les résultats d'amélioration sont mesurés avant / après, mais selon le moment de la mesure, le score PSI peut avoir une marge de 10 à 30 points ** flou **.

C'est pourquoi mon équipe a mesuré plusieurs fois au lieu d'une seule mesure par page.

--Score moyen --Nombre de mesures (15 fois ou plus) ――Si le flou est important, les points les plus bas et les plus hauts

J'ai décidé d'aller avec la méthode de description.

Cependant, avec cela, plus vous voulez mesurer de pages, plus il est difficile d'attendre en cliquant sur le bouton «analyser». Cette fois, j'ai essayé de rendre cela plus efficace en utilisant l'API.

Image du lecteur cible

Produit fini

kotahashihama/psi-score-collector https://github.com/kotahashihama/psi-score-collector

Obtenir la clé API

Pour obtenir des données de l'API PageSpeed Insights, vous avez besoin de la clé API en tant que paramètre lorsque vous y accédez.

Vous pouvez l'obtenir sur la page suivante.

Essayez d'utiliser l'API PageSpeed Insights | Google Developers https://developers.google.com/speed/docs/insights/v5/get-started

Il n'est pas bon pour la sécurité de laisser la clé API telle quelle dans le code du projet, j'ai donc utilisé la bibliothèque python-dotenv et l'ai gérée comme une variable d'environnement dans .env.

Terminal


pip install python-dotenv

config.py


from dotenv import load_dotenv
load_dotenv()

import os
API_KEY = os.getenv('API_KEY')

.env


API_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Préparer les éléments de réglage

Puisque nous voulons mesurer chaque nombre défini de mesures en séquence, les éléments suivants sont requis.

main.py


#Nombre de mesures
measurement_count = 3;

#URL cible de la mesure
url_list = [
  'https://www.google.com/',
  'https://www.yahoo.co.jp/',
  'https://www.bing.com/'
]

Il semble qu'il soit bon à l'origine de séparer le contenu des paramètres du traitement, mais cette fois, nous le ferons.

Description du traitement principal

Pour chaque URL

--Nombre d'étapes

Est émis et enfin le message de fin de mesure s'affiche.

main.py


print('\n'.join(map(str, url_list)))
print(f'Est mesuré...({measurement_count}Mesure du temps)')

for i, url in enumerate(url_list):
  print(f'\n({i + 1}/{len(url_list)}) {url}')

  measure('mobile')
  measure('desktop')

  print('\n' + '=' * 60)

print('\n Mesure terminée!')

Obtenons des points

Ayez l'URL et les paramètres pour accéder à l'API SPI.

main.py


api_url = 'https://www.googleapis.com/pagespeedonline/v5/runPagespeed'
api_key = config.API_KEY

payload = { 'key': api_key }

Le config.py créé ci-dessus contient les variables d'environnement lues à partir de .env.

main.py


import config

Lisons config avec et définissons la valeur sur ʻapi_key`.

Traitement pour récupérer des points

Tout d'abord, voici le code complet.

main.py


def measure(device):
  device_name = {
    'mobile': 'mobile',
    'desktop': 'ordinateur'
  }

  print(f'[ {device_name[device]} ]')

  payload['strategy'] = device
  url_name = api_url + "?url=" + url

  scores = []

  for i in range(measurement_count):
    result = requests.get(url_name, params = payload)
    result_json = result.json()
    result_score = result_json['lighthouseResult']['categories']['performance']['score']
    displayed_score = math.floor(result_score * 100)

    scores.append(displayed_score)
    print(displayed_score, end=' ')

  score_average_raw = numpy.average(scores)
  score_average = Decimal(str(score_average_raw)).quantize(Decimal('0.1'), rounding=ROUND_HALF_UP)
  score_max = numpy.amax(scores)
  score_min = numpy.amin(scores)
  print(f'\n moyenne{score_average}Point (le plus bas{score_min}Point, le meilleur{score_max}point)')

Il existe deux principaux types de bibliothèques utilisées dans ce processus.

Faire.

(Je ne parlerai pas de cette fois, mais je pense qu'il est plus facile de partager la bibliothèque Python avec les membres de l'équipe si vous gérez les dépendances avec Poetry etc.)

Bibliothèque pour accéder à l'API

Utilisez une bibliothèque Python appelée «requests».

Terminal


pip install requests

main.py


import requests

main.py


result = requests.get(url_name, params = payload)
result_json = result.json()
result_score = result_json['lighthouseResult']['categories']['performance']['score']

Accédez à l'API avec get (), convertissez le résultat en JSON avec json () et suivez le score où le score est stocké.

Bibliothèque pour calculer les résultats

J'utilise la bibliothèque Python du système de calcul. Parmi ceux-ci, numpy n'est pas inclus par défaut, alors installez-le avec pip.

Terminal


pip install numpy

main.py


import numpy

Puisque decimal utilise uniquement l'objet Decimal et la constante d'arrondi ROUND_HALF_UP, il est lu sous cette forme lors de l'importation.

main.py


from decimal import Decimal, ROUND_HALF_UP

main.py


score_average_raw = numpy.average(scores)
score_average = Decimal(str(score_average_raw)).quantize(Decimal('0.1'), rounding=ROUND_HALF_UP)
score_max = numpy.amax(scores)
score_min = numpy.amin(scores)

Faire.

Essayez d'utiliser

Après son exécution, il collectera des points en le laissant seul. Il peut être plus pratique d'utiliser quelque chose comme terminal-notifier pour signaler la fin.

Terminal


py main.py

スクリーンショット 2020-07-18 午後8.26.48.png

Les résultats de mesure seront accumulés comme ceci.

Résumé

L'acquisition-traitement des données est un élément très fondamental, il semble donc qu'il puisse être utilisé dans divers endroits de l'entreprise. En tant qu'ingénieur, j'aimerais pouvoir créer de tels outils pour pouvoir inspirer et expirer.

C'était donc mon premier article sur Qiita. Non!

Recommended Posts

Laisser Python mesurer le score moyen d'une page à l'aide de l'API PageSpeed Insights
Découpez une partie de la chaîne à l'aide d'une tranche Python
[Python] J'ai essayé de collecter des données en utilisant l'API de wikipedia
L'histoire de la création d'une base de données à l'aide de l'API Google Analytics
[python, ruby] sélénium-Obtenez le contenu d'une page Web avec le pilote Web
[Python3] Définition d'un décorateur qui mesure le temps d'exécution d'une fonction
Python VBA pour obtenir une capture de la page WEB entière avec Selenium
Essayez d'utiliser l'API Kraken avec Python
Mesurer la force de l'association dans un tableau croisé
Tweet à l'aide de l'API Twitter en Python
Hit une méthode d'une instance de classe avec l'API Web Python Bottle
[python] [meta] Le type de python est-il un type?
L'histoire du traitement A du blackjack (python)
Python: je souhaite mesurer proprement le temps de traitement d'une fonction
[Python] Un programme qui arrondit le score
[Circuit x Python] Comment trouver la fonction de transfert d'un circuit en utilisant Lcapy
[Python] Totale automatiquement le nombre total d'articles publiés par Qiita à l'aide de l'API
Convertir l'API cURL en script Python (à l'aide du stockage d'objets IBM Cloud)
J'ai fait un script pour enregistrer la fenêtre active en utilisant win32gui de Python
Récupérer l'appelant d'une fonction en Python
Essayez d'utiliser l'API BitFlyer Ligntning en Python
Copiez la liste en Python
Écrire une note sur la version python de python virtualenv
[Python] Une compréhension approximative du module de journalisation
Sortie sous la forme d'un tableau python
Essayez d'utiliser le module de collections (ChainMap) de python3
Téléchargement anonyme d'images à l'aide de l'API Imgur (à l'aide de Python)
Prise en compte des forces et faiblesses de Python
Essayez d'utiliser l'API DropBox Core avec Python
Découvrez Naive Bayes implémenté en Python 3.3 sur une page Web obtenue avec l'API Bing. Que les phrases soient classées
[Python3] Prenez une capture d'écran d'une page Web sur le serveur et recadrez-la davantage
J'ai essayé de notifier la mise à jour de "Devenir romancier" en utilisant "IFTTT" et "Devenir un romancier API"
Une histoire sur un débutant Python essayant d'obtenir des résultats de recherche Google à l'aide de l'API
Python: calculez la profondeur d'écoulement constante d'une section rectangulaire à l'aide de la méthode Brent
[Python] Implémentation du clustering à l'aide d'un modèle gaussien mixte
[Python] Un programme qui compte le nombre de vallées
Explication du concept d'analyse de régression à l'aide de python Partie 2
[Python] Récupérez le texte de la loi à partir de l'API e-GOV law
[Python] Calculez la valeur moyenne de la valeur de pixel RVB de l'objet
[CRUD] [Django] Créer un site CRUD en utilisant le framework Python Django ~ 1 ~
Paramètres initiaux lors de l'utilisation de l'API foursquare avec python
Implémentation python de la classe de régression linéaire bayésienne
[Question] À propos de la conversion API du chat bot à l'aide de Python
Points Python du point de vue d'un programmeur en langage C
La douleur de gRPC en utilisant Python. Novembre 2019. (Mémo personnel)
Envoyez et recevez Gmail via l'API Gmail en utilisant Python
Utilisons la version Python du module API Confluence.
Enregistrez des tickets avec l'API de Redmine en utilisant des requêtes Python
[Python] Utilisation de l'API Line [1ère création de Beauty Bot]
Explication du concept d'analyse de régression à l'aide de Python Partie 1
J'ai essayé d'utiliser l'API de Sakenowa Data Project
[CRUD] [Django] Créer un site CRUD en utilisant le framework Python Django ~ 2 ~
[Python] Masquez l'image dans un cercle à l'aide de Pillow
Tâches au démarrage d'un nouveau projet python
Explication du concept d'analyse de régression à l'aide de Python Extra 1
Utiliser l'API de recherche de la Bibliothèque du Parlement national en Python
Étude de Python Hour8: Utilisation de packages
[Python] Utilisez l'API Face de Microsoft Cognitive Services
Un mémorandum sur la mise en œuvre des recommandations en Python