-
Notifications
You must be signed in to change notification settings - Fork 0
/
WEBSCRAPPING_READY.py
195 lines (150 loc) · 7.07 KB
/
WEBSCRAPPING_READY.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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
# -*- coding: utf-8 -*-
"""CODIGO - Projeto WEBSCRAPPING.ipynb
Automatically generated by Colaboratory.
"""
# criar um navegador
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import pandas as pd
# criar o navegador
nav = webdriver.Chrome()
# importar/visualizar a base de dados
tabela_produtos = pd.read_excel("buscas.xlsx")
display(tabela_produtos)
"""Definição das funções de busca no google e no buscape"""
import time
def busca_google_shopping(nav, produto, termos_banidos, preco_minimo, preco_maximo):
# entrar no google
nav.get("https://www.google.com/")
# tratar os valores que vieram da tabela
produto = produto.lower()
termos_banidos = termos_banidos.lower()
lista_termos_banidos = termos_banidos.split(" ")
lista_termos_produto = produto.split(" ")
preco_maximo = float(preco_maximo)
preco_minimo = float(preco_minimo)
# pesquisar o nome do produto no google
nav.find_element(By.XPATH, '/html/body/div[1]/div[3]/form/div[1]/div[1]/div[1]/div/div[2]/input').send_keys(produto)
nav.find_element(By.XPATH, '/html/body/div[1]/div[3]/form/div[1]/div[1]/div[1]/div/div[2]/input').send_keys(Keys.ENTER)
# clicar na aba shopping
elementos = nav.find_elements(By.CLASS_NAME, 'hdtb-mitem')
for item in elementos:
if "Shopping" in item.text:
item.click()
break
# pegar a lista de resultados da busca no google shopping
lista_resultados = nav.find_elements(By.CLASS_NAME, 'sh-dgr__grid-result')
# para cada resultado, ele vai verificar se o resultado corresponde a todas as nossas condicoes
lista_ofertas = [] # lista que a função vai me dar como resposta
for resultado in lista_resultados:
nome = resultado.find_element(By.CLASS_NAME, 'Xjkr3b').text
nome = nome.lower()
# verificacao do nome - se no nome tem algum termo banido
tem_termos_banidos = False
for palavra in lista_termos_banidos:
if palavra in nome:
tem_termos_banidos = True
# verificar se no nome tem todos os termos do nome do produto
tem_todos_termos_produto = True
for palavra in lista_termos_produto:
if palavra not in nome:
tem_todos_termos_produto = False
if not tem_termos_banidos and tem_todos_termos_produto: # verificando o nome
try:
preco = resultado.find_element(By.CLASS_NAME, 'a8Pemb').text
preco = preco.replace("R$", "").replace(" ", "").replace(".", "").replace(",", ".")
preco = float(preco)
# verificando se o preco ta dentro do minimo e maximo
if preco_minimo <= preco <= preco_maximo:
elemento_link = resultado.find_element(By.CLASS_NAME, 'aULzUe')
elemento_pai = elemento_link.find_element(By.XPATH, '..')
link = elemento_pai.get_attribute('href')
lista_ofertas.append((nome, preco, link))
except:
continue
return lista_ofertas
def busca_buscape(nav, produto, termos_banidos, preco_minimo, preco_maximo):
# tratar os valores da função
preco_maximo = float(preco_maximo)
preco_minimo = float(preco_minimo)
produto = produto.lower()
termos_banidos = termos_banidos.lower()
lista_termos_banidos = termos_banidos.split(" ")
lista_termos_produto = produto.split(" ")
# entrar no buscape
nav.get("https://www.buscape.com.br/")
# pesquisar pelo produto no buscape
nav.find_element(By.CLASS_NAME, 'search-bar__text-box').send_keys(produto, Keys.ENTER)
# pegar a lista de resultados da busca do buscape
time.sleep(5)
lista_resultados = nav.find_elements(By.CLASS_NAME, 'Cell_Content__1630r')
# para cada resultado
lista_ofertas = []
for resultado in lista_resultados:
try:
preco = resultado.find_element(By.CLASS_NAME, 'CellPrice_MainValue__3s0iP').text
nome = resultado.get_attribute('title')
nome = nome.lower()
link = resultado.get_attribute('href')
# verificacao do nome - se no nome tem algum termo banido
tem_termos_banidos = False
for palavra in lista_termos_banidos:
if palavra in nome:
tem_termos_banidos = True
# verificar se no nome tem todos os termos do nome do produto
tem_todos_termos_produto = True
for palavra in lista_termos_produto:
if palavra not in nome:
tem_todos_termos_produto = False
if not tem_termos_banidos and tem_todos_termos_produto:
preco = preco.replace("R$", "").replace(" ", "").replace(".", "").replace(",", ".")
preco = float(preco)
if preco_minimo <= preco <= preco_maximo:
lista_ofertas.append((nome, preco, link))
except:
pass
return lista_ofertas
"""Contrução da lista de ofertas encontradas"""
tabela_ofertas = pd.DataFrame()
for linha in tabela_produtos.index:
produto = tabela_produtos.loc[linha, "Nome"]
termos_banidos = tabela_produtos.loc[linha, "Termos banidos"]
preco_minimo = tabela_produtos.loc[linha, "Preço mínimo"]
preco_maximo = tabela_produtos.loc[linha, "Preço máximo"]
lista_ofertas_google_shopping = busca_google_shopping(nav, produto, termos_banidos, preco_minimo, preco_maximo)
if lista_ofertas_google_shopping:
tabela_google_shopping = pd.DataFrame(lista_ofertas_google_shopping, columns=['produto', 'preco', 'link'])
tabela_ofertas = tabela_ofertas.append(tabela_google_shopping)
else:
tabela_google_shopping = None
lista_ofertas_buscape = busca_buscape(nav, produto, termos_banidos, preco_minimo, preco_maximo)
if lista_ofertas_buscape:
tabela_buscape = pd.DataFrame(lista_ofertas_buscape, columns=['produto', 'preco', 'link'])
tabela_ofertas = tabela_ofertas.append(tabela_buscape)
else:
tabela_buscape = None
display(tabela_ofertas)
"""Exportar a base de ofertas para Excel"""
# exportar pro excel
tabela_ofertas = tabela_ofertas.reset_index(drop=True)
tabela_ofertas.to_excel("Ofertas.xlsx", index=False)
"""Enviando o e-mail"""
# enviar por e-mail o resultado da tabela
import win32com.client as win32
#verificando se existe alguma oferta dentro da tabela de ofertas
if len(tabela_ofertas.index) > 0:
# vou enviar email
outlook = win32.Dispatch('outlook.application')
mail = outlook.CreateItem(0)
mail.To = 'seuemail@gmail.com'
mail.Subject = 'Produto(s) Encontrado(s) na faixa de preço desejada'
mail.HTMLBody = f"""
<p>Prezados,</p>
<p>Encontramos alguns produtos em oferta dentro da faixa de preço desejada. Segue tabela com detalhes</p>
{tabela_ofertas.to_html(index=False)}
<p>Qualquer dúvida estou à disposição</p>
<p>Att.,</p>
"""
mail.Send()
nav.quit()