Cómo raspar Pinterest en 2025

Aprende a extraer datos dinámicos de Pinterest utilizando Python, navegadores sin cabeza y APIs de scraper automatizadas para obtener resultados rápidos y escalables.
10 min de lectura
How to Scrape Pinterest blog image

La extracción de datos de Pinterest es diferente de la mayoría de los trabajos de scraping HTML. Pinterest genera todo su contenido de forma dinámica y no deja ninguna de sus estructuras de datos, como JSON, en la página.

Si decides seguirnos, aprenderás a recopilar datos de Pinterest utilizando los siguientes métodos:

  • Extraer datos de Pinterest con Playwright
  • Extraer datos de Pinterest con la API Scraper de Bright Data

¿Qué se puede extraer?

Si miras Pinterest en tu navegador, todos los pines están profundamente anidados dentro de un elemento div con data-test-id="pinWrapper".

Inspeccionar pasador

Si podemos encontrar todos estos objetos en la página, podemos extraer todos sus datos, tales como:

  • El título de cada pin.
  • La url que apunta directamente al pin.
  • La imagen del pin de los resultados de búsqueda.

Raspando Pinterest con Playwright

Primeros pasos

Hay un montón de grandes bibliotecas de scraping en Python, y vamos a utilizar Playwright. Primero, necesitas asegurarte de que tienes Playwright instalado. Puedes ver su documentación aquí. Playwright es uno de los mejores navegadores headless disponibles.

Instalar dramaturgo

pip install playwright

Instalar los navegadores de Playwright

playwright install

Raspado de las chinchetas reales

Ahora vamos a ver cómo extraer los pines de Pinterest. En el código siguiente, creamos dos funciones, scrape_pins() y main(). scrape_pins() abre un navegador y extrae datos de Pinterest. main() se utiliza como punto de entrada para el tiempo de ejecución asíncrono.

import asyncio
from playwright.async_api import async_playwright
import json

user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36"


async def scrape_pins(query):
    search_url = f"https://www.pinterest.com/search/pins/?q={query}&rs=typed"
    scraped_data = []

    async with async_playwright() as p:
        browser = await p.chromium.launch()
        page = await browser.new_page(user_agent=user_agent)
        response = await page.goto(search_url)
        await asyncio.sleep(2)
        try:
            #find the pins on the page
            pins = await page.query_selector_all("div[data-test-id='pinWrapper']")

            #iterate through the pins and extract data
            for pin in pins:
                title_link = await pin.query_selector("a")
                pin_url = await title_link.get_attribute("href")
                title = await title_link.get_attribute("aria-label")
                img = await title_link.query_selector("img")
                img_src = await img.get_attribute("src")

                extracted_data = {
                    "title": title,
                    "url": pin_url,
                    "img": img_src
                }
                #add the data to our results
                scraped_data.append(extracted_data)
        except:
            print(f"Failed to scrape pins at {search_url}")
        finally:
            await browser.close()
    #everything has finished, return our scraped data
    return scraped_data

async def main():
    search_query = "office"
    office_results = await scrape_pins(search_query)

    with open(f"{search_query}-results.json", "w") as file:
        try:
            json.dump(office_results, file, indent=4)
        except Exception as e:
            print(f"Failed to save results: {e}")

if __name__ == "__main__":
    asyncio.run(main())

scrape_pins() realiza los siguientes pasos durante nuestro scrape:

  • Crear nuestra url: search_url.
  • Crea un array para guardar nuestros resultados, scraped_data.
  • Abra una nueva instancia del navegador.
  • Establece un user_agent personalizado para funcionar en modo headless. Sin él, Pinterest nos bloqueará.
  • Esperamos dos segundos a que se cargue el contenido con asyncio.sleep(2).
  • Encontramos todos los pines visibles en la página utilizando este selector: div[data-test-id='pinWrapper'].
  • Para cada pin, extraemos los siguientes datos:
    • título: El título del pin.
    • url: La url que lleva directamente al pin.
    • img: La imagen del pin que se muestra en los resultados de búsqueda.

He aquí algunos datos de muestra del scraper Playwright anterior.

