Création de liensSEO avancé

L’API Moz Links : touchez chaque point de terminaison en Python

Le but de ce Jupyter Notebook est de présenter l’API Moz Links en utilisant Python. Cela devrait fonctionner sur n’importe quel environnement d’hébergement de notebook, tel que Google Colab.

Si vous regardez cela sur Github, les extraits de code peuvent être copiés/collés dans votre propre environnement de bloc-notes. Au moment où vous aurez exécuté ce script jusqu’en bas, vous aurez utilisé chaque point de terminaison de l’API Moz Links et pourrez choisir les parties que vous souhaitez pour votre propre projet. La documentation officielle est disponible ici.

Confus? Assurez-vous de consulter mon introduction à l’API Moz Links.

Faire des importations mondiales

Les instructions d’importation en haut d’un programme Python sont utilisées pour charger des ressources externes qui ne sont pas chargées par défaut dans l’interpréteur Python. Ces ressources peuvent inclure des bibliothèques ou des modules qui fournissent des fonctionnalités supplémentaires au programme.

Les instructions d’importation sont généralement placées en haut d’un programme, avant l’exécution de tout autre code. Cela permet au programme de charger toutes les ressources nécessaires avant qu’elles ne soient nécessaires dans le programme.

Une fois que les ressources ont été chargées à l’aide des instructions d’importation, elles peuvent être utilisées n’importe où dans le programme, pas seulement dans la cellule où l’instruction d’importation a été écrite. Cela permet au programme d’accéder aux fonctionnalités fournies par les ressources importées tout au long de son exécution.

Les bibliothèques ici ne faisant pas partie de la bibliothèque Python standard sont demandes et sqlitedict. Vous pouvez installer le avec demandes d’installation pip et pip installer sqlitedict dans votre terminal ou une cellule Jupyter. Si vous utilisez Anaconda, les requêtes sont préinstallées.

import json  import requests  from headlines import *  from pprint import pprint  from sqlitedict import SqliteDict as sqldict  

Charger les valeurs de connexion à partir d’un fichier externe

Le code ci-dessous lit un fichier nommé “linksapi.txt” à partir du répertoire “assets”, qui contient les identifiants de connexion, y compris l’ID d’accès et la clé secrète nécessaires pour accéder à l’API Moz. Ces informations d’identification sont extraites du fichier et affectées à deux variables nommées ID D’ACCES et CLEF SECRÈTE. Le avec est utilisée pour s’assurer que le fichier est correctement fermé après sa lecture. Créez un fichier dont le contenu ressemble à ceci avec vos informations d’identification récupérées manuellement sur moz.com :

ACCESSID: mozscape-1234567890  SECRETKEY: 1234567890abcdef1234567890abcdef  

Une fois les informations d’identification extraites du fichier, elles sont stockées dans un tuple nommé AUTH_TUPLE. Ce tuple peut être utilisé comme argument des fonctions de l’API Moz pour authentifier et autoriser l’accès aux données.

Le but de cette approche est d’éviter de coder en dur les identifiants de connexion sensibles directement dans le programme, ce qui pourrait poser un risque de sécurité si le code était partagé ou publié publiquement. Au lieu de cela, les informations d’identification sont conservées dans un fichier séparé qui n’est pas inclus dans le référentiel et peuvent être facilement créées et mises à jour selon les besoins. De cette façon, le code peut être partagé sans exposer les informations d’identification au public.

with open("../assets/linksapi.txt") as fh:      ACCESSID, SECRETKEY = [x.strip().split(" ")[1] for x in fh.readlines()]    AUTH_TUPLE = (ACCESSID, SECRETKEY)  # Don't show contents  

Configurer les variables

Dans ce code, plusieurs variables de configuration sont utilisées pour configurer l’appel d’API à l’API Moz Links.

La première variable, COMMON_ENDPOINT, est une constante qui stocke l’URL du point de terminaison pour l’API Moz. La deuxième variable, sous_endpointest une chaîne qui représente le sous-chemin de point de terminaison pour les données de texte d’ancrage, qui seront ajoutées au COMMON_ENDPOINT URL pour former l’API complète point final URL.

