From d6d750ae33a952e18feececaf31d63033bf5b96d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Moran?= Date: Wed, 11 Dec 2024 03:42:22 +0100 Subject: [PATCH] Scrapping --- .../panel_izquierdo.cpython-313.pyc | Bin 0 -> 1580 bytes app/__pycache__/pomodoro.cpython-313.pyc | Bin 8390 -> 8390 bytes app/__pycache__/scraping.cpython-313.pyc | Bin 0 -> 3922 bytes app/panel_izquierdo.py | 21 +++++ app/scraping.py | 79 ++++++++++++++++++ main.py | 15 ++-- 6 files changed, 110 insertions(+), 5 deletions(-) create mode 100644 app/__pycache__/panel_izquierdo.cpython-313.pyc create mode 100644 app/__pycache__/scraping.cpython-313.pyc create mode 100644 app/panel_izquierdo.py diff --git a/app/__pycache__/panel_izquierdo.cpython-313.pyc b/app/__pycache__/panel_izquierdo.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a2a58ac95c8873887469c945ba7f5dcf3a39a9e1 GIT binary patch literal 1580 zcmZ`3O=}xRboNVH$se+5B)h6iWnq^tq*6Z|ii0qugcLW#xS9wI7M-qF&vUf?=XGX!P8^zy*$qeh$^GAm5OY928iYmi5`3^BfH2h?BQyVvn3Ylf!= z1UT9-56}dBQtqjc^b>U-txfpn<~pjK^Dmg%f8z>Y8&ui)s;F5+fhJ0MPWHkxQeJ z7eYY922S9ld}-YrT5It#hEkuFP+h@hU0qOcDv!2JoLJrFN)frp z8e0)5-*dP4hToy5KZDUyg}UJiqw6*K)-5LYbSmqH?IgNXy6#Ob2cF~Etcc~d{s3!Mw0kCoxEvQ&sRBNdVCJ?U;RCCDER`zmR zoVTOvl}fkUE!!=7FAT~wsz6T(ZZns1p#zEFQc`@2QM(DJCK7jJmdQPfg4gej3@?%F z5-*4-bG$GRMg(a%jADe-&pCk^LC#2y=f2of5c2roAMrm#@7{pi++$Qm*=;WBbt(Fn!kvs4%Jk`ujfmZuz)y^-Oh?TVxmwpuonD7OSd(A#!%*GdXw zli4jQQcf6bdTxhNG43+2N!l!I+pf*2$T*?jX$3DFRK6n;A9Of}p+XvG$I^u!QGb)o zKyH==Br+QznEQ*6M;6I5DHcC1vYa%V!*<2gC3BEvMjQ}y{d+e5b^62{{U-e&eQXwv z%)-IQ!}ks)_x`zh_Q;$)nE%Cm^ITIpGD`>V{P6Li30&pReBpcRTkB+W@?>)Esj6jj zPm;;k(qCrICQxd6kaiZ5J~HRntMIU;#Qm&T30ZCcQzAs932BARjxYI9Lhf~Je_+WF zvgxsi`(8kUkP!BUY&1&+8DqZh zBehUMlJ9r{r;N=?_enrPgCmO%zn|hQX^@2vMqKR|y2RcFojmhs8qk@hD9U4WbVBkxWH09bwp*Z=?k delta 22 ccmX@+c+8RaGcPX}0}!n74o`ovk$0y808|7&-6`tkpQcEsHO5*Crl0~f?*%4h^@{fLOCACV)l%-gr94;9+m0)5`u4Ee2 zE;GAKY+a%R1uCNl*$o26y~LLSF3^L4UVP}GjxR=gC~3(hu~ymw?Ik@amJfk*>6;~& zlocf&NHeqZ-h4AVeBU>3x9jWO2+HraFD|Beg#JSw?Bb|&wx^-oky6oj`P$z z4(t%iV>G5M8-rPB>GRHa>Tn&{n0ACYiG|uFIiYq-bx`w*RFM0IKu3a}<+kb}Ya}+>x)-b7}_8zMvFvjk9sB|Sta!9nqNUY>M z&8jGldQkW4aGXEHsY7xbLMk=qvTagbobsZRjzOwCBBCxh6_pB6i zcf@pMw4|K5qUlEZe;$NP25XvOGRIGx956XOiRElsT@11&LtIQIt6`{fx`ItEE9?44 z8cvy9N;c%nvaT%mhB4N#C}+f^rYcE8#-t-=WRaM~6#U7CrjLk#$Sz&iKggIaa3HQ4 zHtQ-~leJ(>HjC4$5pF_4MkOO!d@P?!pbB-brKLOXv@K~!lu9N_UNtAqW^Hgf4J1Rztq@VYHTevca)mD zws<7`YzsLB_bRvLMGbAMzV9~qhPBZfqeWgU@ZvUd00LK^Z#eb9|A5VV&unm`n?C>d zTPzq}>dmmurw0zA-v>e+^h4SkYM~#tu+UGE2($}{3@aj^z_0%Lh&%xCX2*w0$LT0z z1JzoI8o7v&tRV#UJt9wKYB3jQB*$PS@>Mp@MuEAzOF7z4JN#&J7$VjgcS=q|3>D%v zTEE*HR;{ylD5AKdx8jh3Rb~!=)e-gma1O+Nox~jlgS{IO&74MvMWO^w7@(H4HVDYBLeSeqql%cd9D2{cWov;;XGlhHxBO=tO)VFBya z6S@H>rszZ`MZ4e@vIQU6s0=Kx91=bTqwVmo{~anqaxXi)DeS*J{oCog{&nHts;k5c zW%}M7U+3Q}bsqZi(w$4IkxjpNH*mjm-9Nf|w$vW@^5~tT_vrgQUmRU;AHL}l)0h|f@4Je}!i8hueE&qg>D*J#B*=-s$Oj61pvdrEKUujy zz#Sn%R7+p}YU#^d)i!9E$qf{zsvHIDA_7*E8M{i=-vJEX^IoiRGXN?Tt=k0vk5vp% zF3Dl36s$Nq0RDSpg5LmDQv}#q^|q{`+o+%vRrQjXIQ=R|XU<#NLqc~~sm%xcpS175 zch=t4(iOOX%O&cyd$l&&Q0v>himos_Fxfcs>YgoKVM0tK0eJwlJ9MQkvV3nm8V<$6 zVk|T^9Tul1#K>$+3}2j*Vp3H#dfhf-cDL!2I2DPBp?GXIF%|pcs!#y&DhjIVEV)6H}4p{;7x*j>g2PbCKC7>^Bmd zt!=Xm83fGfcvup959-0?Lt%^mVp(+Lltz*Pkh5L+$Z~sC4J)3wf;%GS4#ROz5z#8^ z=^g+gNSvHWFB4%6x~(+9bS86HCs~bhO-beq1$O}qjA~0u>9YD^ABf)+CFPvb(Z+X zoAKX_mOPDH4C@*yd79QDHzN6t>Bk>FPH%WFmOR4R?2XwCPv<64sF4Rl4|?-W;~So{ z-!=l$RvTGi`jhEjMM{i^EVaQ1n~W>(9(u|QfA@k%4b5vG-}t!b>nZqpK)qZ;7Ea$i z{hpF<8Yp@O3!XuuUap~+IwZU3Vg2#3Bj~Fmf$;!aUhC0{V@TE2-4VV&twPoz zG`XUO+8>U@S8o}renQR{QJhZ3HP TK5F=RPX~2s`wU05TS)&04xL2I literal 0 HcmV?d00001 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()