2026년 Pinterest 스크래핑 방법

빠르고 확장 가능한 결과를 위해 Python, 헤드리스 브라우저 및 자동화된 스크레이퍼 API를 사용하여 동적 Pinterest 데이터를 추출하는 방법을 알아보세요.
5 분 읽기
How to Scrape Pinterest blog image

Pinterest에서 데이터를 추출하는 것은 대부분의 HTML 스크래핑 작업과 다릅니다. Pinterest는 모든 콘텐츠를 동적으로 생성하며 JSON과 같은 데이터 구조를 페이지에 남기지 않습니다.

이 작업을 따라가기로 결정한다면, 다음 방법을 사용하여 Pinterest 데이터를 수집하는 방법을 배우게 될 것입니다:

  • Playwright를 사용한 Pinterest 데이터 추출
  • Bright Data의 Pinterest 스크레이퍼 API로 Pinterest 데이터 추출하기

추출 가능한 데이터는?

브라우저에서 Pinterest를 살펴보면, 모든 핀은 data-test-id="pinWrapper" 속성을 가진 div 요소 안에 깊게 중첩되어 있습니다.

Inspect Pin

페이지에서 이러한 객체들을 모두 찾아낼 수 있다면 다음과 같은 모든 데이터를 추출할 수 있습니다:

  • 각 핀의 제목.
  • 핀으로 직접 연결되는 URL.
  • 검색 결과에서 핀의 이미지.

Playwright로 Pinterest 스크래핑하기

시작하기

Python에는 훌륭한 스크래핑 라이브러리가 많으며, 우리는 Playwright를 사용할 것입니다. 먼저 Playwright가 설치되어 있는지 확인해야 합니다. 문서는 여기에서 확인할 수 있습니다. Playwright는 사용 가능한 최고의 헤드리스 브라우저 중 하나입니다.

Playwright 설치

pip install playwright

Playwright 브라우저 설치

playwright install

실제 핀 스크래핑

이제 Pinterest에서 실제 핀을 스크래핑하는 방법을 살펴보겠습니다. 아래 코드에서는 scrape_pins()main()이라는 두 개의 함수를 생성합니다. scrape_pins() 는 브라우저를 열고 Pinterest에서 데이터를 추출합니다. main() 은 비동기 런타임의 진입점으로 사용됩니다.

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:
            #페이지에서 핀 찾기
            pins = await page.query_selector_all("div[data-test-id='pinWrapper']")

            #핀 반복 처리 및 데이터 추출
            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")

                추출된_데이터 = {
                    "title": title,
                    "url": pin_url,
                    "img": img_src
                }
                #결과에 데이터를 추가
                스크랩된_데이터.append(추출된_데이터)
        except:
            print(f"{search_url} 핀 스크랩 실패")
        finally:
            await browser.close()
    #모든 작업 완료, 스크랩된 데이터 반환
    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"결과 저장 실패: {e}")

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

scrape_pins() 는 스크래핑 과정에서 다음 단계를 수행합니다:

  • URL 생성: search_url.
  • 결과를 저장할 배열을 생성합니다: scraped_data.
  • 새 브라우저 인스턴스 열기.
  • 헤드리스 모드로 실행하기 위해 사용자 정의 user_agent 설정. 이 없으면 Pinterest에서 차단됩니다.
  • asyncio.sleep(2)로 콘텐츠 로딩을 2초간 대기합니다.
  • 다음 선택자를 사용하여 페이지에서 보이는 모든 핀을 찾습니다: div[data-test-id='pinWrapper'].
  • 각 핀에 대해 다음 데이터를 추출합니다:
    • title: 핀의 제목.
    • url: 핀으로 직접 연결되는 URL.
    • img: 검색 결과에 표시되는 핀의 이미지.

위 Playwright 스크레이퍼의 샘플 데이터는 다음과 같습니다.