La quatrième variable, data_dict, est un dictionnaire qui contient les paramètres de la requête API. Dans ce cas, le data_dict spécifie l’URL cible pour laquelle nous voulons récupérer les données du texte d’ancrage, la portée des données (dans ce cas, au niveau de la page) et une limite de 1 résultat.

Finalement, le chaîne_json La variable est créée en convertissant le dictionnaire data_dict en une chaîne au format JSON à l’aide de la json.dumps() fonction. Cette chaîne sera utilisée comme corps de requête lors de l’appel de l’API.

Ces variables sont utilisées pour configurer et paramétrer la requête API, et peuvent être modifiées pour effectuer n’importe data_dict demande contre n’importe quelle API Moz Links sous_endpoint.

COMMON_ENDPOINT = "https://lsapi.seomoz.com/v2/"  sub_endpoint = "anchor_text"  endpoint = COMMON_ENDPOINT + sub_endpoint  data_dict = {"target": "moz.com/blog", "scope": "page", "limit": 1}  json_string = json.dumps(data_dict)  

Frappez réellement l’API (assurez le succès)

Dans JupyterLab, la dernière ligne d’une cellule de code est automatiquement imprimée dans la zone de sortie sans nécessiter de mot de passe explicite. imprimer() déclaration. Le code que vous avez fourni utilise le demandes module pour envoyer une requête POST à ​​une URL URL avec des données sous la forme d’une chaîne JSON chaîne_json. Les informations d’authentification sont transmises à l’aide du AUTH_TUPLE variable.

Après l’envoi de la requête, l’objet de réponse r est imprimé à l’aide de la imprimer() déclaration. Cela imprimera le code d’état HTTP, tel que 200 pour succès, 404 pour non trouvé, etc., ainsi que les en-têtes de réponse.

Enfin, la méthode .json() est appelée sur l’objet de réponse réponse pour analyser les données de réponse au format JSON et les renvoyer sous forme de dictionnaire Python. Ce dictionnaire peut être affecté à une variable, utilisé pour un traitement ultérieur, ou simplement imprimé dans la zone de sortie sans nécessiter d’instruction print() explicite en raison du comportement d’impression automatique de JupyterLab pour la dernière ligne d’une cellule de code.

response = requests.post(endpoint, data=json_string, auth=AUTH_TUPLE)  pprint(response.json())  

Les sorties:

{'next_token': 'JYkQVg4s9ak8iRBWDiz1qTyguYswnj035nqjRF0IbW96IGJsb2e58hGzcmSomw==',   'results': [{'anchor_text': 'moz',                'external_pages': 7183,                'external_root_domains': 2038}]}  

Liste des sous-endpoints

Ce code définit une liste de différents sous-points de terminaison qui peuvent être ajoutés à un préfixe d’URL commun pour créer différents points de terminaison d’API. Un point de terminaison d’API est une URL où une API est accessible aux clients. C’est un point d’entrée à l’application qui agit comme un portier entre le client et le serveur. Chaque point de terminaison est identifié par une URL unique, qui peut être utilisée pour interagir avec l’API.

Dans ce code, la liste des sous-endpoints est définie dans le sous_endpoints variable et chaque point de terminaison est représenté sous forme de chaîne. La boucle for parcourt la liste, imprime le numéro d’index et le nom de chaque sous-point de terminaison à l’aide de la fonction d’impression et incrémente l’index de 1. énumérer La fonction est utilisée pour générer une séquence de paires constituées d’un index et d’une valeur de la liste.

Ce code est utile pour explorer les points de terminaison disponibles pour une API particulière et pour sélectionner le point de terminaison qui correspond à la fonctionnalité souhaitée. En modifiant le sous-point de terminaison dans l’URL, les clients peuvent accéder à différentes ressources ou effectuer différentes opérations sur le serveur.

sub_endpoints = [      "anchor_text",      "final_redirect",      "global_top_pages",      "global_top_root_domains",      "index_metadata",      "link_intersect",      "link_status",      "linking_root_domains",      "links",      "top_pages",      "url_metrics",      "usage_data",  ]  for i, sub_endpoint in enumerate(sub_endpoints):      print(i + 1, sub_endpoint)  

Les sorties:

