Solución al Ejercicio #2

Share on facebook
Share on twitter
Share on linkedin

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.

Si te ha resultado útil, compártelo con tus amigos 🤗

Share on facebook
Facebook
Share on twitter
Twitter
Share on linkedin
LinkedIn

Sé un Pythonista: Recibe trucos Python y accede a nuestro espacio de Slack

También te puede interesar

* Te informo de que los datos de carácter personal que proporciones al comentar serán tratados por Juan José Lozano Gómez como responsable de esta web. La Finalidad es moderar los comentarios. La Legitimación es gracias a tu consentimiento. Destinatarios: tus datos se encuentran alojados en Disqus (disqus.com), mi sistema de comentarios, que está acogido al acuerdo de seguridad EU-US Privacy. Podrás ejercer Tus Derechos de Acceso, Rectificación, Limitación o Suprimir tus datos enviando un email a juanjo@j2logo.com. Encontrarás más información en la POLÍTICA DE PRIVACIDAD.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Sobre j2logo

Quiero ayudarte a que seas mejor programador/a, pero no uno cualquiera, sino uno de los top.

Últimos posts

¿Quieres ser un auténtico Pythonista? 🐍

📩 Recibe de vez en cuando trucos, scripts y tutoriales Python en español para dominar el lenguaje. No es SPAM. Date de baja cuando quieras

🥇 Accede a nuestra comunidad privada de Slack: Pythonistas-es

* Al enviar el formulario confirmas que aceptas la POLITICA DE PRIVACIDAD

Pythonistas-es

SÉ UN AUTÉNTICO PYTHONISTA

📩 Recibe trucos, scripts y tutoriales Python

🥇 Accede a nuestra comunidad privada de Slack