[
    {
        "title": "화이트, 그레이, 천연 목재 액센트의 차분한 색감으로 평온하고 널찍한 느낌을 연출한 미니멀리스트 오피스3",
        "url": "/pin/10203536650743650/",
        "img": "https://i.pinimg.com/236x/b3/21/e2/b321e2485da40c0dde2685c3a4fdcb56.jpg"
    },
    {
        "title": "두 개의 책상과 외부로 통하는 열린 문이 있는 홈 오피스",
        "url": "/pin/261912534574291013/",
        "img": "https://i.pinimg.com/236x/56/f1/29/56f129512885e1b3c9971b16f9445c9a.jpg"
    },
    {
        "title": "홈 오피스 인테리어, 블랙 홈 오피스, 다크 홈 오피스, 무드 있는 홈 오피스, 소형 홈 오피스",
        "url": "/pin/60094976273327121/",
        "img": "https://i.pinimg.com/236x/ba/75/c9/ba75c9be7e635cce3ee80acdf70d6f9f.jpg"
    },
    {
        "title": "책상, 의자, 책장이 중앙에 배치된 사무실",
        "url": "/pin/599682506666665720/",
        "img": "https://i.pinimg.com/236x/57/66/1d/57661dc80bebda3dfe946c070ee8ed13.jpg"
    },
    {
        "title": "녹색 벽과 선반 위 식물, 컴퓨터 책상이 있는 홈 오피스",
        "url": "/pin/1147080967585091410/",
        "img": "https://i.pinimg.com/236x/ce/e8/b7/cee8b74151b29605a80e0f61898c249d.jpg"
    },

Bright Data 스크레이퍼 API로 Pinterest 스크래핑하기

Bright Data의 Pinterest 스크레이퍼 API를 사용하면 이 과정을 완전히 자동화할 수 있으며, 헤드리스 브라우저나 셀렉터 등 다른 문제에 대해 걱정할 필요가 없습니다!

Bright Data Pinterest Scraper

Python Requests가 설치되어 있는지 확인하세요.

Requests 설치

pip install requests

API 호출을 설정한 후 Python에서 트리거할 수 있습니다. 아래에는 get_pins()poll_and_retrieve_snapshot()이라는 두 가지 함수도 있습니다.

  • get_pins(): 이 함수는 api_key와 함께 키워드를 인수로 받습니다. 그런 다음 스크레이퍼 API에 요청을 생성하여 전송합니다. 이 요청은 원하는 키워드에 대한 Pinterest 스크레이핑을 트리거합니다.
  • poll_and_retrieve_snapshot()은 api_key와 snapshot_id를 받습니다. 이후 10초마다 스냅샷 준비 상태를 확인합니다. 스냅샷이 준비되면 데이터를 다운로드하고 함수를 종료합니다.
import requests
import json
import time

#스크래핑을 트리거하는 함수
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},
    ]
    #스크래핑 실행
    response = requests.post(url, headers=headers, params=params, json=data)
    #snapshot_id 반환
    return response.json()["snapshot_id"]

