Python을 사용하여 Pinterest 데이터를 스크랩하는 방법

댓글: 0

이 글에서는 강력한 자동화 라이브러리인 Python과 Playwright를 사용해 Pinterest를 스크랩하는 방법을 살펴봅니다. 풍부한 시각적 콘텐츠로 유명한 Pinterest는 데이터 분석이나 자동화 이니셔티브를 위한 비옥한 토양 역할을 합니다. 특히 검색 결과에서 이미지 URL을 추출하는 것은 연구나 상업적 벤처에 매우 중요할 수 있습니다.

Playwright는 여러 브라우저에서 대화형 세션을 자동화할 수 있도록 지원합니다. 네트워크 요청 차단과 같은 기능을 통해 트래픽에서 직접 데이터를 추출할 수 있습니다. 또한 노렌더링 모드에서 작동하는 기능으로 스크래핑 효율성과 확장성이 향상됩니다. 프록시 사용은 선택 사항이지만 익명성을 보장하고 잠재적인 차단을 우회하기 위해 권장되며, 이를 통해 Playwright는 Pinterest에서 시각적 콘텐츠를 수집하는 데 선호되는 도구로 확고히 자리 잡았습니다.

Python용 Playwright 설정

시작하기 전에 파이썬 환경에 Playwright를 설치해야 합니다. pip를 사용하여 설치할 수 있습니다:


pip install playwright

설치가 완료되면 브라우저 바이너리를 설치해야 합니다:


playwright install

이제 Pinterest 이미지 URL을 스크랩하는 기본 스크립트를 살펴보겠습니다.

Pinterest에서 데이터를 추출하는 과정

아래에 전체 버전이 나와 있는 스크립트에는 다음 요소가 포함되어 있습니다:

주요 기능

기본 함수는 사용자 입력(예: https://in.pinterest.com/search/pins/?q=halloween%20decor)을 기반으로 Pinterest 검색 쿼리 URL을 생성한 다음 이를 capture_images_from_pinterest 함수에 전달합니다.

차단 및 필터링

Playwright 페이지는 page.on('response', ...)을 사용하여 네트워크 응답을 수신합니다.

handle_response 함수는 네트워크 응답을 필터링하여 리소스 유형 이미지와 URL이 .jpg로 끝나는 응답만 캡처하도록 합니다.

데이터를 CSV로 저장

이미지 URL을 수집한 후, 스크랩한 데이터를 쉽게 내보내고 분석할 수 있도록 pinterest_images.csv라는 CSV 파일에 저장합니다.

코드 완성

다음은 Pinterest 검색 결과를 스크랩하고 모든 이미지 URL을 추출하는 Python 코드입니다:


import asyncio
from playwright.async_api import async_playwright

async def capture_images_from_pinterest(url):
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=True)
        page = await browser.new_page()

        # 끝이 '.jpg'인 이미지 URL 저장
        image_urls = []

        # 네트워크 응답을 가로채서 처리하는 기능
        page.on('response', lambda response: handle_response(response, image_urls))

        # URL로 이동합니다.
        await page.goto(url)

        # 네트워크 활동이 안정될 때까지 기다립니다(필요한 경우 조정).
        await page.wait_for_timeout(10000)

        # 브라우저를 닫습니다.
        await browser.close()

        return image_urls

# .jpg 이미지 URL을 확인하는 핸들러 함수
def handle_response(response, image_urls):
    if response.request.resource_type == 'image':
        url = response.url
        if url.endswith('.jpg'):
            image_urls.append(url)

# 비동기 작업을 실행하는 주요 기능
async def main(query):
    url = f"https://in.pinterest.com/search/pins/?q={query}"
    images = await capture_images_from_pinterest(url)
    
    # 이미지를 CSV 파일로 저장
    with open('pinterest_images.csv', 'w') as file:
        for img_url in images:
            file.write(f"{img_url}\n")

    print(f"Saved {len(images)} image URLs to pinterest_images.csv")

# 비동기 메인 함수 실행
query = 'halloween decor'
asyncio.run(main(query))

Playwright에서 프록시 설정하기

Pinterest를 스크랩하면 동일한 IP 주소에서 너무 많은 요청을 할 경우 속도 제한 또는 차단이 트리거될 수 있습니다. 프록시는 요청을 다른 IP 주소로 라우팅하여 여러 사용자가 Pinterest를 탐색하는 것처럼 보이게 함으로써 이러한 문제를 완화합니다.

프록시를 사용하는 이유:

  • IP 차단을 피하세요: 비정상적인 활동이 감지되면 Pinterest에서 일시적으로 IP 주소를 차단할 수 있습니다. 프록시는 IP 주소를 순환하여 이를 방지하는 데 도움이 됩니다.
  • 확장성: 프록시를 사용하면 스크래핑 작업의 규모를 확장할 수 있어 차단 위험을 최소화할 수 있습니다.
  • 요청 한도를 늘립니다: 프록시를 사용하면 속도 제한을 트리거하지 않고 더 많은 데이터를 스크랩할 수 있습니다.

실행 메서드에서 프록시 인수를 사용하여 Playwright로 프록시를 쉽게 설정할 수 있습니다. 이 예제에서는 "http://your-proxy-address:port"를 프록시 서버의 주소, 포트 번호, 프록시 자격 증명으로 대체합니다.


async def capture_images_from_pinterest(url):
    async with async_playwright() as p:
        # 여기에서 프록시 추가
        browser = await p.chromium.launch(headless=True, proxy={"server": "http://your-proxy-address:port", "username": "username", "password": "password"})
        page = await browser.new_page()

따라서 Playwright와 프록시를 통합하면 스크래핑 자동화의 효율성이 향상됩니다. 이러한 조합은 봇 방지 메커니즘으로 인한 위험을 완화할 뿐만 아니라 데이터 수집 프로세스의 전반적인 효율성을 높여줍니다.

Pinterest 데이터 스크래핑의 과제

Playwright를 사용하여 Pinterest 데이터를 스크랩할 때 사용자가 직면할 수 있는 몇 가지 문제가 있습니다:

  • 동적 콘텐츠 로딩: Pinterest는 무한 스크롤과 지연 로딩 이미지 등 동적 콘텐츠 로딩 기술을 사용합니다. 따라서 비동기 데이터 로딩을 효과적으로 처리할 수 있는 스크래핑 도구가 필요합니다.
  • 스크래핑 방지 조치: Pinterest와 같은 웹사이트는 자동화된 데이터 추출 작업을 방해하기 위해 속도 제한과 같은 다양한 스크래핑 방지 메커니즘을 사용합니다.

프록시와 헤드리스 모드에서 Playwright를 활용하면 이러한 문제를 효과적으로 완화하여 블록 위험을 줄이고 데이터 추출 효율성을 높일 수 있습니다.

댓글:

0 댓글