Repository navigation
Expand file tree
/
Copy pathscript.py
More file actions
238 lines (193 loc) · 7.07 KB
/
Copy pathscript.py
File metadata and controls
238 lines (193 loc) · 7.07 KB
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
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
# Este script tiene la finalidad de obtener los siguientes datos de diversos
# platillos en kiwilimon.com
# Nombre del platillo, ingredientes, pasos, calorías y link de la imagen de los platillos
import bs4
import re
import psycopg2
from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup
# Pa' que cheques los datos
archivo = open("Datos", "w")
vistos = []
def guardar_datos_bd(nombre, intro ,ing, pasos, cal, carb, prot, lip, fib, az, col, link):
# Datos para la conexión a la base de datos de postgresql
PSQL_HOST = "localhost"
PSQL_PORT = "5432"
PSQL_USER = "ricf"
PSQL_PASS = "123"
PSQL_DB = "proyecto_adoo"
# Intentamos conectarnos a la bd
try:
# Conectarse a la base de datos
connstr = "host=%s port=%s user=%s password=%s dbname=%s" % (PSQL_HOST, PSQL_PORT, PSQL_USER, PSQL_PASS, PSQL_DB)
conn = psycopg2.connect(connstr)
# Abrir un cursor para realizar operaciones sobre la base de datos
cur = conn.cursor()
# Realizamos la query para guardar los valores
query = "INSERT INTO recetas(nombre, intro ,ingredientes, pasos, calorias, carbohidratos, proteinas, lipidos, fibra, azucares, colesterol, link_imagen) VALUES(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s);"
val = (nombre, intro, ing, pasos, cal, carb, prot, lip, fib, az, col, link)
cur.execute(query, val)
conn.commit()
cur.close()
conn.close()
except(Exception, psycopg2.DatabaseError) as error:
print(error)
# Esta función se encarga de recorrer los links de los apartados de la página que se ingresen
def recorrer_pagina(url_madre):
# Establecemos la conexión con la página "madre"
print("Estableciendo conexion...\n")
try:
uClient = uReq(url_madre)
except:
print("No fue posible realizar la conexión")
# Descargamos el html de la página "madre"
print("Obteniendo HTML...\n")
page_html = uClient.read()
# Establecemos el tipo de parse html
page_soup = soup(page_html, "html.parser")
# Todos los links están en links con id feed_a_receta_xxxx
links = page_soup.find_all("a", attrs={"id": re.compile("^feed_a_receta_")})
# Los links a las demás recetas están "incompletos", por lo que hay que concatenárselos
# a la siguiente base
base = "https://www.kiwilimon.com"
# Recorremos los links, obtenemos el complemento a los links y los construimos
for i in range(0, len(links)):
cadena = str(links[i])
cadena = str(links[i])
limite = cadena.find('"')
cadena = cadena[limite+1:]
limite = cadena.find('"')
cadena = cadena[:limite]
link_armado = base + cadena
# Ya que hay recetas repetidas, hacemos esta validación para saber si ya vimos
# anteriormente esta receta
if(link_armado not in vistos):
vistos.append(link_armado)
# Obtenemos la info del platillo
obtener_info_platillo(link_armado)
uClient.close()
# Esta función se encarga de establecer la conexión con la página y de obtener los
# datos que se quieren
def obtener_info_platillo(url):
# Abrimos la conección con el sitio
print("Estableciendo conexion...\n")
try:
uClient = uReq(url)
except:
print("No fue posible realizar la conexión")
# Leemos y guardamos el código html de la página
print("Obteniendo HTML...\n")
page_html = uClient.read()
# Establecemos el tipo de parse html
page_soup = soup(page_html, "html.parser")
# El nombre del platillo se encuentra en el primer h1 de la página
nombre_platillo = page_soup.h1.text
# Los ingredientes se encuentran en la etiqueta span con clase "ingrediente-nombre"
ingredientes_containers = page_soup.find_all('span', class_ = 'ingrediente-nombre')
ingredientes = []
# Guardamos los ingredientes en un arreglo
for container in ingredientes_containers:
ingredientes.append(container.text)
# Los pasos se encuentran en la etiqueta div con clase "pasos"
pasos_containers = page_soup.find_all('div', class_= 'pasos')
# Obtenemos el texto de esta división
pasos = pasos_containers[0].text
# Los pasos tienen muchos saltos de línea, le damos formato a los pasos
pasos = pasos.replace("\n", "")
pasos = pasos.replace(".", "\n")
pasos = pasos[1:]
calorias = page_soup.find_all('div', class_='div_cal')
if(len(calorias) != 0):
calorias = re.split("\s", calorias[0].text)
calorias = float(calorias[2])
else:
calorias = None
carb = page_soup.find_all('div', class_='div_car')
if(len(carb) != 0):
carb = re.split("\s", carb[0].text)
carb = float(carb[2])
else:
carb = None
prot = page_soup.find_all('div', class_='div_pro')
if(len(prot) != 0):
prot = re.split("\s", prot[0].text)
prot = float(prot[2])
else:
prot = None
lip = page_soup.find_all('div', class_='div_lip')
if(len(lip) != 0):
lip = re.split("\s", lip[0].text)
lip = float(lip[2])
else:
lip = None
fib = page_soup.find_all('div', class_='div_fib')
if(len(fib) != 0):
fib = re.split("\s", fib[0].text)
fib = float(fib[3])
else:
fib = None
azu = page_soup.find_all('div', class_='div_azu')
if(len(azu) != 0):
azu = re.split("\s", azu[0].text)
azu = float(azu[2])
else:
azu = None
col = page_soup.find_all('div', class_='div_col')
if(len(col) != 0):
col = re.split("\s", col[0].text)
col = float(col[2])
else:
col = None
etiqueta_img = page_soup.find_all('img', class_='postload imagen')
etiqueta_img = str(etiqueta_img)
lim_inf = etiqueta_img.find("toload")
lim_sup = etiqueta_img.find(">")
etiqueta_img = etiqueta_img[lim_inf:lim_sup]
pivote = '"'
lim_sup = etiqueta_img.find(pivote)
etiqueta_img = etiqueta_img[lim_sup:]
etiqueta_img = etiqueta_img.replace(pivote, "")
etiqueta_img = etiqueta_img[:len(etiqueta_img) - 1]
info = page_soup.find_all("td", class_="diez celdaingredientes")
info = info[0].div.text
info = info[22:]
# Cerramos la conexión con el sitio
print("Cerrando conexión...")
uClient.close()
lista_ing = ""
aux = []
archivo.write(nombre_platillo)
archivo.write("\n")
archivo.write(info)
archivo.write("\n")
for i in range(0, len(ingredientes)):
aux.append(ingredientes[i])
aux.append("\n")
lista_ing = lista_ing + aux[i]
archivo.write(lista_ing)
archivo.write("\n")
archivo.write(pasos)
archivo.write("\n")
archivo.write(str(calorias))
archivo.write("\n")
archivo.write(str(carb))
archivo.write("\n")
archivo.write(str(prot))
archivo.write("\n")
archivo.write(str(lip))
archivo.write("\n")
archivo.write(str(fib))
archivo.write("\n")
archivo.write(str(azu))
archivo.write("\n")
archivo.write(str(col))
archivo.write("\n")
archivo.write(etiqueta_img)
archivo.write("\n---------------------------------------------\n")
guardar_datos_bd(nombre_platillo, info, lista_ing, pasos, calorias, carb, prot, lip, fib, azu, col, etiqueta_img)
paginas = ("https://www.kiwilimon.com/recetas/carnes-y-aves", "https://www.kiwilimon.com/temporada/recetas-a-la-parrilla",
"https://www.kiwilimon.com/recetas/ensaladas", "https://www.kiwilimon.com/recetas/pescados-y-mariscos",
"https://www.kiwilimon.com/recetas/pastas", "https://www.kiwilimon.com/recetas/comida-para-ninos",
"https://www.kiwilimon.com/recetas/sopas", "https://www.kiwilimon.com/recetas/guarniciones")
for i in range(0, len(paginas)):
recorrer_pagina(paginas[i])