1 anchor_text  2 final_redirect  3 global_top_pages  4 global_top_root_domains  5 index_metadata  6 link_intersect  7 link_status  8 linking_root_domains  9 links  10 top_pages  11 url_metrics  12 usage_data

Des étiquettes respectueuses de l’homme

Ce code définit deux listes : des noms et descriptifs. La liste des noms contient des étiquettes conviviales pour l’ensemble des sous-endpoints, tandis que les descriptifs La liste fournit une brève description de chaque endpoint. Les deux listes sont conservées dans le même ordre que la liste de points définie précédemment dans le code.

En gardant les trois listes dans le même ordre, elles peuvent être “compressées” ensemble en une seule liste de tuples en utilisant le zipper fonction. Cela produit une nouvelle liste où chaque tuple contient le nom, le point de terminaison et la description d’un point de terminaison d’API particulier. Cela facilite l’affichage d’un résumé convivial de chaque point de terminaison d’API avec son nom et sa description.

Le zipper La fonction combine les éléments des trois listes élément par élément, créant un tuple des premiers éléments de chaque liste, puis un tuple des seconds éléments, et ainsi de suite. La liste de tuples résultante peut être itérée et chaque tuple décompressé pour accéder aux éléments de nom, de point de terminaison et de description individuels pour chaque point de terminaison d’API.

names = [      "Anchor Text",      "Final Redirect",      "Global Top Pages",      "Global Top Root Domains",      "Index Metadata",      "Link Intersect",      "Link Status",      "Linking Root Domains",      "Links",      "Top Pages",      "URL Metrics",      "Usage Data",  ]    descriptions = [      "Use this endpoint to get data about anchor text used by followed external links to a target. Results are ordered by external_root_domains descending.",      "Use this endpoint to get data about anchor text used by followed external links to a target. Results are ordered by external_root_domains descending.",      "This endpoint returns the top 500 pages in the entire index with the highest Page Authority values, sorted by Page Authority. (Visit the Top 500 Sites list to explore the top root domains on the web, sorted by Domain Authority.)",      "This endpoint returns the top 500 pages in the entire index with the highest Page Authority values, sorted by Page Authority. (Visit the Top 500 Sites list to explore the top root domains on the web, sorted by Domain Authority.)",      "This endpoint returns the top 500 pages in the entire index with the highest Page Authority values, sorted by Page Authority. (Visit the Top 500 Sites list to explore the top root domains on the web, sorted by Domain Authority.)",      "Use this endpoint to get sources that link to at least one of a list of positive targets and don't link to any of a list of negative targets.",      "Use this endpoint to get information about links from many sources to a single target.",      "Use this endpoint to get linking root domains to a target.",      "Use this endpoint to get links to a target.",      "This endpoint returns top pages on a target domain.",      "Use this endpoint to get metrics about one or more urls.",      "This endpoint Returns the number of rows consumed so far in the current billing period. The count returned might not reflect rows consumed in the last hour. The count returned reflects rows consumed by requests to both the v1 (Moz Links API) and v2 Links APIs.",  ]    # Simple zipping example  list(zip(names, sub_endpoints, descriptions))  

Les sorties:

[('Anchor Text',    'anchor_text',    'Use this endpoint to get data about anchor text used by followed external links to a target. Results are ordered by external_root_domains descending.'),   ('Final Redirect',    'final_redirect',    'Use this endpoint to get data about anchor text used by followed external links to a target. Results are ordered by external_root_domains descending.'),   ('Global Top Pages',    'global_top_pages',    'This endpoint returns the top 500 pages in the entire index with the highest Page Authority values, sorted by Page Authority. (Visit the Top 500 Sites list to explore the top root domains on the web, sorted by Domain Authority.)'),   ('Global Top Root Domains',    'global_top_root_domains',    'This endpoint returns the top 500 pages in the entire index with the highest Page Authority values, sorted by Page Authority. (Visit the Top 500 Sites list to explore the top root domains on the web, sorted by Domain Authority.)'),   ('Index Metadata',    'index_metadata',    'This endpoint returns the top 500 pages in the entire index with the highest Page Authority values, sorted by Page Authority. (Visit the Top 500 Sites list to explore the top root domains on the web, sorted by Domain Authority.)'),   ('Link Intersect',    'link_intersect',    "Use this endpoint to get sources that link to at least one of a list of positive targets and don't link to any of a list of negative targets."),   ('Link Status',    'link_status',    'Use this endpoint to get information about links from many sources to a single target.'),   ('Linking Root Domains',    'linking_root_domains',    'Use this endpoint to get linking root domains to a target.'),   ('Links', 'links', 'Use this endpoint to get links to a target.'),   ('Top Pages',    'top_pages',    'This endpoint returns top pages on a target domain.'),   ('URL Metrics',    'url_metrics',    'Use this endpoint to get metrics about one or more urls.'),   ('Usage Data',    'usage_data',    'This endpoint Returns the number of rows consumed so far in the current billing period. The count returned might not reflect rows consumed in the last hour. The count returned reflects rows consumed by requests to both the v1 (Moz Links API) and v2 Links APIs.')]  

