Extraer datos de keywords con Google App Script y la API de Semrush

Como todos sabemos, Semrush también ofrece una forma de trabajar sus datos a través de API. Básicamente la API es una llamada a los datos de la herramienta que nos permite acceder a ellos sin la necesidad de hacer login, lo que puede sernos de gran utilidad para trabajar los datos de una forma diferente y más accesible; solamente necesitas tu API Key, que luego te explicaré cómo encontrarla.

Antes de nada, comentar que hay diferentes formas de acceder a la API de Semrush, y diferentes datos que consultar, por lo que puede ser de utilidad que leas la documentación oficial de la API.

En este caso, quería acceder de una forma sencilla y rápida a las estadísticas de un determinado set de keywords sin necesidad de estar continuamente logueandome en la tool. A estas estadísticas de keywords se accede a través de la «Analytics API» que devuelve sus valores en arrays fácilmente manejables, por lo que normalmente lo que se hace es acceder a través de fórmulas dentro del mismo Excel o Spreadsheet (con la mítica función «=IMPORTDATA()» , etc, etc) Pero es cierto que este proceso puede ser algo engorroso y llevarnos un tiempo prepararnos el propio documento con todas las fórmulas «para que quede bonito.»

Pensé en crear un script que automáticamente me recogiera los datos que me interesaban de las keywords y me los pintara de forma bonita en un spreadsheet; una forma sencilla y accesible de recoger estas estadísticas que me puede servir de apoyo en la estrategia SEO.

Dicho esto, me puse manos a la obra con Google App Script y cree una plantilla en Spreadsheet para automatizar el proceso y extraer en bulk estas estadísticas a partir de un set de keywords; como he dicho antes, lo único que necesitamos incluir en el Spreadsheet es nuestra API Key, lo cual explicaré más adelante.

ENLACE A PLANTILLA DE SPREADSHEET

Necesitas hacer una copia en tu Google Drive para editarla: Archivo > Hacer una copia


🔩
Funcionamiento del Spreadsheet y <script>

Funcionamiento del Spreadsheet para extraer datos de keywords (lógicamente en el vídeo de ejemplo no he incluido mi API Key)

1 . Como he comentado, necesitamos incluir en la plantilla (en concreto en la celda C2) la API Key de nuestro perfil de Semrush, que utilizará el script para hacer las llamadas. Como es lógico, sin este API Key será imposible trabajar.

uso-api-script

2 . Añade tu set de keywords en la columna B y… el resto del trabajo ya te lo he hecho yo 😉

3 . Clicka en el botón «Generate Data Keywords» y los datos se pintarán automáticamente. Cuantas mas keywords incluyas, más le costará «pensar» al script y más tiempo tardará en devolverte datos; ten paciencia.

4 . Te doy la opción de descargarte los datos en formato CSV por si quieres darle un tratamiento extra o montarte tu propio Excel (entre otros usos). Sólo tienes que abrir el menú que genera el script y descargar el archivo desde la ventana que se abre.

Puedes descargarte los datos en formato CSV.

🔍️ ¿Dónde encuentro mi API Key de Semrush?

Para encontrar tu API Key en Semrush:

api-key-semrush

✔️ Ventajas de uso

  • Evitas loguearte en la aplicación para extraer datos y estadísticas de keywords.
  • Si quieres trabajar con la API, evitas montarte un excel o spreadsheets con engorrosas fórmulas para extraer datos y «dejarlos bonitos».
  • Te puedes saltar el límite de 100 keywords de Semrush de la tool «Visión general de palabras clave» y extraer en bulk datos para mayor número de keywords (ten paciencia con la ejecución del script)
  • Puedes juntar estos datos directamente en el spreadsheet con otras fuentes, cruzarlos y montarte un buen dashboard para tus keywords research u otros usos.

Una vez utilices el script, se te informa de las Unidades API con las que cuentas actualmente en tu cuenta y el nº de unidades API que te ha consumido la llamada que acabas de ejecutar.

Es importante que vayas controlando esto, por si te excedes con el uso de la API.

Código del script

Aquí el código de Google App Script para extraer datos de keywords a través de la API de Semrush.

GetDataKeywords.gs

