Si bien algunos sitios web son fáciles de rastrear con solo Selenium, Puppeteer y similares, otros sitios web que implementan medidas de seguridad avanzadas, como CAPTCHA y prohibiciones de IP, pueden resultar difíciles. Para superar estos desafíos y garantizar que puede rastrear el 99 % de los sitios web de forma gratuita con Scraper, lo desarrollará en este artículo e integrará un
Sin embargo, la recopilación de datos es solo un paso; lo que haga con ellos es igualmente importante, si no más. A menudo, esto requiere una minuciosa selección manual de grandes volúmenes de información. Pero ¿qué sucedería si pudiera automatizar este proceso? Al aprovechar un modelo de lenguaje (LLM), no solo puede recopilar datos, sino también consultarlos para extraer información significativa, lo que le permitirá ahorrar tiempo y esfuerzo.
En esta guía, aprenderá a combinar el web scraping con la IA para crear una herramienta poderosa para recopilar y analizar datos a gran escala de forma gratuita. ¡Vamos a profundizar!
Antes de comenzar, asegúrese de tener lo siguiente:
Para continuar con este tutorial, complete los siguientes pasos:
Siga estos pasos para configurar su entorno y prepararse para construir el raspador impulsado por IA.
En primer lugar, configure un entorno virtual para administrar las dependencias de su proyecto. Esto garantizará que tenga un espacio aislado para todos los paquetes necesarios.
Crear un nuevo directorio de proyecto:
Abra su terminal (o Símbolo del sistema/PowerShell en Windows) y cree un nuevo directorio para su proyecto:
mkdir ai-website-scraper cd ai-website-scraper
Crear el entorno virtual:
Ejecute el siguiente comando para crear el entorno virtual:
En Windows:
python -m venv venv
En macOS/Linux:
python3 -m venv venv
Esto crea una carpeta venv
que almacenará el entorno virtual.
Activa el entorno virtual para comenzar a trabajar dentro de él:
En Windows:
.\venv\Scripts\activate
En macOS/Linux:
source venv/bin/activate
El indicador de tu terminal cambiará para mostrar ( venv
), lo que confirma que ahora estás dentro del entorno virtual.
Ahora, instala las bibliotecas que necesita tu proyecto. Crea un archivo requirements.txt
en el directorio de tu proyecto y agrega las siguientes dependencias:
streamlit selenium Beautifulsoup4 langchain langchain-ollama lxml html5lib
Estos paquetes son esenciales para el raspado, el procesamiento de datos y la creación de la interfaz de usuario:
streamlit : se utiliza para crear la interfaz de usuario interactiva.
Selenium : para extraer contenido del sitio web.
beautifulsoup4 : Para analizar y limpiar el HTML.
langchain y langchain-ollama : esto es para integrar con Ollama LLM y procesar texto.
lxml y html5lib : para análisis HTML avanzado.
Instale las dependencias ejecutando el siguiente comando:
(Asegúrese de estar en la carpeta donde se encuentra el archivo antes de ejecutar el comando).
pip install -r requirements.txt
Cree un archivo llamado ui.py en el directorio de su proyecto. Este script definirá la interfaz de usuario de su scraper. Use el código a continuación para estructurar su aplicación:
import streamlit as st import pathlib from main import scrape_website # function to load css from the assets folder def load_css(file_path): with open(file_path) as f: st.html(f"<style>{f.read()}</style>") # Load the external CSS css_path = pathlib.Path("assets/style.css") if css_path.exists(): load_css(css_path) st.title("AI Scraper") st.markdown( "Enter a website URL to scrape, clean the text content, and display the result in smaller chunks." ) url = st.text_input(label= "", placeholder="Enter the URL of the website you want to scrape") if st.button("Scrape", key="scrape_button"): st.write("scraping the website...") result = scrape_website(url) st.write("Scraping complete.") st.write(result)
Puede obtener más información sobre los componentes Streamlit en su
Para darle estilo a su aplicación, cree una carpeta de recursos en el directorio de su proyecto y agregue un archivo style.css. Personalice la interfaz de Streamlit con CSS:
.stAppViewContainer { background-image: url("https://images.unsplash.com/photo-1732979887702-40baea1c1ff6?q=80&w=2832&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"); background-size: cover; color: black; } .stAppHeader { background-color: rgba(0, 0, 0, 0); } .st-ae { background-color: rgba(233, 235, 234, 0.895); } .st-emotion-cache-ysk9xe { color: black; } .st.info, .stAlert { background-color: black; } .st-key-scrape_button button { display: inline-block; padding: 10px 20px; font-size: 16px; color: #fff; background-color: #007bff; border: none; border-radius: 5px; cursor: pointer; animation: pulse 2s infinite; } .st-key-scrape_button button:hover { background-color: #0056b3; color: #fff; }
En el directorio de su proyecto, ejecute el siguiente comando:
streamlit run ui.py
Esto iniciará un servidor local y debería ver una URL en la terminal, generalmente http://localhost:8501
. Abra esta URL en su navegador para interactuar con la aplicación web.
A continuación, escribe el código para extraer el contenido HTML de cualquier página web mediante Selenium. Sin embargo, para que el código funcione, necesitas un Chrome WebDriver.
Selenium requiere un WebDriver para interactuar con las páginas web. A continuación, se explica cómo configurarlo:
Después de descargar ChromeDriver, extraiga el archivo y copie el nombre del archivo de la aplicación “ chromedriver ” y péguelo en la carpeta de su proyecto.
Una vez hecho esto, cree un nuevo archivo llamado main.py
e implemente el código a continuación:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.service import Service from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # Function to scrape HTML from a website def scrape_website(website_url): # Path to WebDriver webdriver_path = "./chromedriver" # Replace with your WebDriver path service = Service(webdriver_path) driver = webdriver.Chrome(service=service) try: # Open the website driver.get(website_url) # Wait for the page to fully load WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, "body"))) # Extract the HTML source html_content = driver.page_source return html_content finally: # Ensure the browser is closed after scraping driver.quit()
Guarde y ejecute el código; debería obtener todo el HTML de la página que extrajo y mostrarlo en su aplicación Streamlit de la siguiente manera:
Si bien ahora puede recuperar el HTML de un sitio web, es posible que el código anterior no funcione en sitios con mecanismos avanzados contra el scraping, como desafíos CAPTCHA o prohibiciones de IP. Por ejemplo, el scraping de un sitio como Indeed o Amazon con Selenium puede provocar que una página CAPTCHA bloquee el acceso. Esto sucede porque el sitio web detecta que un bot está intentando acceder a su contenido. Si este comportamiento persiste, el sitio puede eventualmente bloquear su dirección IP, impidiendo el acceso futuro.
Para solucionar esto, integre
Registrarse — ir a
Después de iniciar sesión, haga clic en “ Obtener productos proxy ”.
Haga clic en el botón “ Agregar ” y seleccione “ Scraping Browser ”.
A continuación, accederá a la página “ Agregar zona ”, donde deberá elegir un nombre para la nueva zona proxy del navegador para el rastreo de datos. Después, haga clic en “ Agregar ”.
Después de esto, se crearán las credenciales de tu zona proxy. Necesitarás estos detalles en tu script para evitar cualquier mecanismo anti-scraping utilizado en cualquier sitio web.
También puede consultar la documentación para desarrolladores de Bright Data para obtener más detalles sobre el navegador de raspado.
En el archivo main.py
, cambia el código por este. Notarás que este código es más claro y más corto que el código anterior.
from selenium.webdriver import Remote, ChromeOptions from selenium.webdriver.chromium.remote_connection import ChromiumRemoteConnection from selenium.webdriver.common.by import By from bs4 import BeautifulSoup AUTH = '<username>:<passord>' SBR_WEBDRIVER = f'https://{AUTH}@brd.superproxy.io:9515' # Function to scrape HTML from a website def scrape_website(website_url): print("Connecting to Scraping Browser...") sbr_connection = ChromiumRemoteConnection(SBR_WEBDRIVER, "goog", "chrome") with Remote(sbr_connection, options=ChromeOptions()) as driver: driver.get(website_url) print("Waiting captcha to solve...") solve_res = driver.execute( "executeCdpCommand", { "cmd": "Captcha.waitForSolve", "params": {"detectTimeout": 10000}, }, ) print("Captcha solve status:", solve_res["value"]["status"]) print("Navigated! Scraping page content...") html = driver.page_source return html
Reemplace <nombre de usuario> y <contraseña> con el nombre de usuario y la contraseña de su navegador de raspado.
Después de extraer el contenido HTML de un sitio web, este suele estar repleto de elementos innecesarios, como JavaScript, estilos CSS o etiquetas no deseadas que no contribuyen a la información principal que se está extrayendo. Para que los datos estén más estructurados y sean útiles para su posterior procesamiento, es necesario limpiar el contenido DOM eliminando los elementos irrelevantes y organizando el texto.
En esta sección se explica cómo limpiar el contenido HTML, extraer texto significativo y dividirlo en fragmentos más pequeños para su posterior procesamiento. El proceso de limpieza es esencial para preparar los datos para tareas como el procesamiento del lenguaje natural o el análisis de contenido.
Aquí está el código que se agregará a main.py para manejar la limpieza del contenido del DOM:
from bs4 import BeautifulSoup # Extract the body content from the HTML def extract_body_content(html_content): soup = BeautifulSoup(html_content, "html.parser") body_content = soup.body if body_content: return str(body_content) return "" # Clean the body content by removing scripts, styles, and other unwanted elements def clean_body_content(body_content): soup = BeautifulSoup(body_content, "html.parser") # Remove <script> and <style> tags for script_or_style in soup(["script", "style"]): script_or_style.extract() # Extract cleaned text with each line separated by a newline cleaned_content = soup.get_text(separator="\n") cleaned_content = "\n".join( line.strip() for line in cleaned_content.splitlines() if line.strip() ) return cleaned_content # Split the cleaned content into smaller chunks for processing def split_dom_content(dom_content, max_length=5000): return [ dom_content[i : i + max_length] for i in range(0, len(dom_content), max_length) ]
Qué hace el Código
Guarde los cambios y pruebe la aplicación. Debería obtener un resultado como este después de extraer datos de un sitio web.
Una vez que el contenido DOM está limpio y preparado, el siguiente paso es analizar la información para extraer detalles específicos utilizando
Si aún no lo has hecho, descarga e instala Ollama desde
brew install ollama
A continuación, instale cualquier modelo de
ollama pull phi3
Después de la instalación, puede llamar a ese modelo desde su script usando LangChain para proporcionar información significativa a partir de los datos que se le enviarán.
Aquí se explica cómo configurar la funcionalidad para analizar el contenido del DOM en el modelo phi3
El siguiente código implementa la lógica para analizar fragmentos DOM con Ollama y extraer detalles relevantes:
from langchain_ollama import OllamaLLM from langchain_core.prompts import ChatPromptTemplate # Template to instruct Ollama for parsing template = ( "You are tasked with extracting specific information from the following text content: {dom_content}. " "Please follow these instructions carefully: \n\n" "1. **Extract Information:** Only extract the information that directly matches the provided description: {parse_description}. " "2. **No Extra Content:** Do not include any additional text, comments, or explanations in your response. " "3. **Empty Response:** If no information matches the description, return an empty string ('')." "4. **Direct Data Only:** Your output should contain only the data that is explicitly requested, with no other text." ) # Initialize the Ollama model model = OllamaLLM(model="phi3") # Function to parse DOM chunks with Ollama def parse_with_ollama(dom_chunks, parse_description): prompt = ChatPromptTemplate.from_template(template) chain = prompt | model parsed_results = [] for i, chunk in enumerate(dom_chunks, start=1): if not chunk.strip(): # Skip empty chunks print(f"Skipping empty chunk at batch {i}") continue try: print(f"Processing chunk {i}: {chunk[:100]}...") # Print a preview print(f"Parse description: {parse_description}") response = chain.invoke( { "dom_content": chunk, "parse_description": parse_description, } ) print(f"Response for batch {i}: {response}") parsed_results.append(response) except Exception as e: print(f"Error parsing chunk {i}: {repr(e)}") parsed_results.append(f"Error: {repr(e)}") return "\n".join(parsed_results)
Agregue el siguiente código al archivo ui.py para permitir que los usuarios ingresen instrucciones de análisis al LLM y vean los resultados:
from main import scrape_website, extract_body_content, clean_body_content, split_dom_content from llm import parse_with_ollama if "dom_content" in st.session_state: parse_description = st.text_area("Enter a description to extract specific insights from your scraped data:") if st.button("Parse Content", key="parse_button"): if parse_description.strip() and st.session_state.get("dom_content"): st.info("Parsing the content...") dom_chunks = split_dom_content(st.session_state.dom_content) parsed_result = parse_with_ollama(dom_chunks, parse_description) st.text_area("Parsed Results", parsed_result, height=300) else: st.error("Please provide valid DOM content and a description to parse.")
Una vez hecho esto, el raspador ahora puede proporcionar respuestas a sus indicaciones en función de los datos extraídos.
La combinación de web scraping e IA abre posibilidades interesantes para obtener información basada en datos. Además de recopilar y guardar datos, ahora puede aprovechar la IA para optimizar el proceso de obtención de información a partir de los datos extraídos. Esto es útil para equipos de marketing y ventas, análisis de datos, propietarios de empresas y mucho más.
Puedes encontrar el código completo del AI scraper aquí. Experimenta con él y adáptalo a tus necesidades particulares. Las contribuciones también son bienvenidas. Si tienes ideas para mejorar, ¡considera crear una solicitud de incorporación de cambios!
También puedes llevar esto más allá. Aquí tienes algunas ideas: