Obterner el número de páginas que un sitio tiene indexadas en Google

  • 18 Feb 2020
  • Python, ChromeDriver, Selenium, Web scraping

En detalle, lo que este artículo intentará explicar es como obtener un número de resultados que genera una búsqueda en Google del tipo site:dominio.com. Lo que no quiere decir que se trate a ciencia cierta del número de páginas que el sitio domain.com tenga indexadas en Google. Lo que hace no tan simple obtener este número es que no se encuentra dentro del HTML si no que es generado en forma dinámica. Quiere decir que descargando la página con por ejmploe wget no lo vamos a encontrar. Una solución sería utilizando lo más parecido a un navegador... por ejemplo, Chrome. Solo que controlado por Selenium (versión 3.141.0 al momento de escribir este artículo) para que podamos manejar Chrome con Python.

Instalar ChromeDriver

Desde el sitio de ChromeDriver es posible descargar la versión que más nos guste. Lo único que hay que hacer es descargar el archivo en nuestro equipo (en mi caso un Fedora Server) y darle permisos para que pueda ejecutarse.

cd /tmp
wget https://chromedriver.storage.googleapis.com/81.0.4044.20/chromedriver_linux64.zip #o le versión que sea
unzip chromedriver_linux64.zip
mv chromedriver /usr/bin/
chmod +x /usr/bin/chromedriver

Instalar Selenium

Consultando la documentación oficial de Selenium, podemos instalarlo usando pip

python -m pip install selenium

Python

Bien, una vez instaladas estas dos dependencias podremos a través de Python visitar, extraer y parsear lo que sea. Pero este caso vamos a limitarnos a ese número de resultados que Google imprime inmediatamente antes de la lista de resultados. Este es el script:

import sys
import argparse
import re
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
if sys.version_info[0] < 3:
    reload(sys)
    sys.setdefaultencoding('utf8')
options = webdriver.ChromeOptions()
options.add_argument('--no-sandbox')
options.add_argument("--headless")

parser = argparse.ArgumentParser()
parser.add_argument('-w', '--word', help='word to count', type=str, required=True)
args = parser.parse_args()

try:
    browser = webdriver.Chrome('/usr/bin/chromedriver', options=options)
except:
    print("Looks like we cannot locate the path the 'chromedriver' (use the '--chromedriver' "
          "argument to specify the path to the executable.) or google chrome browser is not "
          "installed on your machine")
    sys.exit()
browser.set_window_size(1920, 1080)

# Open the link
url = 'https://www.google.com/search?q='+args.word
browser.get(url)
# get page source
source = browser.page_source
browser.close()
browser.quit()

soup = BeautifulSoup(source, 'html.parser')
results = str(soup.find("div", {"id": "mBMHK"}))
# strip dots from results string
clean_results = re.sub('[\.]', '', str(results))

for i in clean_results.split():
    if i.isdigit():
        print(i)

Si lo llamamos por ejemplo contar_resultados.py será suficiente ejecutar:

python contar_resultados.py -w="site:minestron.it"