Ok, agora podemos escrever algum código!
Comece por abrir uma janela de terminal no seu IDE e execute o seguinte comando, que irá instalar o BeautifulSoup, uma biblioteca que nos ajudará a extrair os dados do HTML:
> pip install beautifulsoup4
Em seguida, crie uma pasta chamada “products”. Isso ajudará a organizar e armazenar os resultados da extração em vários ficheiros CSV.
Por fim, crie o ficheiro “crawler.py”. Aqui vamos escrever todo o nosso código e a lógica de rastreamento. Quando terminarmos, podemos executar o ficheiro com o seguinte comando:
> py crawler.py
Continuando, vamos importar as bibliotecas de que precisamos e, em seguida, definir algumas variáveis globais:
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"
Agora, vamos definir o ponto de entrada para o nosso crawler:
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 a função crawl, que irá extrair os documentos HTML através do nosso procedimento get_page_source. Em seguida, irá construir o objeto BeautifulSoup que facilitará a nossa análise e chamar a função start_crawling, que dará início à navegação no site.
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)
Conforme mencionado anteriormente, a função get_page_source utilizará a WebScrapingAPI para obter o conteúdo HTML do site e irá gravá-lo num ficheiro de texto na secção <body>, uma vez que é essa que contém toda a informação que nos interessa.
Agora, vamos dar um passo atrás e verificar como atingir os nossos objetivos. Os produtos estão organizados em páginas, por isso precisamos de aceder a cada página repetidamente para extrair todos eles.
Isto significa que o nosso rastreador seguirá alguns passos recursivos enquanto houver páginas disponíveis. Para traduzir esta lógica em código, precisamos de ver como o HTML descreve estas condições.
Se voltares à Consola do Desenvolvedor, podes ver que cada número de página é, na verdade, um link para uma nova página. Mais do que isso, considerando que estamos na primeira página e não temos nenhuma outra antes desta, a seta para a esquerda está desativada.
Assim, o algoritmo seguinte tem de:
- Aceder à página;
- Extrair os dados (implementaremos isto no próximo passo);
- Encontrar o contêiner de paginação no documento HTML; Verificar se a seta “Próxima Página” está desativada; parar se estiver e, caso contrário, obter o novo link e chamar a função de rastreamento para a nova 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')