¡Bien, ahora podemos escribir algo de código!
Empieza abriendo una ventana de terminal en tu IDE y ejecuta el siguiente comando, que instalará BeautifulSoup, una biblioteca que nos ayudará a extraer los datos del HTML:
> pip install beautifulsoup4
A continuación, crea una carpeta llamada «products». Te ayudará a organizar y almacenar los resultados del scraping en varios archivos CSV.
Por último, crea el archivo «crawler.py». Aquí vamos a escribir todo nuestro código y la lógica de rastreo. Cuando hayamos terminado, podemos ejecutar el archivo con el siguiente comando:
> py crawler.py
Continuando, importemos las bibliotecas que necesitamos y definamos algunas variables globales:
import requests
from bs4 import BeautifulSoup
import csv
BASE_URL = "https://www.shopetee.com"
SECTION = "/collections/all-collections"
FULL_START_URL = BASE_URL + SECTION
ENDPOINT = "https://api.webscrapingapi.com/v1/"
API_KEY = "API_KEY"
Ahora, definamos el punto de entrada para nuestro rastreador:
def crawl(url, filename):
page_body = get_page_source(url, filename)
soup = BeautifulSoup(page_body, 'html.parser')
start_crawling(soup, filename)
crawl(FULL_START_URL, 'etee-page1.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):
params = {
"api_key": API_KEY,
"url": url,
"render_js": '1'
}
page = requests.request("GET", ENDPOINT, params=params)
soup = BeautifulSoup(page.content, '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á WebScrapingAPI 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 toda la información que nos interesa.
Ahora, demos un paso atrás y veamos cómo lograr nuestros objetivos. Los productos están organizados en páginas, por lo que necesitamos acceder a cada página repetidamente para extraerlos todos.
Esto significa que nuestro rastreador seguirá unos pasos recursivos mientras haya páginas disponibles. Para plasmar esta lógica en código, tenemos que fijarnos en cómo describe el HTML estas condiciones.
Si vuelves a la Consola de desarrolladores, verás que cada número de página es en realidad un enlace a una nueva página. Es más, teniendo en cuenta que estamos en la primera página y no hay ninguna anterior a esta, la flecha de la izquierda está desactivada.
Por lo tanto, el siguiente algoritmo debe:
- Acceder a la página;
- Extraer los datos (lo implementaremos en el siguiente paso);
- Encontrar el contenedor de paginación en el documento HTML; Verificar si la flecha de «Página siguiente» está desactivada; si lo está, detenerse; si no, obtener el nuevo enlace y llamar a la función de rastreo para la nueva página.
def start_crawling(soup, filename):
extract_products(soup, filename)
pagination = soup.find('ul', {'class': 'pagination-custom'})
next_page = pagination.find_all('li')[-1]
if next_page.has_attr('class'):
if next_page['class'] == ['disabled']:
print("You reached the last page. Stopping the crawler...")
else:
next_page_link = next_page.find('a')['href']
next_page_address = BASE_URL + next_page_link
next_page_index = next_page_link[next_page_link.find('=') + 1]
crawl(next_page_address, f'etee-page{next_page_index}.txt')