Esta es la solución al Ejercicio #2: Comprobar la posición de una palabra clave en Google para un dominio en concreto.
Función comprueba_keywords()
El truco del ejercicio está en hacer una petición GET
con la librería requests
a la URL https://www.google.com/search?q=una_keyword&start=0
y guardar la página devuelta en un fichero. Una vez guardado el fichero, hay que abrirlo y analizar los diferentes componentes HTML que conforman la página de resultados de Google.
De entre todos ellos, los resultados de búsqueda son aquellos contenidos en un bloque div
cuyas clases son ZINbbc xpd O9g5cc uUPGi
. Este bloque div
, contiene a su vez otro bloque div
que incluye un enlace. Si el atributo href
del enlace contiene el dominio por el que estamos buscando, entonces ya se puede calcular la posición en la que rankean las palabras clave para ese dominio contando el número de bloques div
hasta llegar a este en concreto.
Con todo esto, ya puedes implementar la función comprueba_keywords(kw, dominio)
:
import requests from bs4 import BeautifulSoup def aparece_el_dominio(link, dominio): encontrado = False fin = link.find('&') pagina = link[:fin] if dominio in pagina: encontrado = True return encontrado def comprueba_keywords(kw, dominio): continuar = True start = 0 posicion = 1 encontrado = False while continuar and not encontrado: parametros = {'q': kw, 'start': start} resp = requests.get(f'https://www.google.com/search', params=parametros) if resp.status_code == 200: soup = BeautifulSoup(resp.text, 'lxml') div_principal = soup.find('div', {'id': 'main'}) resultados = div_principal.find_all('div', class_='ZINbbc xpd O9g5cc uUPGi') for res in resultados: if res.div and res.div.a: if aparece_el_dominio(res.div.a['href'], dominio): encontrado = True break else: posicion += 1 if not encontrado: footer = div_principal.find('footer') siguiente = footer.find('a', {'aria-label': 'Página siguiente'}) if siguiente: start += 10 if start == 100: continuar = False else: continuar = False else: continuar = False if not encontrado: posicion = 100 return posicion
Observa que si no se ha encontrado el dominio para una página de resultados, hay que verificar si hay más páginas de resultados disponibles (es posible que Google limite las páginas de resultados a 2 o 3). Para ello, hay que comprobar que existe un enlace con el atributo aria-label="Página siguiente"
en el bloque footer
.
Actualizar el menú de la aplicación
Para completar el ejercicio tan solo falta actualizar el menú de la aplicación del siguiente modo:
def muestra_menu(): print('') print('') print('-------- Kwranking --------') print('') print('[1] – Importar palabras clave') print('[2] – Mostrar palabras clave') print('[3] – Comprobar palabras clave') print('[0] – Salir') def run(): keywords = [] dominio = 'j2logo.com' while True: muestra_menu() opcion = input('Selecciona una opción > ') opcion = int(opcion) if opcion == 0: break elif opcion == 1: keywords = carga_keywords() elif opcion == 2: muestra_keywords(keywords) elif opcion == 3: kw = input('Introduzca las palabras clave a comprobar > ') posicion = comprueba_keywords(kw, dominio) if posicion < 100: print(f'Las keywords {kw} se han encontrado en la posición {posicion} para el dominio {dominio}') else: print(f'De momento, las keywords {kw} no rankean para el dominio {dominio}') else: print('Opción no válida')
Fíjate que he añadido la variable dominio
al programa principal para que sea una variable de la aplicación.