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"
.
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.
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 unapalabra clave
junto con tuapi_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 tuapi_key
y elsnapshot_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.
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