def poll_and_retrieve_snapshot(api_key, snapshot_id, output_file="snapshot-data.json"):
    # 스냅샷 URL 생성
    snapshot_url = f"https://api.brightdata.com/datasets/v3/snapshot/{snapshot_id}?format=json"
    headers = {
        "Authorization": f"Bearer {api_key}"
    }

    print(f"ID: {snapshot_id}에 대한 스냅샷 폴링 중...")

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

        if response.status_code == 200:
            print("스냅샷 준비 완료. 다운로드 중...")
            snapshot_data = response.json()
            # 새 json 파일에 스냅샷 기록
            with open(output_file, "w", encoding="utf-8") as file:
                json.dump(snapshot_data, file, indent=4)
            print(f"스냅샷을 {output_file}에 저장했습니다")
            break
        elif response.status_code == 202:
            print("스냅샷이 아직 준비되지 않았습니다. 10초 후에 재시도 중...")
        else:
            print(f"오류: {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)

다운로드한 파일의 샘플 데이터입니다. 트리거 요청에 "include_errors": "true"가 포함되어 있어 오류가 있는 핀도 파일에 포함되었습니다. 아래 샘플 데이터에는 오류 핀 2개와 정상 데이터 핀 2개가 포함되어 있습니다.

[
    {
        "post_type": null,
        "timestamp": "2026-02-17T15:26:17.248Z",
        "input": {
            "url": "https://www.pinterest.com/pin/jh46IGe2",
            "discovery_input": {
                "keyword": "office"
            }
        },
        "warning": "Bad input. 잘못된 ID입니다!",
        "warning_code": "dead_page",
        "discovery_input": {
            "keyword": "office"
        }
    },
    {
        "post_type": null,
        "timestamp": "2026-02-17T15:26:18.757Z",
        "input": {
            "url": "https://www.pinterest.com/pin/4471026676503806548",
            "discovery_input": {
                "keyword": "office"
            }
        },
        "warning": "잘못된 입력. 페이지가 존재하지 않습니다.",
        "warning_code": "dead_page",
        "discovery_input": {
            "keyword": "office"
        }
    },
    {
        "url": "https://www.pinterest.com/pin/929782285570058239",
        "post_id": "929782285570058239",
        "title": "기능적인 소규모 사무실 공간 설계에 필수적인 팁: 효율성 극대화",
        "content": "생산적인 소규모 사무실 공간 설계를 위한 17가지 스마트 팁",
        "date_posted": "2026-02-06T15:00:47.000Z",
        "user_name": "wellnesswink",
        "user_url": "https://www.pinterest.com/wellnesswink",
        "user_id": "929782422978147260",
        "팔로워": 232,
        "좋아요": 0,
        "카테고리": [
            "탐색",
            "홈 데코"
        ],
        "첨부파일": [
            "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": "2026-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가지 모던하고 남성적인 홈 오피스 디자인 아이디어",
        "content": "스타일과 기능성을 조화시킨 25가지 세련된 홈 오피스 인테리어 아이디어를 살펴보세요. 마음에 드는 작업 공간을 만들고 손쉽게 생산성을 높이세요!",
        "date_posted": "2026-01-27T07:11:38.000Z",
        "user_name": "artfullhouses",
        "user_url": "https://www.pinterest.com/artfullhouses",
        "user_id": "889812976285233957",
        "팔로워": 10,
        "좋아요": 0,
        "카테고리": [
            "탐색",
            "홈 데코"
        ],
        "첨부파일": [
            "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": [
            "남성용 책상 장식",
            "세련된 홈 오피스 장식",
            "남성용 책상",
            "남성을 위한 홈 오피스 아이디어",
            "남성을 위한 오피스 아이디어",
            "남성적인 홈 오피스 아이디어",
            "남성적인 홈 오피스",
            "남성적인 홈",
            "세련된 홈 오피스"
        ],
        "post_type": "image",
        "comments_num": 0,
        "discovery_input": {
            "keyword": "office"
        },
        "timestamp": "2026-02-17T15:26:20.069Z",
        "input": {
            "url": "https://www.pinterest.com/pin/889812838892568569",
            "discovery_input": {
                "keyword": "office"
            }
        }
    },

보시다시피, Scraper API는 Playwright로 구축한 초기 스크레이퍼보다 훨씬 더 많은 데이터를 수집합니다. 당사 API는 Pinterest에서 지정된 키워드를 크롤링한 후 크롤링 과정에서 발견된 모든 개별 핀을 스크레이핑합니다.

편리함만이 이 접근법의 유일한 장점은 아닙니다. 저희 Pinterest 스크레이퍼 API는 극히 낮은 비용으로 데이터를 추출합니다. 총 결과 파일은 거의 45,000줄에 달했지만 생성 비용은 단 0.97달러에 불과했습니다.

Pinterest Scrape Cost

동일한 품질의 스크레이퍼를 개발하도록 누군가를 고용한다면 수백 달러의 비용이 들 것이며, 데이터를 받기까지 며칠을 기다려야 할 것입니다. 저희 스크레이퍼 API를 사용하면 훨씬 적은 비용으로 단 몇 분 안에 데이터를 얻을 수 있습니다.

결론

핀터레스트에서 데이터를 추출하는 것이 반드시 어렵지만은 않습니다. Playwright를 사용해 직접 스크레이퍼를 구축하든, 저희 핀터레스트 스크레이퍼와 같은 완전 자동화 솔루션을 선택하든, 올바른 접근 방식은 여러분의 필요에 따라 달라집니다.

빠르고 안정적이며 확장 가능한 Pinterest 데이터 추출을 위해 Bright Data의 스크레이퍼 API는 헤드리스 브라우저, 프록시, CAPTCHA 처리의 번거로움을 없애고 구조화된 데이터를 손쉽게 제공합니다.

더 빠른 결과 – 몇 시간이 아닌 몇 분 안에 데이터 확보
비용 효율적 – 추출한 데이터만큼만 지불
유지보수 불필요 – 차단된 요청 처리 부담 해소

지금 무료 체험을 시작하고 Bright Data의 웹 스크레이퍼 API로 Pinterest 스크래핑을 간소화하세요!