> For the complete documentation index, see [llms.txt](https://developers.oxylabs.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://developers.oxylabs.io/integrations/es/web-unblocker-integrations/scrapy.md).

# Scrapy

Sigue una guía paso a paso en Python para integrar Oxylabs Web Unblocker con Scrapy

Integrar [Scrapy](https://www.scrapy.org/) con [Oxylabs Web Unblocker](https://oxylabs.io/products/web-unblocker) para mejorar el acceso web, manejar CAPTCHAs y ejecutar el renderizado de JavaScript automáticamente. Esta guía cubre Request Metadata y Custom Downloader Middleware.

{% stepper %}
{% step %}

### Elige el método de integración

Scrapy admite dos métodos para enrutar el tráfico a través de Web Unblocker: Request Meta Parameter (configuración por solicitud) y Custom Downloader Middleware (configuración para todo el proyecto).

#### **Método 1: Parámetro meta de la solicitud**

Pasa los datos de autenticación de Web Unblocker directamente a instancias individuales `scrapy.Request` usando el `meta` diccionario. También puedes proporcionar encabezados personalizados de funciones de Web Unblocker dentro de los `headers` de la solicitud.

```python
import scrapy

class UnblockerSpider(scrapy.Spider):
    name = "unblocker_spider"

    def start_requests(self):
        url = "https://sandbox.oxylabs.io/products"
        proxy_uri = "http://YOUR_USERNAME:YOUR_PASSWORD@unblock.oxylabs.io:60000"
        
        # Encabezados personalizados opcionales de Web Unblocker
        headers = {
            "x-oxylabs-render": "html",           # Habilita el renderizado de JavaScript
            "X-Oxylabs-Geo-Location": "Germany",  # Establece la segmentación geográfica
        }

        yield scrapy.Request(
            url=url,
            callback=self.parse,
            headers=headers,
            meta={"proxy": proxy_uri}
        )

    def parse(self, response):
        for product in response.css(".product-card"):
            yield {
                "title": product.css(".title::text").get(),
                "price": product.css(".price-wrapper::text").get(),
            }
```

#### **Método 2: Middleware personalizado de descarga (recomendado)**

Para enrutar todas las solicitudes del spider a través de Web Unblocker globalmente sin modificar los métodos de solicitud individuales, implementa un Custom Scrapy Downloader Middleware.

Abre el archivo `middlewares.py` archivo y añade el `OxylabsWebUnblockerMiddleware` clase:

```python
class OxylabsWebUnblockerMiddleware:
    @classmethod
    def from_crawler(cls, crawler):
        return cls(crawler.settings)

    def __init__(self, settings):
        self.username = settings.get("OXYLABS_UNBLOCKER_USER")
        self.password = settings.get("OXYLABS_UNBLOCKER_PASS")
        self.endpoint = settings.get("OXYLABS_UNBLOCKER_ENDPOINT", "unblock.oxylabs.io:60000")

    def process_request(self, request, spider):
        proxy_uri = f"http://{self.username}:{self.password}@{self.endpoint}"
        request.meta["proxy"] = proxy_uri
```

Luego registra el middleware y especifica tus credenciales en `settings.py`:

```python
# Configuración de Web Unblocker
OXYLABS_UNBLOCKER_USER = "YOUR_USERNAME"
OXYLABS_UNBLOCKER_PASS = "YOUR_PASSWORD"
OXYLABS_UNBLOCKER_ENDPOINT = "unblock.oxylabs.io:60000"

# Enable Downloader Middleware
DOWNLOADER_MIDDLEWARES = {
    "myproject.middlewares.OxylabsWebUnblockerMiddleware": 100,
    "scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware": 110,
}
```

{% endstep %}

{% step %}

### Introduce las credenciales y los encabezados personalizados

Web Unblocker usa un único punto de entrada centralizado para todas las solicitudes:

**Host:** `unblock.oxylabs.io`

**Puerto:** `60000`

**Nombre de usuario:** `YOUR_USERNAME`

**Contraseña:** `YOUR_PASSWORD`

Web Unblocker usa IA para generar automáticamente huellas del navegador y encabezados de solicitud óptimos. Por ello, evita pasar encabezados estándar del navegador (como cadenas personalizadas de `User-Agent` ) a menos que sea necesario. Para controlar el comportamiento de Web Unblocker, pasa los siguientes encabezados personalizados en tus solicitudes:

<table><thead><tr><th width="219">Encabezado personalizado</th><th>Descripción</th><th width="141">Valor de ejemplo</th></tr></thead><tbody><tr><td><code>x-oxylabs-render</code></td><td>Fuerza el renderizado con Headless Browser para sitios dinámicos con mucho JavaScript. Más información <a href="/products/es/web-unblocker/custom-browser-instructions.md">aquí</a>.</td><td><code>html</code></td></tr><tr><td><code>X-Oxylabs-Geo-Location</code></td><td>Establece la segmentación geográfica (admite nombres de países, estados o códigos ZIP). Más información <a href="/products/es/web-unblocker/making-requests/geo-location.md">aquí</a>.</td><td><code>Estados Unidos</code></td></tr><tr><td><code>X-Oxylabs-Session-Id</code></td><td>Reutiliza la misma dirección IP y sesión entre solicitudes secuenciales. Más información <a href="/products/es/web-unblocker/making-requests/session.md">aquí</a>.</td><td><code>session_abc123</code></td></tr><tr><td><code>x-oxylabs-force-headers</code></td><td>Fuerza a Web Unblocker a pasar tus encabezados personalizados de solicitud al destino.</td><td><code>1</code></td></tr><tr><td><code>x-oxylabs-force-cookies</code></td><td>Fuerza a Web Unblocker a conservar y enviar cookies personalizadas al sitio de destino.</td><td><code>1</code></td></tr></tbody></table>
{% endstep %}

{% step %}

### Configurar tiempos de espera de respuesta

Al habilitar el renderizado de JavaScript (`x-oxylabs-render: html`), Web Unblocker usa una instancia interna de Headless Browser para ejecutar los scripts de la página y esperar a que se carguen los elementos dinámicos del DOM.

Como el renderizado del navegador tarda más que las solicitudes HTTP GET estándar, ajusta el tiempo de espera de descarga de Scrapy en `settings.py` para evitar que se descarten solicitudes:

```python
DOWNLOAD_TIMEOUT = 180
```

{% endstep %}

{% step %}

### Ejecuta la araña

Ejecuta tu spider de Scrapy desde la línea de comandos:

```bash
scrapy crawl unblocker_spider
```

Web Unblocker procesará la solicitud a través de su infraestructura proxy de IA, gestionará la huella del navegador y los reintentos, y devolverá la carga útil final de la página HTML directamente a tu método parse de Scrapy.
{% endstep %}
{% endstepper %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://developers.oxylabs.io/integrations/es/web-unblocker-integrations/scrapy.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
