Puppeteer에서 CSS 선택자로 요소를 찾는 방법?

CSS 선택자는 웹 스크래핑 시 HTML 페이지를 파싱하는 가장 효율적인 방법 중 하나입니다. Node.js와 Puppeteer에서는 page.$page.$$ 메서드를 통해 CSS 선택자를 사용할 수 있습니다. 이 메서드들은 익숙한 CSS 구문을 사용하여 페이지의 요소와 상호작용할 수 있게 합니다.

아래는 이러한 메서드를 활용해 페이지에서 요소를 찾는 방법을 보여주는 예제 코드와 각 단계를 이해하는 데 도움이 되는 상세한 주석입니다.

      const puppeteer = require('puppeteer');

async function run() {
    // 새 브라우저 인스턴스 실행
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    
    // 대상 웹페이지로 이동
    await page.goto("https://httpbin.dev/html", { waitUntil: 'domcontentloaded' });

    // 첫 번째 일치하는 요소 가져오기
    const firstParagraph = await page.$("p");
    console.log("첫 번째 단락 요소 발견:", firstParagraph);

    // 일치하는 모든 요소 가져오기
    const allParagraphs = await page.$$("p");
    console.log("총 발견된 단락 수:", allParagraphs.length);

    // 첫 번째 단락의 텍스트 콘텐츠 추출 및 기록
    const firstParagraphText = await page.$eval("p", element => element.innerText);
    console.log("첫 번째 단락의 텍스트:", firstParagraphText);

    // 첫 번째 앵커 태그의 href 속성 추출 및 기록
    const firstAnchorHref = await page.$eval("a", element => element.href);
    console.log("첫 번째 앵커 태그의 href:", firstAnchorHref);

    // 총 단락 요소 수 계산
    const paragraphCount = await page.$$eval("p", elements => elements.length);
    console.log("총 단락 요소 수:", paragraphCount);

    // 첫 번째 단락의 내부 텍스트 수정
    await page.$eval("p", element => element.innerText = "첫 번째 단락의 새 텍스트");
    console.log("첫 번째 단락의 텍스트를 수정했습니다.");

    // 브라우저 닫기
    await browser.close();
}

// 함수 실행
run();
    

이 예시에서는 다음 작업을 수행합니다:

  1. 새 브라우저 인스턴스 실행: Puppeteer로 제어되는 새 브라우저를 시작합니다.
  2. 대상 웹페이지로 이동: goto 메서드는 지정된 URL로 이동하여 페이지의 DOM 콘텐츠가 완전히 로드될 때까지 대기합니다.
  3. 첫 번째 일치 요소 가져오기: page.$ 메서드는 CSS 선택자 p와 일치하는 첫 번째 요소를 가져옵니다.
  4. 모든 일치하는 요소 가져오기: page.$$ 메서드는 CSS 선택자 p에 일치하는 모든 요소를 가져옵니다.
  5. 첫 번째 단락의 텍스트 콘텐츠 추출 및 기록: page.$eval 메서드는 첫 번째 일치 요소의 컨텍스트에서 함수를 평가하고 innerText를 반환합니다.
  6. 첫 번째 앵커 태그의 href 속성 추출 및 기록: page.$eval 메서드는 첫 번째 a 태그의 href 속성을 가져옵니다.
  7. 단락 요소 총 개수 계산: page.$$eval 메서드는 일치하는 모든 요소의 컨텍스트에서 함수를 평가하고 총 개수를 반환합니다.
  8. 첫 번째 단락의 내부 텍스트 수정: page.$eval 메서드는 첫 번째 일치하는 p 요소의 innerText를 변경합니다.
  9. 브라우저를 닫습니다: 스크립트 완료 후 브라우저 인스턴스가 올바르게 종료되도록 보장합니다.

참고:

특히 동적 콘텐츠가 있는 페이지의 경우 요소를 찾기 전에 페이지가 완전히 로드될 때까지 기다리는 것이 중요합니다. 자세한 내용은 Puppeteer에서 페이지 로드 대기 방법?을 참조하세요.

요소를 찾는 추가 방법으로는 Puppeteer에서 XPath로 요소 찾는 방법?도 참고할 수 있습니다.

결론

Puppeteer에서 CSS 선택자를 사용하면 웹 스크래핑 및 자동화 작업을 간편하고 효율적으로 수행할 수 있습니다. 이러한 방법을 이해하고 활용함으로써 웹 페이지 요소와 효과적으로 상호작용하고 가치 있는 데이터를 추출할 수 있습니다.

시작할 준비가 되셨나요?