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.
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
Consultando la documentación oficial de Selenium, podemos instalarlo usando pip
python -m pip install selenium
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"