diff --git a/app/__pycache__/panel_izquierdo.cpython-313.pyc b/app/__pycache__/panel_izquierdo.cpython-313.pyc new file mode 100644 index 0000000..a2a58ac Binary files /dev/null and b/app/__pycache__/panel_izquierdo.cpython-313.pyc differ diff --git a/app/__pycache__/pomodoro.cpython-313.pyc b/app/__pycache__/pomodoro.cpython-313.pyc index c148c31..31f56c0 100644 Binary files a/app/__pycache__/pomodoro.cpython-313.pyc and b/app/__pycache__/pomodoro.cpython-313.pyc differ diff --git a/app/__pycache__/scraping.cpython-313.pyc b/app/__pycache__/scraping.cpython-313.pyc new file mode 100644 index 0000000..1f8fcf7 Binary files /dev/null and b/app/__pycache__/scraping.cpython-313.pyc differ diff --git a/app/panel_izquierdo.py b/app/panel_izquierdo.py new file mode 100644 index 0000000..92f7025 --- /dev/null +++ b/app/panel_izquierdo.py @@ -0,0 +1,21 @@ +import tkinter as tk +import threading +from app import scraping + +class PanelIzquierdo: + def __init__(self, frame, text_widget): + # Asociar el frame del panel izquierdo + self.frame = frame + self.frame.configure(bg="lightblue", width=200) + self.frame.grid_propagate(False) + self.frame.columnconfigure(0, weight=1) + + boton_scrapping = tk.Button( + frame, + text="Iniciar Scrapping", + command=lambda: threading.Thread( + target=scraping.iniciar_scraping_y_insercion, + args=("https://www.amazon.es/", text_widget) + ).start() + ) + boton_scrapping.pack(pady=5) \ No newline at end of file diff --git a/app/scraping.py b/app/scraping.py index e69de29..8792a34 100644 --- a/app/scraping.py +++ b/app/scraping.py @@ -0,0 +1,79 @@ +import requests +from bs4 import BeautifulSoup +import threading +import mysql.connector +from queue import Queue + +def obtener_conexion(): + try: + conexion = mysql.connector.connect( + host='localhost', + port=3306, + user='root', + password='1234', + database='scraping' + ) + return conexion + except mysql.connector.Error as err: + print(f"Error al conectar con la base de datos: {err}") + return None + + +# Función para extraer enlaces y enviarlos a la cola +def extraer_enlaces(url, cola, text_widget): + try: + respuesta = requests.get(url) + if respuesta.status_code == 200: + contenido_html = respuesta.text + soup = BeautifulSoup(contenido_html, 'html.parser') + for enlace in soup.find_all('a', href=True): + enlace_str = enlace['href'] + cola.put(enlace_str) + if text_widget: + text_widget.insert('end', enlace_str + "\n") + print("Extracción de enlaces completada.") + else: + print(f"Error al acceder a la URL: {respuesta.status_code}") + except requests.exceptions.RequestException as e: + print(f"Error durante la solicitud HTTP: {e}") + +# Función para insertar enlaces en la base de datos +def insertar_enlaces_mysql(cola): + conexion = obtener_conexion() + if not conexion: + return + + cursor = conexion.cursor() + + cursor.execute('''CREATE TABLE IF NOT EXISTS enlaces ( + id INT AUTO_INCREMENT PRIMARY KEY, + enlace VARCHAR(255) UNIQUE + )''') + + while True: + enlace = cola.get() + if enlace == "FIN": + break + + try: + cursor.execute("INSERT IGNORE INTO enlaces (enlace) VALUES (%s)", (enlace,)) + conexion.commit() + print(f"Enlace insertado en la base de datos: {enlace}") + except mysql.connector.Error as err: + print(f"Error al insertar enlace: {err}") + + cursor.close() + conexion.close() + print("Inserción en la base de datos finalizada.") + + +# Función para iniciar el scraping y la inserción en hilos +def iniciar_scraping_y_insercion(url, text_widget): + cola_enlaces = Queue() + hilo_scraping = threading.Thread(target=extraer_enlaces, args=(url, cola_enlaces, text_widget)) + hilo_insercion = threading.Thread(target=insertar_enlaces_mysql, args=(cola_enlaces,)) + hilo_scraping.start() + hilo_insercion.start() + hilo_scraping.join() + cola_enlaces.put("FIN") + hilo_insercion.join() \ No newline at end of file diff --git a/main.py b/main.py index 768ef98..e50504f 100644 --- a/main.py +++ b/main.py @@ -4,11 +4,14 @@ from tkinter import ttk # Importar el widget ttk from tkinter import messagebox from app import monitorization from app import panel_derecho +from app import panel_izquierdo from app import pomodoro import threading import time import datetime import psutil +from app import scraping + def update_time(status_bar): while True: @@ -73,8 +76,6 @@ frame_derecho.grid(row=0, column=2, sticky="ns") frame_izquierdo.grid_propagate(False) frame_derecho.grid_propagate(False) -panel_izquierdo = panel_derecho.PanelDerecho(frame_derecho) - # Dividir el frame central en dos partes (superior variable e inferior fija) frame_central.rowconfigure(0, weight=1) # Parte superior, tamaño variable frame_central.rowconfigure(1, weight=0) # Parte inferior, tamaño fijo @@ -102,12 +103,13 @@ style.configure("CustomNotebook.TNotebook.Tab", font=("Arial", 12, "bold")) notebook = ttk.Notebook(frame_superior, style="CustomNotebook.TNotebook") notebook.pack(fill="both", expand=True) - # Crear cinco solapas for i in range(1, 6): tab = ttk.Frame(notebook) if i == 1: notebook.add(tab, text="Scrapping", padding=4) + text_scrapping = tk.Text(tab, wrap="word") + text_scrapping.pack(fill="both", expand=True) elif i == 2: # Identificar la solapa 2 notebook.add(tab, text="Pomodoro", padding=4) pomodoro.PomodoroTimer(tab) @@ -125,8 +127,6 @@ for i in range(1, 6): # Usar pack para alinear los labels horizontalmente - - label_cpu_used = tk.Label(barra_estado, text="CPU: 0%", font=("Helvetica", 11), bd=1, fg="blue", relief="sunken", anchor="w", width=20, padx=10) label_ram_used = tk.Label(barra_estado, text="RAM: 0%", font=("Helvetica", 11), bd=1, fg="blue", relief="sunken", anchor="w", width=20, padx=10) label_pc_battery = tk.Label(barra_estado, text="Temperatura CPU: ", font=("Helvetica", 11), bd=1, fg="blue", relief="sunken", anchor="w", width=20, padx=10) @@ -140,6 +140,7 @@ label_network_used.pack(side="left", fill="x", expand=True) label_fecha_hora.pack(side="right", fill="x", expand=True) +#Monitorizacion barra horizontal de abajo update_thread = threading.Thread(target=update_time, args=(label_fecha_hora,)) update_thread.daemon = True update_thread.start() @@ -160,6 +161,10 @@ thread_network_used_monitor = threading.Thread(target=monitorization.monitor_net thread_network_used_monitor.daemon = True thread_network_used_monitor.start() +#Lados verticulas +panel_d = panel_derecho.PanelDerecho(frame_derecho) +panel_i = panel_izquierdo.PanelIzquierdo(frame_izquierdo, text_scrapping) + # Ejecución de la aplicación root.mainloop()