El texto de Google Ads revela la estrategia de mensajería, las propuestas de valor y las ofertas promocionales de sus competidores. Monitorear cómo cambia el texto del anuncio a lo largo del tiempo lo ayuda a anticiparse al posicionamiento de la competencia e identificar nuevas campañas con anticipación. La API de Scavio incluye resultados de anuncios pagados en su respuesta SERP, que contienen el título, la descripción, la URL visible y el nombre del anunciante. Este tutorial crea un script que rastrea el texto del anuncio para un conjunto de palabras clave, guarda instantáneas en JSON y diferencia los cambios entre ejecuciones.
Requisitos previos
- Python 3.8 o superior
- solicita biblioteca instalada
- Una clave API de Scavio
- Una lista de palabras clave donde los competidores publican anuncios
Guia paso a paso
Paso 1: Obtener resultados SERP, incluidos anuncios
Consulta Google a través de Scavio. La respuesta incluye una matriz de anuncios con título, descripción y display_url para cada resultado pago.
import requests
def get_ads(keyword: str) -> list[dict]:
r = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"query": keyword, "country_code": "us"}
)
r.raise_for_status()
return r.json().get("ads", [])Paso 2: Extraer detalles del texto del anuncio
Analice cada anuncio en busca de título, descripción, URL visible y dominio del anunciante.
def parse_ad(ad: dict) -> dict:
return {
"headline": ad.get("title", ""),
"description": ad.get("description", ""),
"display_url": ad.get("displayed_link", ""),
"link": ad.get("link", ""),
}Paso 3: Guardar instantánea del anuncio en JSON
Almacene cada ejecución como una instantánea con marca de tiempo para que pueda diferenciar el texto del anuncio entre ejecuciones.
import json
from datetime import datetime
def save_snapshot(keyword: str, ads: list[dict]) -> None:
snapshot = {
"keyword": keyword,
"timestamp": datetime.now().isoformat(),
"ads": [parse_ad(a) for a in ads]
}
filename = f"ads_{keyword.replace(' ', '_')}_{datetime.now().strftime('%Y%m%d')}.json"
with open(filename, "w") as f:
json.dump(snapshot, f, indent=2)Paso 4: Diferenciar texto de anuncio entre dos instantáneas
Compare dos archivos instantáneos para detectar anuncios nuevos, anuncios eliminados y copias modificadas.
def diff_snapshots(old_file: str, new_file: str) -> dict:
with open(old_file) as f:
old = {a["link"]: a for a in json.load(f)["ads"]}
with open(new_file) as f:
new = {a["link"]: a for a in json.load(f)["ads"]}
return {
"new_ads": [new[k] for k in new if k not in old],
"removed_ads": [old[k] for k in old if k not in new],
"changed": [new[k] for k in new if k in old and new[k] != old[k]],
}Ejemplo en Python
import os
import json
import requests
from datetime import datetime
API_KEY = os.environ.get("SCAVIO_API_KEY", "your_scavio_api_key")
ENDPOINT = "https://api.scavio.dev/api/v1/search"
KEYWORDS = ["crm software", "project management tool", "email marketing platform"]
def get_ads(keyword: str) -> list[dict]:
r = requests.post(ENDPOINT, headers={"x-api-key": API_KEY},
json={"query": keyword, "country_code": "us"})
r.raise_for_status()
return r.json().get("ads", [])
def monitor():
for kw in KEYWORDS:
ads = get_ads(kw)
print(f"\n{kw}: {len(ads)} ads")
for ad in ads:
print(f" {ad.get('title', 'N/A')}")
print(f" {ad.get('description', '')[:80]}")
snapshot = {"keyword": kw, "ts": datetime.now().isoformat(), "ads": ads}
with open(f"ads_{kw.replace(' ', '_')}.json", "w") as f:
json.dump(snapshot, f, indent=2)
if __name__ == "__main__":
monitor()Ejemplo en JavaScript
const API_KEY = process.env.SCAVIO_API_KEY || "your_scavio_api_key";
const ENDPOINT = "https://api.scavio.dev/api/v1/search";
const fs = require("fs");
async function getAds(keyword) {
const res = await fetch(ENDPOINT, {
method: "POST",
headers: { "x-api-key": API_KEY, "Content-Type": "application/json" },
body: JSON.stringify({ query: keyword, country_code: "us" })
});
const data = await res.json();
return data.ads || [];
}
async function main() {
const keywords = ["crm software", "project management tool"];
for (const kw of keywords) {
const ads = await getAds(kw);
console.log(`\n${kw}: ${ads.length} ads`);
ads.forEach(a => console.log(` ${a.title}`));
fs.writeFileSync(`ads_${kw.replace(/ /g, "_")}.json`, JSON.stringify({ keyword: kw, ads }, null, 2));
}
}
main().catch(console.error);Salida esperada
crm software: 4 ads
Salesforce CRM - The #1 CRM Platform
Start your free trial today. Trusted by 150,000+ businesses worldwide.
HubSpot CRM - Free Forever CRM
Get started with a CRM that scales. No credit card required.
project management tool: 3 ads
Monday.com - Work Management Platform
Manage projects, workflows, and tasks in one place.