[
    {
        "title": "A minimalist office featuring a soothing color palette of whites, greys, and natural wood accents, creating a calm and spacious feel3",
        "url": "/pin/10203536650743650/",
        "img": "https://i.pinimg.com/236x/b3/21/e2/b321e2485da40c0dde2685c3a4fdcb56.jpg"
    },
    {
        "title": "a home office with two desks and an open door that leads to the outside",
        "url": "/pin/261912534574291013/",
        "img": "https://i.pinimg.com/236x/56/f1/29/56f129512885e1b3c9971b16f9445c9a.jpg"
    },
    {
        "title": "home office decor, blakc home office, dark home office, moody home office, small home office",
        "url": "/pin/60094976273327121/",
        "img": "https://i.pinimg.com/236x/ba/75/c9/ba75c9be7e635cce3ee80acdf70d6f9f.jpg"
    },
    {
        "title": "an office with a desk, chair and bookshelf in the middle of it",
        "url": "/pin/599682506666665720/",
        "img": "https://i.pinimg.com/236x/57/66/1d/57661dc80bebda3dfe946c070ee8ed13.jpg"
    },
    {
        "title": "a home office with green walls and plants on the shelves, along with a computer desk",
        "url": "/pin/1147080967585091410/",
        "img": "https://i.pinimg.com/236x/ce/e8/b7/cee8b74151b29605a80e0f61898c249d.jpg"
    },

Raspado de Pinterest con la API de Bright Data Scraper

Con nuestra API Pinterest Scraper, puedes automatizar completamente este proceso y no tienes que preocuparte de navegadores sin cabeza, selectores ni nada por el estilo.

Bright Data Pinterest Scraper

Asegúrate de tener instalado Python Requests.

Solicitudes de instalación

pip install requests

Una vez configurada la llamada a la API, puedes lanzarla desde Python. A continuación, también tenemos dos funciones: get_pins() y poll_and_retrieve_snapshot().

  • get_pins(): Esta función toma una palabra clave junto con tu api_key. A continuación, crea y envía una solicitud a nuestra API de scraper. Esta solicitud desencadena una búsqueda en Pinterest de la palabra clave deseada.
  • poll_and_retrieve_snapshot() toma tu api_key y el snapshot_id. Después comprueba cada 10 segundos si la instantánea está lista. Una vez que la instantánea está lista, se descargan los datos y salimos de la función.
import requests
import json
import time

#function to trigger the scrape
def get_pins(api_key, keyword):
    url = "https://api.brightdata.com/datasets/v3/trigger"
    headers = {
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json",
    }
    params = {
        "dataset_id": "gd_lk0sjs4d21kdr7cnlv",
        "include_errors": "true",
        "type": "discover_new",
        "discover_by": "keyword",
    }
    data = [
        {"keyword":keyword},
    ]
    #trigger the scrape
    response = requests.post(url, headers=headers, params=params, json=data)
    #return the snapshot_id
    return response.json()["snapshot_id"]

def poll_and_retrieve_snapshot(api_key, snapshot_id, output_file="snapshot-data.json"):
    #create the snapshot url
    snapshot_url = f"https://api.brightdata.com/datasets/v3/snapshot/{snapshot_id}?format=json"
    headers = {
        "Authorization": f"Bearer {api_key}"
    }

    print(f"Polling snapshot for ID: {snapshot_id}...")

    while True:
        response = requests.get(snapshot_url, headers=headers)

        if response.status_code == 200:
            print("Snapshot is ready. Downloading...")
            snapshot_data = response.json()
            #write the snapshot to a new json file
            with open(output_file, "w", encoding="utf-8") as file:
                json.dump(snapshot_data, file, indent=4)
            print(f"Snapshot saved to {output_file}")
            break
        elif response.status_code == 202:
            print("Snapshot is not ready yet. Retrying in 10 seconds...")
        else:
            print(f"Error: {response.status_code}")
            print(response.text)
            break

        time.sleep(10)


if __name__ == "__main__":

    API_KEY = "YOUR-BRIGHT-DATA-API-KEY"
    KEYWORD = "office"
    
    snapshot_id = get_pins(API_KEY, KEYWORD)
    poll_and_retrieve_snapshot(API_KEY, snapshot_id)

He aquí algunos datos de muestra del archivo descargado. Dado que nuestra solicitud de activación tenía "include_errors "true", el archivo también incluía pines con errores. Los datos de muestra a continuación incluyen dos pines de error, así como dos pines con datos buenos.

[
    {
        "post_type": null,
        "timestamp": "2025-02-17T15:26:17.248Z",
        "input": {
            "url": "https://www.pinterest.com/pin/jh46IGe2",
            "discovery_input": {
                "keyword": "office"
            }
        },
        "warning": "Bad input. Wrong id!",
        "warning_code": "dead_page",
        "discovery_input": {
            "keyword": "office"
        }
    },
    {
        "post_type": null,
        "timestamp": "2025-02-17T15:26:18.757Z",
        "input": {
            "url": "https://www.pinterest.com/pin/4471026676503806548",
            "discovery_input": {
                "keyword": "office"
            }
        },
        "warning": "Bad input. Page does not exist.",
        "warning_code": "dead_page",
        "discovery_input": {
            "keyword": "office"
        }
    },
    {
        "url": "https://www.pinterest.com/pin/929782285570058239",
        "post_id": "929782285570058239",
        "title": "Essential Tips for Designing a Functional Small Office Space: Maximize Efficiency",
        "content": "17 Smart Tips for Designing a Productive Small Office Space",
        "date_posted": "2025-02-06T15:00:47.000Z",
        "user_name": "wellnesswink",
        "user_url": "https://www.pinterest.com/wellnesswink",
        "user_id": "929782422978147260",
        "followers": 232,
        "likes": 0,
        "categories": [
            "Explore",
            "Home Decor"
        ],
        "attached_files": [
            "https://i.pinimg.com/originals/c8/c0/d5/c8c0d5fb45352e40535db4510049a142.jpg"
        ],
        "image_video_url": "https://i.pinimg.com/originals/c8/c0/d5/c8c0d5fb45352e40535db4510049a142.jpg",
        "video_length": 0,
        "post_type": "image",
        "comments_num": 0,
        "discovery_input": {
            "keyword": "office"
        },
        "timestamp": "2025-02-17T15:26:19.502Z",
        "input": {
            "url": "https://www.pinterest.com/pin/929782285570058239",
            "discovery_input": {
                "keyword": "office"
            }
        }
    },
    {
        "url": "https://www.pinterest.com/pin/889812838892568569",
        "post_id": "889812838892568569",
        "title": "20 Modern Masculine Home Office Design Ideas for Men",
        "content": "Explore 25 chic home office decor ideas that blend style and functionality. Create a workspace you love and boost your productivity effortlessly!",
        "date_posted": "2025-01-27T07:11:38.000Z",
        "user_name": "artfullhouses",
        "user_url": "https://www.pinterest.com/artfullhouses",
        "user_id": "889812976285233957",
        "followers": 10,
        "likes": 0,
        "categories": [
            "Explore",
            "Home Decor"
        ],
        "attached_files": [
            "https://i.pinimg.com/originals/f1/cb/f7/f1cbf7b127db2bef2306ba19ffcc0646.png"
        ],
        "image_video_url": "https://i.pinimg.com/originals/f1/cb/f7/f1cbf7b127db2bef2306ba19ffcc0646.png",
        "video_length": 0,
        "hashtags": [
            "Mens Desk Decor",
            "Chic Home Office Decor",
            "Mens Desk",
            "Home Office Ideas For Men",
            "Office Ideas For Men",
            "Masculine Home Office Ideas",
            "Masculine Home Office",
            "Masculine Home",
            "Chic Home Office"
        ],
        "post_type": "image",
        "comments_num": 0,
        "discovery_input": {
            "keyword": "office"
        },
        "timestamp": "2025-02-17T15:26:20.069Z",
        "input": {
            "url": "https://www.pinterest.com/pin/889812838892568569",
            "discovery_input": {
                "keyword": "office"
            }
        }
    },

Como puedes ver, la API de raspado recopila muchos más datos que el raspado inicial que creamos con Playwright. Nuestra API rastrea Pinterest en busca de tu palabra clave y luego rastrea todos los pines individuales que encuentra durante el rastreo.

La comodidad no es la única ventaja de este enfoque. Nuestra API Pinterest Scraper extrae sus datos a un coste extremadamente bajo. Nuestro archivo total de resultados tenía casi 45.000 líneas y solo costó 0,97 dólares generarlo.

Coste de Pinterest Scrape

Contratar a alguien para crear un scraper de la misma calidad probablemente le costaría varios cientos de dólares y tendría que esperar días para obtener sus datos. Con nuestra API Scraper, obtendrá sus datos en cuestión de minutos a una fracción del coste.

Conclusión

Extraer datos de Pinterest no tiene por qué ser difícil. Tanto si construyes tu propio scraper con Playwright como si optas por una solución totalmente automatizada como nuestro Pinterest Scraper, el enfoque adecuado depende de tus necesidades.

Para una extracción de datos de Pinterest rápida, fiable y escalable, la API Scraper de Bright Data elimina la molestia de manejar navegadores sin cabecera, proxies y CAPTCHAs -entregando datos estructurados sin esfuerzo.

Resultados más rápidos – Obtenga datos en minutos, no en horas.
Rentabilidad – Pague sólo por lo que extraiga
✅ S in mantenimiento – Evite tener que lidiar con solicitudes bloqueadas

Inicie su prueba gratuita hoy mismo y agilice su raspado de Pinterest con la API Web Scraper de Bright Data.

No se requiere tarjeta de crédito