Repository navigation
Expand file tree
/
Copy pathmain.py
More file actions
154 lines (117 loc) · 5.09 KB
/
Copy pathmain.py
File metadata and controls
154 lines (117 loc) · 5.09 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
from scraper.navegador import iniciar_chrome, cerrar_chrome, check_captcha, aceptar_cookies, construir_url
from scraper.paginacion import scrapear_pagina, siguiente_pagina
from scraper.extractor import extraer_experiencias
from exportar.exportar_csv import guardar_csv
from exportar.exportar_json import guardar_json
from exportar.exportar_excel import guardar_excel
from historial.rastreador import detectar_nuevas
from filtros.salario import filtrar_por_salario
def preguntar_datos():
print("\n========================================")
print(" InfoJobs Scraper")
print("========================================\n")
puesto = input("Que puesto quieres buscar? (ej: desarrollador junior): ").strip()
if not puesto:
puesto = "desarrollador junior"
print(f" Usando por defecto: {puesto}")
ubicacion = input("En que ubicacion? (ej: españa, madrid, barcelona): ").strip()
if not ubicacion:
ubicacion = "españa"
print(f" Usando por defecto: {ubicacion}")
print("\nCuantas paginas quieres scrapear?")
print(" 0 o enter - Todas las disponibles")
print(" 1, 2, 3... - Numero concreto")
paginas = input("Paginas: ").strip()
if not paginas or paginas == "0":
paginas = 0
elif paginas.isdigit() and int(paginas) >= 1:
paginas = int(paginas)
else:
print(" Valor no valido, scrapeando todas")
paginas = 0
print("\nFormato de exportacion:")
print(" 1 - CSV")
print(" 2 - JSON")
print(" 3 - CSV y JSON")
print(" 4 - Excel")
print(" 5 - Todos")
formato = input("Elige formato (por defecto 3): ").strip()
if formato not in ["1", "2", "3", "4", "5"]:
formato = "3"
print("\nSalario minimo anual en euros? (enter para no filtrar)")
print("(las ofertas sin salario publicado se mantienen)")
salario_minimo = input("Salario minimo: ").strip().replace(".", "")
if salario_minimo.isdigit():
salario_minimo = int(salario_minimo)
else:
if salario_minimo:
print(" Valor no valido, no se filtra por salario")
salario_minimo = 0
print("\nExtraer experiencia requerida de cada oferta?")
print("(Requiere visitar cada oferta individualmente, mas lento)")
extraer_exp = input("s/n (por defecto n): ").strip().lower()
extraer_exp = extraer_exp == "s"
return puesto, ubicacion, paginas, formato, salario_minimo, extraer_exp
def exportar_ofertas(ofertas, formato):
if not ofertas:
print("No se han encontrado ofertas para exportar")
return
if formato in ["1", "3", "5"]:
guardar_csv(ofertas)
if formato in ["2", "3", "5"]:
guardar_json(ofertas)
if formato in ["4", "5"]:
guardar_excel(ofertas)
def main():
puesto, ubicacion, paginas, formato, salario_minimo, extraer_exp = preguntar_datos()
url = construir_url(puesto, ubicacion)
print(f"\nURL generada: {url}")
modo_todas = paginas == 0
if modo_todas:
print("Modo: scrapear TODAS las paginas disponibles")
else:
print(f"Modo: scrapear {paginas} paginas")
driver = iniciar_chrome()
try:
driver.get(url)
check_captcha(driver)
aceptar_cookies(driver)
todas_las_ofertas = []
pagina_actual = 1
while True:
print(f"\n--- PAGINA {pagina_actual} ---")
ofertas = scrapear_pagina(driver)
todas_las_ofertas.extend(ofertas)
print(f"Llevamos {len(todas_las_ofertas)} ofertas acumuladas")
# si el usuario pidio un numero concreto y ya llegamos, paramos
if not modo_todas and pagina_actual >= paginas:
break
# intentamos pasar a la siguiente
if not siguiente_pagina(driver):
print("No hay mas paginas disponibles")
break
pagina_actual += 1
print(f"\nScraping completado: {len(todas_las_ofertas)} ofertas en {pagina_actual} paginas")
# si el usuario selecionar extraer experiencia extraemos la experiencia visitando cada oferta
if extraer_exp and todas_las_ofertas:
extraer_experiencias(driver, todas_las_ofertas)
# nos quedamos solo con las que llegan al salario minimo que pidio el usuario
if salario_minimo:
antes = len(todas_las_ofertas)
todas_las_ofertas = filtrar_por_salario(todas_las_ofertas, salario_minimo)
print(f"\nFiltro de salario ({salario_minimo} euros): {len(todas_las_ofertas)} de {antes} ofertas")
# comparamos con el historico para ver cuales son nuevas
nuevas = detectar_nuevas(todas_las_ofertas)
# exportamos todas las ofertas encontradas
exportar_ofertas(todas_las_ofertas, formato)
# si hay nuevas las marcamos en consola
if nuevas:
print(f"\nOfertas nuevas desde la ultima ejecucion:")
for oferta in nuevas:
print(f" - {oferta.titulo} ({oferta.empresa})")
print(f"\nProceso finalizado")
finally:
# cerramos chrome de forma limpia
cerrar_chrome(driver)
if __name__ == "__main__":
main()