-
Notifications
You must be signed in to change notification settings - Fork 0
/
datos_async.py
131 lines (106 loc) · 5.38 KB
/
datos_async.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
# datos_async.py
from bs4 import BeautifulSoup
from playwright.async_api import async_playwright
import asyncio
import re
from unidecode import unidecode
async def async_consigue_datos(max_dias_publicacion: int, links: list = None):
datos = []
async with async_playwright() as p:
for link_producto in links:
try:
browser = await p.chromium.launch(headless=True)
page = await browser.new_page()
await page.set_viewport_size({"width": 1720, "height": 1280})
await page.goto(link_producto)
# Esperar un poco para asegurar que la página haya cargado
await asyncio.sleep(2)
# Cerrar botón de iniciar sesión si existe
selector = 'div[aria-label="Cerrar"]'
element = page.locator(selector).first
if element:
await element.click()
print(f"Se hizo clic en el elemento con selector '{selector}'")
else:
print(f"No se encontró ningún elemento con el selector '{selector}'")
print("Consiguiendo datos...")
html = await page.content()
soup = BeautifulSoup(html, 'html.parser')
meta_tags = soup.find_all('meta') # Descripciones
title_tag = soup.find('title') # Títulos
script_tags = soup.find_all('script') # Precios en JSON {"formatted_amount_zeros_stripped":"$150.000"}
# Título del producto
titulo_producto = ""
if title_tag:
contenido_titulo = title_tag.text.strip()
titulo_producto = contenido_titulo
else:
titulo_producto = None
print("TITULO NO ENCONTRADO")
# Precio, buscar con expresiones regulares
patron_precio = re.compile(r'formatted_amount_zeros_stripped":"(\$[\d,\.]+)"')
precio_producto = ""
for script in script_tags:
script_content = script.string
if script_content:
# Aplicar la búsqueda con regex
matches_precio = patron_precio.findall(script_content)
# Imprimir los resultados encontrados
for match in matches_precio:
precio_producto = match
# Clasificación
patron_clasificacion = re.compile(r'\{"name":"([^"]+)","seo_info"')
clasificacion_producto = ""
for script in script_tags:
script_content = script.string
if script_content:
# Buscar coincidencias del patrón
matches_clasificacion = patron_clasificacion.findall(script_content)
for match in matches_clasificacion:
clasificacion_producto += " " + unidecode(match.encode().decode('unicode_escape'))
# Fecha aproximada
fecha_publicacion_aprox_producto = max_dias_publicacion
# Ubicación
ubicacion_producto = ""
patron_ciudad = re.compile(r'\{"reverse_geocode":\{"city":"([^"]+)"\}\}')
for script in script_tags:
script_content = script.string
if script_content:
# Buscar coincidencias del patrón
matches_ciudad = patron_ciudad.findall(script_content)
for match in matches_ciudad:
ubicacion_producto = unidecode(match.encode().decode('unicode_escape'))
# Estado del producto
estado_producto = ""
patron_estado = re.compile(r'\[{"attribute_name":"[^"]*","value":"[^"]*","label":"([^"]+)"}\]')
for script in script_tags:
script_content = script.string
if script_content:
# Aplicar la búsqueda con regex
matches_estado = patron_estado.findall(script_content)
# Imprimir los resultados encontrados
for match in matches_estado:
estado_producto = match
# Detalles del producto
detalles_producto = ""
for meta in meta_tags:
if meta.get('name') == 'description':
descripcion_producto = meta.get('content')
detalles_producto = descripcion_producto
break
# Guardar los datos del producto en la lista
datos.append({
"titulo": titulo_producto,
"precio": precio_producto,
"clasificacion": clasificacion_producto,
"ubicacion": ubicacion_producto,
"estado_producto": estado_producto,
"max_dias_publicacion": fecha_publicacion_aprox_producto,
"detalles_producto": detalles_producto,
"enlace": link_producto
})
except Exception as e:
print(f"Error en {link_producto}: {e}")
finally:
await browser.close()
return datos