-
Notifications
You must be signed in to change notification settings - Fork 0
/
scraper.py
executable file
·95 lines (76 loc) · 2.96 KB
/
scraper.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import time
import datetime
import pandas as pd
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from bs4 import BeautifulSoup
# Constantes
SITE_URL = 'https://www.kabum.com.br/'
TERMO_PESQUISA = 'Processador'
NUM_PAGS = 5
NOME_ARQUIVO = "{}_{}.csv".format(TERMO_PESQUISA, datetime.datetime.now().strftime("%d%m%Y%H%M"))
def extrair_infos_produto(produto):
wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'priceCard')))
titulo = produto.find('span', class_='nameCard').text
preco_a_vista = float(produto.find('span', class_='priceCard').text.split('R$')[1].replace('.', '').replace(',', '.'))
avaliacao = len(produto.find_all('div', class_='estrelaAvaliacao'))
qtde_avaliacao = int(produto.find('div', class_='labelTotalAvaliacoes').text[1:-1]) if produto.find('div', class_='labelTotalAvaliacoes') else 0
return titulo, preco_a_vista, avaliacao, qtde_avaliacao
# Inicializando o webdriver
browser_options = Options()
browser_options.add_argument('--headless')
driver = webdriver.Firefox(options=browser_options)
driver.get(SITE_URL)
# Buscar
campo_busca = driver.find_element(By.ID, value='input-busca')
campo_busca.send_keys(TERMO_PESQUISA)
campo_busca.send_keys(Keys.ENTER)
# Listas para armazenar os dados
titulos = []
precos_a_vista = []
avaliacoes = []
qtde_avaliacoes = []
# Inicia o loop de cada página
p = 1
while p <= NUM_PAGS:
try:
print(f"Lendo página {p}...")
wait = WebDriverWait(driver, 10)
# Inicia a extração das informações
try:
html = driver.find_elements(By.TAG_NAME, 'main')[0]
except IndexError as ie:
driver.refresh()
continue
html = html.get_attribute("innerHTML")
sopa = BeautifulSoup(html, 'html5lib')
for item in sopa.find_all('div', {'class': 'productCard'}):
titulo, preco_a_vista, avaliacao, qtde_avaliacao = extrair_infos_produto(item)
titulos.append(titulo)
precos_a_vista.append(preco_a_vista)
avaliacoes.append(avaliacao)
qtde_avaliacoes.append(qtde_avaliacao)
wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'nextLink'))).click()
p += 1
if p > NUM_PAGS:
print("Extração concluída.")
break
except Exception as e:
print("Exceção:", e)
break
# Fechando o webdriver
driver.close()
# Criando o DataFrame com as listas
df = pd.DataFrame()
df["Nome"] = titulos
df["Preco_a_vista"] = precos_a_vista
df["Avaliacao"] = avaliacoes
df["Qtde_Avaliacoes"] = qtde_avaliacoes
print(f"\n{len(df)} registros adicionados.")
# Exportando para CSV
df.to_csv(NOME_ARQUIVO, index=False)
print(f"Arquivo salvo como {NOME_ARQUIVO}.")