(Código mejorado con mayor eficiencia de escritura)

  //variables globales
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var ufila = ss.getLastRow();
  var keywords = ss
                    .getRange("B6:B" + ufila)
                    .getValues()
                    .flat();
  var datos = []
  var apikey = ss
                    .getRange("C2:C2")
                    .getValues()

  //contar api units
  var number = keywords.length
  var units = number*50 + number*10
  ss.getRange("G2:G2").setValue(units);                  

  function getDataKeywords() {

  //iterador de llamadas
  const iterator = keywords.forEach(kw => {
  var response = UrlFetchApp.fetch('https://api.semrush.com/?type=phrase_this&key='+apikey+'&phrase='+kw+'&export_columns=Ph,Nq,Cp,Co,Nr&database=es');
  var responseData = response.getBlob().getDataAsString(); 
  
  var response_kd = UrlFetchApp.fetch('https://api.semrush.com/?type=phrase_kdi&key='+apikey+'&export_columns=Kd&phrase='+kw+'&database=es');
  var responseData_kd = response_kd.getBlob().getDataAsString().replace('Keyword Difficulty Index', '')

  //rellenar array con los datos
  if(responseData[0] == 'E'){
  datos.push(['No Data','No Data','No Data','No Data','No Data'])
  }else{
  var spliter = responseData.split(";")
  var removed = spliter.splice(0,5);
  datos.push([spliter[0], responseData_kd, spliter[1], spliter[2], spliter[3]])
  }
  })

  //pintar unidades api restantes
  var response_api = UrlFetchApp.fetch('http://es.semrush.com/users/countapiunits.html?key='+apikey); 
  var responseData_api = response_api.getBlob().getDataAsString(); 
  ss.getRange("G3:G3").setValue(responseData_api); 
 
  //pintar datos de las kws
  ss.getRange("C6:G"+ufila).setValues(datos)
  
  csvfer();
}

  //creacion de csv
  var csv = "";
  var v = ss
            .getActiveSheet()
            .getRange("B4:F"+ufila)
            .getValues();
      v.forEach(e => {
      csv += e.join(",") + "\n";
    })

  //creador de menu y dialogo
  function csvfer(){
    SpreadsheetApp.getUi()
                  .createMenu('📊 File')
                  .addItem('📁 Export CSV file', 'dialog')
                  .addToUi()
                  }

  function dialog() {
    var html = HtmlService.createHtmlOutputFromFile('download');
    SpreadsheetApp.getUi().showModalDialog(html, 'Data Keywords Extractor - Alex RomeroSEO');
                  }

  //funcion de descarga
  function getFileUrl() {
      var date = Utilities.formatDate(new Date(), "GMT+2", "dd/MM/yyyy");
      var filename = date+"- Data-Keywords-Semrush"; 
      var url = DriveApp
                        .createFile(filename, csv, MimeType.CSV)
                        .getDownloadUrl()
                        .replace("?e=download&gd=true","");
      return url;
  }

Y la ventana HTML desde donde descargar el fichero en formato CSV.

Download.html

<!DOCTYPE html>
<html>
  <head>
    <style type="text/css">
  .enlace { 
    background-color: #f2d252;
    font-weight: bold;
    border: 0;
    border-top-left-radius: 10px;
    border-top-right-radius: 10px;
    border-bottom-right-radius: 10px;
    border-bottom-left-radius: 10px;
    padding: 8px;
    text-decoration: none;
    margin: auto;
  }

  .enlace:hover {
    background-color: #7aafdd;
    color: white;
  }

  ul li{
    list-style:none
  }

  p , h2{
    font-family: Roboto Slab;
  }

  .separator{
    margin-top: 3em;
  }
    </style>
  </head>
  <body>
    <p> Gracias por usar el extractor de datos. </p>
    <p> Puedes encontrarme en: 
      <ul>
        <li> 💬 LinkedIn: <a target="_blank" href="https://www.linkedin.com/in/alex-romero-lopez/"> Alex Romero Lopez </a> </li>
        <li> 🌐 Web: <a target="_blank" href="https://seoalex.es/"> seoalex.es </a>  </li>
        <li> 🐦 Twitter: <a target="_blank" href="https://twitter.com/AlexRomeroSEO"> AlexRomeroSEO </a> </li>
        <li> 💻 GitHub: <a target="_blank" href="https://github.com/alexromeroSEO"> Alex RomeroSEO </a> </li>
      </ul>
    </p>

    <div class="separator">
      <a class="enlace" href="javascript:google.script.run
                                              .withSuccessHandler(executeDownload)
                                              .getFileUrl();"> Descargar CSV </a>
    </div> 

  </body>
  <script>
    function executeDownload(url) {
      window.location.href = url;
    }
  </script>
</html>

Espero que os haya sido de ayuda 😊

¡Os leo en comentarios!

Sobre el autor

Alex Romero Lopez, Consultor SEO en España
alejandro.romerolopez95@gmail.com Web Otros artículos del autor

Especialista SEO con gran foco en el área técnica. Entusiasta de la programación, en especial Python y Javascript, y la aplicación de ésta en el ámbito SEO para automatizar procesos o profundizar en ciertos ámbitos como el web scraping o el uso de APIs. He trabajado en proyectos SEO de muy diferente tamaño y sector lo que me permite obtener una perspectiva 360º de cómo trabajarlo.

Deja un comentario