# LangChain

El **LangChain** integración con el [**Oxylabs Web Scraper API**](https://oxylabs.io/products/scraper-api/web) te permite recopilar y procesar datos web a través de un LLM (Large Language Model) en el mismo flujo de trabajo.

## Descripción general

**LangChain** es un framework para construir aplicaciones que usan LLMs junto con herramientas, APIs y datos web. Admite tanto Python como JavaScript. Úsalo con [**Oxylabs Web Scraper API** ](http://developers.oxylabs.io/scraper-apis/web-scraper-api?_gl=1*1ljhay3*_gcl_aw*R0NMLjE3NDYxODM0ODcuQ2owS0NRancydEhBQmhDaUFSSXNBTlp6RFdvSXlSNVg3blQtd0ZEakxHOUlvdUhyQmtoRTRCeUNwc054dFJVMmh0Z3dZTTR3Nm90SjVKOGFBbHhhRUFMd193Y0I.*_gcl_au*MjU4NDEzMTkwLjE3NDExNzU2MzI.)para:

* Extraer datos estructurados sin manejar CAPTCHAs, bloqueos de IP o renderizado JS
* Procesar resultados con un LLM en la misma canalización
* Construir flujos de trabajo de extremo a extremo desde la extracción hasta la salida potenciada por IA

## Comenzando

**Crea tus credenciales de usuario de API**: regístrate para una prueba gratuita o compra el producto en el [**panel de Oxylabs**](https://dashboard.oxylabs.io/en/registration) para crear tus credenciales de usuario API (`USERNAME` y `PASSWORD`).

{% hint style="warning" %}
Si necesitas más de un usuario de API para tu cuenta, por favor contacta con nuestro [**soporte al cliente**](mailto:support@oxylabs.io) o envía un mensaje a nuestro chat en vivo 24/7.
{% endhint %}

En esta guía usaremos el lenguaje de programación Python. Instala las bibliotecas requeridas usando pip:

```bash
pip install -qU langchain-oxylabs langchain-openai langgraph requests python-dotenv
```

## Configuración del entorno

Crea un `.env` archivo en el directorio de tu proyecto con tu usuario de API de Oxylabs y las credenciales de OpenAI:

```
OXYLABS_USERNAME=tu-usuario
OXYLABS_PASSWORD=tu-contraseña
OPENAI_API_KEY=your-openai-key
```

Carga estas variables de entorno en tu script de Python:

```python
import os
from dotenv import load_dotenv

load_dotenv()
```

## Métodos de integración

Hay dos maneras principales de integrar Oxylabs Web Scraper API con LangChain:

### Usando el paquete langchain-oxylabs

Para consultas de búsqueda en Google, usa el [`langchain-oxylabs`](https://python.langchain.com/docs/integrations/tools/oxylabs/) paquete, que proporciona una integración lista para usar:

```python
import os
from dotenv import load_dotenv
from langchain.chat_models import init_chat_model
from langgraph.prebuilt import create_react_agent
from langchain_oxylabs import OxylabsSearchAPIWrapper, OxylabsSearchRun

load_dotenv()

# Inicializa tu modelo LLM preferido
llm = init_chat_model(
    "gpt-4o-mini",
    model_provider="openai",
    api_key=os.getenv("OPENAI_API_KEY")
)

# Inicializa la herramienta de búsqueda de Google
search = OxylabsSearchRun(
    wrapper=OxylabsSearchAPIWrapper(
        oxylabs_username=os.getenv("OXYLABS_USERNAME"),
        oxylabs_password=os.getenv("OXYLABS_PASSWORD")
    )
)

# Crea un agente que use la herramienta de búsqueda de Google
agent = create_react_agent(llm, [search])

# Ejemplo de uso
user_input = "When and why did the Maya civilization collapse?"
response = agent.invoke({"messages": user_input})
print(response["messages"][-1].content)
```

### Usando la Web Scraper API&#x20;

Para acceder a otros sitios web más allá de la búsqueda de Google, puedes enviar directamente solicitudes a la Web Scraper API:

```python
import os
import requests
from dotenv import load_dotenv
from langchain_openai import OpenAI
from langchain_core.prompts import PromptTemplate

load_dotenv()

def scrape_website(url):
    """Raspa el sitio web usando Oxylabs Web Scraper API"""
    payload = {
        "source": "universal",
        "url": url,
        "parse": True
    }
    response = requests.post(
        "https://realtime.oxylabs.io/v1/queries",
        auth=(os.getenv("OXYLABS_USERNAME"), os.getenv("OXYLABS_PASSWORD")),
        json=payload
    )
    
    if response.status_code == 200:
        data = response.json()
        content = data["results"][0]["content"]
        return str(content)
    else:
        print(f"Failed to scrape website: {response.text}")
        return None

def process_content(content):
    """Procesa el contenido raspado usando LangChain"""
    if not content:
        print("No hay contenido para procesar.")
        return None
        
    prompt = PromptTemplate.from_template(
        "Analiza el siguiente contenido del sitio web y resume los puntos clave: {content}"
    )
    chain = prompt | OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
    result = chain.invoke({"content": content})
    return result

def main(url):
    print("Raspando el sitio web...")
    scraped_content = scrape_website(url)
    if scraped_content:
        print("Procesando el contenido raspado con LangChain...")
        analysis = process_content(scraped_content)
        print("\nAnálisis procesado:\n", analysis)
    else:
        print("No se raspó contenido.")

if __name__ == "__main__":
    url = "https://sandbox.oxylabs.io/products/1"
    main(url)
```

## Raspadores específicos por objetivo

Oxylabs proporciona [**raspadores especializados**](https://developers.oxylabs.io/documentation/es/soluciones-de-scraping/web-scraper-api/targets) para varios sitios web populares. Aquí hay algunos ejemplos de fuentes disponibles:

| Sitio web | Parámetro de fuente | Parámetros requeridos         |
| --------- | ------------------- | ----------------------------- |
| Google    | `google_search`     | `query`                       |
| Amazon    | `amazon_search`     | `query`, `dominio` (opcional) |
| Walmart   | `walmart_search`    | `query`                       |
| Target    | `target_search`     | `query`                       |
| Kroger    | `kroger_search`     | `query`, `store_id`           |
| Staples   | `staples_search`    | `query`                       |

Para usar un raspador específico, modifica el payload en la `scrape_website` función:

```python
# Ejemplo para búsqueda en Amazon
payload = {
    "source": "amazon_search",
    "query": "smartphone",
    "domain": "com",
    "parse": True
}
```

## Configuración avanzada

### Manejo de contenido dinámico

La Web Scraper API puede manejar [**renderizado de JavaScript**](https://developers.oxylabs.io/documentation/es/soluciones-de-scraping/web-scraper-api/features/js-rendering-and-browser-control/javascript-rendering) al agregar el `render` parámetro:

```python
payload = {
    "source": "universal",
    "url": url,
    "parse": True,
    "render": "html"
}
```

### Configurando el tipo de User-Agent

Puedes especificar diferentes [**agentes de usuario**](https://developers.oxylabs.io/documentation/es/soluciones-de-scraping/web-scraper-api/features/http-context-and-job-management/user-agent-type) para simular diferentes dispositivos:

```python
payload = {
    "source": "universal",
    "url": url,
    "parse": True,
    "render": "html",
    "user_agent_type": "mobile"
}
```

### Uso de parámetros específicos del objetivo

Muchos [**raspadores específicos por objetivo**](https://developers.oxylabs.io/documentation/es/soluciones-de-scraping/web-scraper-api/targets) soportan parámetros adicionales:

```python
# Ejemplo para Kroger con parámetros de ubicación
payload = {
    "source": "kroger_search",
    "query": "organic milk",
    "store_id": "01100002",
    "fulfillment_type": "pickup"
}
```

## Manejo de errores

Implementa un manejo de errores adecuado para aplicaciones en producción:

```python
try:
    response = requests.post(
        "https://realtime.oxylabs.io/v1/queries",
        auth=(os.getenv("OXYLABS_USERNAME"), os.getenv("OXYLABS_PASSWORD")),
        json=payload,
        timeout=60
    )
    response.raise_for_status()
    # Procesar respuesta
except requests.exceptions.HTTPError as http_err:
    print(f"HTTP error occurred: {http_err}")
except requests.exceptions.ConnectionError as conn_err:
    print(f"Connection error occurred: {conn_err}")
except requests.exceptions.Timeout as timeout_err:
    print(f"Timeout error occurred: {timeout_err}")
except requests.exceptions.RequestException as req_err:
    print(f"An error occurred: {req_err}")
```