Afficher un exemple de demande pour chaque point de terminaison

Il s’agit d’une liste de demandes d’API au format Python dict, où chaque dictionnaire représente une demande à un point de terminaison spécifique. Ne vous faites pas trop mal au cerveau en essayant de le lire. Sachez simplement que j’ai extrait chaque exemple de la documentation originale de Moz et que je les ai tous répertoriés ici dans l’ordre en tant que dicts Python imbriqués.

Vous pouvez appeler le format est un dict de dicts, où chaque sous-dictionnaire correspond à un point de terminaison spécifique, même ordre que le sous_endpoints, des nomset descriptifs listes pour une combinaison facile. La sortie de l’exécution de la cellule ci-dessous fait cette combinaison de liste pour documenter chaque sous_endpoint.

dict_of_dicts = {      "anchor_text": {"target": "moz.com/blog", "scope": "page", "limit": 5},      "links": {          "target": "moz.com/blog",          "target_scope": "page",          "filter": "external+nofollow",          "limit": 1,      },      "final_redirect": {"page": "seomoz.org/blog"},      "global_top_pages": {"limit": 5},      "global_top_root_domains": {"limit": 5},      "index_metadata": {},      "link_intersect": {          "positive_targets": [              {"target": "latimes.com", "scope": "root_domain"},              {"target": "blog.nytimes.com", "scope": "subdomain"},          ],          "negative_targets": [{"target": "moz.com", "scope": "root_domain"}],          "source_scope": "page",          "sort": "source_domain_authority",          "limit": 1,      },      "link_status": {          "target": "moz.com/blog",          "sources": ["twitter.com", "linkedin.com"],          "source_scope": "root_domain",          "target_scope": "page",      },      "linking_root_domains": {          "target": "moz.com/blog",          "target_scope": "page",          "filter": "external",          "sort": "source_domain_authority",          "limit": 5,      },      "top_pages": {"target": "moz.com", "scope": "root_domain", "limit": 5},      "url_metrics": {"targets": ["moz.com", "nytimes.com"]},      "usage_data": {},  }    for i, sub_endpoint in enumerate(sub_endpoints):      h1(f"{i + 1}. {names[i]} ({sub_endpoint})")      print(descriptions[i])      h4("Example request:")      pprint(dict_of_dicts[sub_endpoint])      print()  

Les sorties:

# 2. Final Redirect (final_redirect)    Use this endpoint to get data about anchor text used by followed external links to a target. Results are ordered by external_root_domains descending.  Example request:    {'page': 'seomoz.org/blog'}    [...]  

Écrire une fonction qui frappe l’API

Si nous allons frapper une API encore et encore de la même manière, nous voulons nous épargner de tout retaper tout le temps. C’est pourquoi nous définissons les fonctions. C’est le def dans la cellule ci-dessous. Une fois cette cellule exécutée, le mois() La fonction peut être utilisée n’importe où dans ce Notebook. Vous n’avez qu’à lui fournir le sub_endpoint que vous souhaitez utiliser et un dict Python de votre demande. Il renverra la réponse de l’API.

