Ahora podemos empezar a escribir el código. Para crear nuestro rastreador, seguiremos un flujo recursivo, de modo que accederemos a todos los enlaces que encontremos. Pero primero, definamos nuestro punto de entrada:
def crawl(url, filename):
page_body = get_page_source(url, filename)
soup = BeautifulSoup(page_body, 'html.parser')
start_crawling(soup)
crawl(FULL_START_URL, 'ecoroots.txt')
Implementamos la función crawl, que extraerá los documentos HTML a través de nuestro procedimiento get_page_source. A continuación, creará el objeto BeautifulSoup que facilitará nuestro análisis y llamará a la función start_crawling, que comenzará a navegar por el sitio web.
def get_page_source(url, filename):
driver.get(url)
soup = BeautifulSoup(driver.page_source, 'html.parser')
body = soup.find('body')
file_source = open(filename, mode='w', encoding='utf-8')
file_source.write(str(body))
file_source.close()
return str(body)
Como se ha indicado anteriormente, la función get_page_source utilizará Selenium para obtener el contenido HTML del sitio web y lo escribirá en un archivo de texto en la sección <body>, ya que es la que contiene todos los enlaces internos que nos interesan.
unique_links = {}
def start_crawling(soup):
links = soup.find_all(lambda tag: is_internal_link(tag))
for link in links:
link_href = link.get('href')
if not link_href in unique_links.keys() or unique_links[link_href] == 0:
unique_links[link_href] = 0
link_url = BASE_URL + link_href
link_filename = link_href.replace(SECTION + '/products/', '') + '.txt'
crawl(link_url, link_filename)
unique_links[link_href] = 1
Esta es la lógica principal del rastreador. Una vez que reciba el objeto BeautifulSoup, extraerá todos los enlaces internos. Lo hacemos utilizando una función lambda, con algunas condiciones que hemos definido en la función is_internal_link:
def is_internal_link(tag):
if not tag.name == 'a': return False
if tag.get('href') is None: return False
if not tag.get('href').startswith(SECTION + '/products'): return False
return True
Esto significa que, para cada elemento HTML que encontramos, primero verificamos si es una etiqueta <a>, si tiene un atributo href y, a continuación, si el valor del atributo href contiene un enlace interno.
Una vez que obtenemos la lista de enlaces, iteramos por cada uno de ellos, construimos la URL completa y extraemos el nombre del producto. Con estos nuevos datos, tenemos un nuevo sitio web que pasamos a la función de rastreo desde nuestro punto de entrada, de modo que el proceso comienza de nuevo.
Pero, ¿qué pasa si nos encontramos con un enlace que ya hemos visitado? ¿Cómo evitamos un ciclo sin fin? Bueno, para esta situación, contamos con la estructura de datos unique_links. Por cada enlace que iteramos, verificamos si se ha accedido a él antes de empezar a rastrearlo. Si es nuevo, simplemente lo marcamos como visitado una vez finalizado el rastreo.
Una vez que ejecutes tu script, el rastreador comenzará a navegar por los productos del sitio web. Puede tardar unos minutos, dependiendo del tamaño del sitio web que elijas. Finalmente, ahora deberías tener un conjunto de archivos de texto que contendrán el HTML de cada página que visite tu rastreador.