80 lines
2.7 KiB
Python
80 lines
2.7 KiB
Python
from tkinter import messagebox
|
|
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")
|
|
messagebox.showinfo("Scraping", "Extracción de enlaces completada.")
|
|
else:
|
|
messagebox.showerror("ERROR", 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.")
|
|
|
|
|
|
def iniciar_scraping_y_insercion(url, text_widget):
|
|
cola_enlaces = Queue()
|
|
# Configurar los hilos como daemon
|
|
hilo_scraping = threading.Thread(target=extraer_enlaces, args=(url, cola_enlaces, text_widget), daemon=True)
|
|
hilo_insercion = threading.Thread(target=insertar_enlaces_mysql, args=(cola_enlaces,), daemon=True)
|
|
hilo_scraping.start()
|
|
hilo_insercion.start()
|
|
hilo_scraping.join()
|
|
cola_enlaces.put("FIN")
|
|
hilo_insercion.join() |