def moz(sub_endpoint, data_dict):      """Hits Moz Links API with specified endpoint and request and returns results."""      json_string = json.dumps(data_dict)      endpoint = COMMON_ENDPOINT + sub_endpoint      # Below, data is a string (flattened JSON) but auth is a 2-position tuple.      response = requests.post(endpoint, data=json_string, auth=AUTH_TUPLE)      return response  

Cela ne produit rien à l’écran. Il définit simplement la fonction.

Accéder conditionnellement à l’API

Le code utilise un package Python appeléb qui fournit un objet de type dictionnaire persistant qui peut être stocké sur disque à l’aide du moteur de base de données SQLite. Le avec L’instruction dans le code configure un gestionnaire de contexte pour l’objet SqliteDict, qui gère automatiquement l’ouverture et la fermeture de la connexion à la base de données. Le fichier de base de données est stocké à ../dbs/linksapi.db

Le code itère sur chaque sous-point de terminaison dans le sous_endpoints liste et vérifie si ces données ont déjà été récupérées. Si ce n’est pas le cas, l’API est appelée à l’aide de la moz() fonction et le résultat est enregistré dans le SqliteDict. Le db.commit() garantit que toutes les modifications apportées au dictionnaire au cours de l’itération sont enregistrées dans la base de données.

Le SqliteDict sert de cache local pour empêcher que l’API ne soit touchée à chaque fois que le bloc de code est exécuté si les données ont déjà été collectées. En utilisant ce cache, le code réduit le nombre de demandes d’API requises, ce qui est utile lorsque vous travaillez avec des API qui ont des limites de quota. Félicitations, vous utilisez une base de données !

with sqldict("../dbs/linksapi.db") as db:      for sub_endpoint in sub_endpoints:          if sub_endpoint not in db:              print(sub_endpoint)              result = moz(sub_endpoint, dict_of_dicts[sub_endpoint])              db[sub_endpoint] = result              db.commit()              print("API hit and response saved!")              print()  h2("Done")  

Cela ne produit rien à l’écran. Il enregistre les résultats des appels API dans une base de données locale.

Afficher les réponses d’API stockées localement

Ce code utilise le sqldict gestionnaire de contexte pour ouvrir la base de données SQLite contenant les données d’API précédemment récupérées. Il parcourt ensuite les clés de la base de données, qui correspondent aux points de terminaison précédemment récupérés.

Pour chaque clé, le code imprime le nom du point de terminaison, la description et les données extraites de l’API. La fonction pprint est utilisée pour imprimer les données JSON dans un format plus lisible par l’homme, avec une indentation et des sauts de ligne qui facilitent la lecture.

with sqldict("../dbs/linksapi.db") as db:      for i, key in enumerate(db):          h1(f"{i + 1}. {names[i]} ({key})")          print(descriptions[i])          print()          pprint(db[key].json())          print()  

Les sorties:

1. Anchor Text (anchor_text)  Use this endpoint to get data about anchor text used by followed external links to a target. Results are ordered by external_root_domains descending.    {'next_token': 'KIkQVg4s9ak8iRBWDiz1qTyguYswnj035n7bYI0Lc2VvbW96IGJsb2dKBcCodcl47Q==',   'results': [{'anchor_text': 'moz',                'external_pages': 7162,                'external_root_domains': 2026},               {'anchor_text': 'moz blog',                'external_pages': 15525,                'external_root_domains': 1364},               {'anchor_text': 'the moz blog',                'external_pages': 7879,                'external_root_domains': 728},               {'anchor_text': 'seomoz',                'external_pages': 17741,                'external_root_domains': 654},               {'anchor_text': 'https://moz.com/blog',                'external_pages': 978,                'external_root_domains': 491}]}    2. Final Redirect (final_redirect)  Use this endpoint to get data about anchor text used by followed external links to a target. Results are ordered by external_root_domains descending.    {'page': 'moz.com/blog'}    3. Global Top Pages (global_top_pages)  This endpoint returns the top 500 pages in the entire index with the highest Page Authority values, sorted by Page Authority. (Visit the Top 500 Sites list to explore the top root domains on the web, sorted by Domain Authority.)    {'next_token': 'BcLbRwBmrXHK',   'results': [{'deleted_pages_to_page': 11932076,          ...
(Article traduit de moz.com)

Articles similaires

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Bouton retour en haut de la page
Index