paint-brush
동적 웹 스크래핑 마스터하기~에 의해@brightdata
501 판독값
501 판독값

동적 웹 스크래핑 마스터하기

~에 의해 Bright Data10m2024/07/01
Read on Terminal Reader

너무 오래; 읽다

최근 웹 세미나에서 웹 자동화 전문가 Dario Kondratiuk, Diego Molina 및 Greg Gorlen은 이러한 환경을 탐색하기 위한 전문가 팁을 공유했습니다. 웹 스크래핑에 강력한 선택기를 사용하면 유지 관리를 최소화하고 스크립트 오류를 줄일 수 있습니다. DOM을 스크랩하는 대신 API 호출을 타겟팅함으로써 개발자는 JSON 형식의 구조화된 데이터에 직접 액세스할 수 있습니다.
featured image - 동적 웹 스크래핑 마스터하기
Bright Data HackerNoon profile picture
0-item
1-item
2-item
3-item
4-item
5-item

웹 개발에서 동적 웹사이트를 스크래핑하는 것은 예술이자 과학이 되었습니다. Puppeteer, Playwright 및 Selenium과 같은 도구를 사용하면 개발자는 원하는 대로 강력한 옵션을 사용할 수 있습니다. 그러나 큰 힘에는 큰 복잡성이 따릅니다. 최근 웹 세미나에서 스크래핑 베테랑인 Dario Kondratiuk, Diego Molina 및 Greg Gorlen은 이러한 환경을 탐색하기 위한 전문가 팁을 공유했습니다. SPA(단일 페이지 애플리케이션)를 처리하든 봇 방지 조치를 피하든 상관없이 스크래핑 게임의 수준을 높이는 방법은 다음과 같습니다.

신뢰할 수 있는 선택기 선택

웨비나 동안 Dario Kondratiuk는 웹 스크래핑에서 강력한 선택기를 사용하는 것의 중요성을 강조했습니다. 깨지기 쉽고 깊게 중첩된 선택기는 종종 유지 관리 문제로 이어집니다. 대신 Dario는 변경에 더 탄력적인 ARIA 라벨과 텍스트 기반 선택기를 사용할 것을 권장했습니다.


예를 들어 :

 javascriptCopy code// Using Playwright for ARIA and text selectors await page.locator('text="Login"').click(); await page.locator('[aria-label="Submit"]').click();


이 접근 방식을 사용하면 기본 HTML이 변경되더라도 스크립트는 계속 작동합니다. Dario가 지적했듯이 "신뢰할 수 있는 선택기는 유지 관리를 최소화하고 스크립트 오류를 줄입니다."


API 가로채기 수용

웨비나에서 Greg Gorlen은 보다 효율적인 데이터 추출을 위한 API 가로채기의 힘을 강조했습니다. DOM을 스크랩하는 대신 API 호출을 타겟팅함으로써 개발자는 동적으로 로드된 콘텐츠의 복잡성을 우회하여 JSON 형식의 구조화된 데이터에 직접 액세스할 수 있습니다.


왜 API를 가로채나요?

  • 속도 : 일반적으로 JSON 데이터에 액세스하는 것이 HTML을 구문 분석하는 것보다 빠릅니다.

  • 신뢰성 : JSON 구조는 DOM에 비해 변경될 가능성이 적습니다.


Greg는 Playwright를 사용하여 API 응답을 가로채는 예를 공유했습니다.


 javascriptCopy code// Using Playwright to intercept API responses await page.route('**/api/data', route => { route.continue(response => { const data = response.json(); console.log(data); // Process or save the data }); });


이 예에서 스크립트는 특정 API 엔드포인트에 대한 호출을 가로채 개발자가 정리되고 구조화된 데이터로 직접 작업할 수 있도록 합니다.


실용적인 팁 : 항상 브라우저 개발자 도구의 네트워크 탭을 확인하세요. 필요한 데이터를 반환하는 API 호출을 찾으세요. 가능한 경우 이 방법을 사용하면 스크래핑 프로세스를 크게 단순화할 수 있습니다.


“API를 가로채면 데이터 추출 속도가 빨라질 뿐만 아니라 안정성도 향상됩니다. JSON 엔드포인트를 찾으세요. 훨씬 더 사용하기 쉬운 형식으로 원하는 데이터가 포함되어 있는 경우가 많습니다."



지연 로딩 처리

웹 성능을 최적화하기 위한 일반적인 기술인 지연 로딩은 스크래핑 작업을 복잡하게 만들 수 있습니다. 콘텐츠는 사용자가 스크롤이나 클릭 등 페이지와 상호 작용할 때만 로드됩니다. 웨비나 동안 Dario Kondratiuk는 이 문제를 해결하기 위한 효과적인 전략을 제공했습니다.


주요 접근법 :

  1. 시뮬레이션된 스크롤링 : 사용자 스크롤을 시뮬레이션하면 추가 콘텐츠 로드가 트리거될 수 있습니다. 이는 사용자가 아래로 스크롤할 때 콘텐츠가 나타나는 사이트에 매우 중요합니다.


     javascriptCopy code// Simulate scrolling with Playwright await page.evaluate(async () => { await new Promise(resolve => { let totalHeight = 0; const distance = 100; const timer = setInterval(() => { window.scrollBy(0, distance); totalHeight += distance; if (totalHeight >= document.body.scrollHeight) { clearInterval(timer); resolve(); } }, 100); // Adjust delay as necessary }); });


    작동 이유 : 이 방법은 자연스러운 사용자 동작을 모방하여 지연 로드된 모든 콘텐츠를 렌더링할 수 있습니다. 스크롤 거리와 지연을 조정하면 로딩 속도와 완전성을 제어하는 데 도움이 됩니다.


  2. 요청 차단 : API 호출을 차단하면 콘텐츠의 시각적 렌더링에 의존하지 않고 데이터에 직접 액세스할 수 있습니다. 이 접근 방식은 데이터 추출의 속도와 신뢰성을 크게 향상시킬 수 있습니다.


     javascriptCopy code// Intercepting API requests in Playwright await page.route('**/api/data', route => { route.continue(response => { const data = response.json(); console.log(data); // Process data as needed }); });


    장점 :

    • 속도 : 여러 페이지를 로드할 필요 없이 데이터를 직접 검색합니다.
    • 효율성 : 전체 페이지를 시각적으로 렌더링할 필요 없이 모든 관련 데이터를 캡처합니다.


  3. 요소 가시성 검사 : Dario는 필수 콘텐츠가 로드되었는지 확인하기 위해 특정 요소의 가시성을 검증할 것을 제안했습니다. 이는 스크롤링과 결합되어 포괄적인 스크래핑 전략을 제공할 수 있습니다.

     javascriptCopy code// Wait for specific elements to load await page.waitForSelector('.item-loaded', { timeout: 5000 });


이러한 기술이 중요한 이유 : 지연 로딩은 사용자 상호작용이 있을 때까지 데이터를 숨겨서 스크래핑을 어렵게 만들 수 있습니다. 상호 작용을 시뮬레이션하고 요청을 가로채는 방식을 통해 개발자는 필요한 모든 콘텐츠를 스크래핑에 사용할 수 있는지 확인할 수 있습니다.


Dario는 "데이터를 덩어리로 캡처하면 무한 스크롤을 관리하는 데 도움이 될 뿐만 아니라 콘텐츠가 누락되는 일이 없도록 보장합니다."라고 강조했습니다. 이러한 방법을 적용함으로써 개발자는 가장 역동적인 웹사이트에서도 효과적으로 데이터를 수집할 수 있습니다.


지연 로딩을 위한 사용자 상호 작용 시뮬레이션


Shadow DOM 내의 데이터에 액세스

Shadow DOM 구성 요소는 웹 사이트의 일부를 캡슐화하여 데이터 추출을 더욱 복잡하게 만듭니다. 웨비나 동안 Dario Kondratiuk는 Shadow DOM 요소 내에서 스크래핑을 위한 효과적인 기술을 공유했습니다.


접근법 :

  1. 내장 도구 활용 : Playwright 및 Puppeteer와 같은 도구를 사용하면 개발자는 Shadow DOM을 뚫고 숨겨진 요소에 액세스할 수 있습니다.


     javascriptCopy code// Accessing elements within Shadow DOM using Playwright const shadowHost = await page.locator('#shadow-host'); const shadowRoot = await shadowHost.evaluateHandle(node => node.shadowRoot); const shadowElement = await shadowRoot.$('css-selector-within-shadow');


  2. 개방형 및 폐쇄형 Shadow DOM 처리 :

    • Open Shadow DOM : JavaScript를 통해 쉽게 액세스할 수 있어 간단한 데이터 추출이 가능합니다.
    • 폐쇄형 Shadow DOM : 직접 액세스를 제한하므로 더욱 까다롭습니다. 해결 방법에는 특정 브라우저 도구 또는 JavaScript 삽입 사용이 포함될 수 있습니다.


중요한 이유 : Shadow DOM의 구조를 이해하는 것이 중요합니다. Dario가 언급했듯이 "Shadow DOM을 iframe처럼 처리하고 iframe 문서에서와 마찬가지로 Shadow 루트를 탐색합니다."


개발자는 이러한 기술을 활용하여 캡슐화된 요소에서 데이터를 효과적으로 추출하여 포괄적인 스크래핑을 보장할 수 있습니다.


전체 페이지 스크린샷 캡처

동적 콘텐츠의 스크린샷을 캡처하는 것은 까다로울 수 있으며, 특히 콘텐츠가 단일 뷰포트에 맞지 않는 경우 더욱 그렇습니다. Diego Molina는 정확한 전체 페이지 스크린샷을 찍는 전략을 공유했습니다.


기술 :

  1. 브라우저 기능 사용 :

    • Firefox : 전체 페이지 스크린샷 지원 기능이 내장되어 있어 전체 페이지를 간단하게 캡처할 수 있습니다.
     javascriptCopy code// Full-page screenshot in Playwright with Firefox await page.screenshot({ path: 'fullpage.png', fullPage: true });


  2. Chrome DevTools 프로토콜(CDP) :

    • Chrome에서 스크린샷을 캡처하는 데 CDP를 활용하면 스크린샷 프로세스를 더 효과적으로 제어할 수 있습니다.
     javascriptCopy code// Using CDP with Puppeteer for full-page screenshots const client = await page.target().createCDPSession(); await client.send('Page.captureScreenshot', { format: 'png', full: true });


  3. 콘텐츠 로드 대기 : Diego는 캡처하기 전에 모든 동적 콘텐츠가 완전히 로드되었는지 확인하기 위해 특정 요소를 기다리는 것이 중요하다고 강조했습니다.

     javascriptCopy code// Wait for content to load await page.waitForSelector('.content-loaded'); await page.screenshot({ path: 'dynamic-content.png', fullPage: true });


중요한 이유 : 포괄적인 스크린샷을 캡처하는 것은 디버깅 및 기록 유지에 매우 중요합니다. Diego는 "콘텐츠 누락을 방지하려면 스크린샷을 찍기 전에 항상 모든 요소, 글꼴 및 이미지가 완전히 로드되었는지 확인하세요."라고 조언했습니다.

안티봇 조치 우회

웹 스크래핑 작업을 확장할 때 개발자는 자동화된 데이터 추출을 방지하도록 설계된 정교한 안티봇 기술을 접하는 경우가 많습니다. Jakub은 이러한 과제를 극복하기 위한 실용적인 전략을 공유했습니다.


웹 스크레이퍼 API - 브라이트 데이터


  1. 세션 관리 : Bright Data의 Scraping Browser 와 같은 도구를 활용하면 세션 관리가 크게 단순화될 수 있습니다. 이 제품은 쿠키와 세션을 자동으로 관리하여 인간과 유사한 탐색 패턴을 모방하여 플래그가 지정될 가능성을 줄입니다.


  2. IP 순환 : 대규모 스크래핑에는 IP 순환 구현이 중요합니다. Bright Data 와 같은 서비스는 광범위한 프록시 네트워크를 제공하므로 IP 주소를 교체하고 다양한 지리적 위치에서 요청을 시뮬레이션할 수 있습니다. 이렇게 하면 단일 IP에서 반복되는 요청을 모니터링하는 안티 봇 방어가 실행되는 것을 방지할 수 있습니다.


  3. 지문 기술 : Puppeteer ExtraPlaywright Stealth 와 같은 도구는 브라우저 지문을 수정하여 감지를 우회할 수 있습니다. 사용자 에이전트, 화면 크기, 장치 유형과 같은 요소를 변경함으로써 이러한 도구는 스크립트가 합법적인 사용자처럼 보이도록 도와줍니다.


  4. 인간과 유사한 상호 작용 : Selenium, Playwright 및 Puppeteer는 사실적인 마우스 움직임, 타이핑 시뮬레이션 등 인간과 유사한 상호 작용을 허용하는 플랫폼을 제공합니다. 이를 통해 안티 봇 메커니즘이 실행될 가능성을 더욱 줄일 수 있습니다.


중요한 이유 : 성공적인 대규모 스크래핑을 위해서는 봇 방지 조치를 탐색하는 것이 중요합니다. Jakub은 세션 관리, IP 순환, 핑거프린팅의 복잡성을 관리하는 도구를 활용하면서 효율적인 스크립트 작성에 집중하는 것이 중요하다고 강조했습니다.


CAPTCHA 극복


개발자는 이러한 전략을 구현하고 특수 도구를 활용하여 스크래핑 작업을 효과적으로 확장하고 탐지 및 차단 위험을 최소화할 수 있습니다.


Q&A 통찰력: 일반적인 문제에 대한 전문가의 대응

웹 세미나의 Q&A 세션에서 패널리스트는 웹 스크래핑에서 개발자가 직면한 몇 가지 일반적인 문제를 해결했습니다.


  1. 프런트엔드 API 호출 가로채기: 패널에서는 Puppeteer 및 Playwright와 같은 도구를 사용하여 API 호출을 직접 가로채는 것을 강조했습니다. 브라우저의 개발자 도구에서 네트워크 요청을 모니터링함으로써 개발자는 복잡한 DOM 구조를 우회하여 원하는 데이터를 반환하는 특정 API 엔드포인트를 식별하고 타겟팅할 수 있습니다.


  2. 기본 인증 관리: 기본 인증을 처리하려면 스크래핑 도구에 내장된 기능을 사용하여 프로세스를 자동화하는 것이 중요합니다. 이를 통해 매번 수동 개입 없이 데이터에 원활하게 액세스할 수 있습니다.


  3. 강력한 XPath 선택기 작성: 합의는 명확했습니다. 가능할 때마다 XPath를 피하는 것입니다. 대신 텍스트 기반 및 ARIA 역할 선택기와 같은 다양한 선택기를 제공하는 Playwright와 같은 도구에서 제공하는 강력한 로케이터 옵션을 활용하여 보다 탄력적인 스크래핑 스크립트를 보장하세요.


  4. 데이터 추출 표준화: 완전한 HTML을 묶기 위한 보편적인 표준은 아직 존재하지 않지만 개발자는 Mozilla 가독성과 같은 도구를 사용하여 페이지를 보다 구조화된 형식으로 변환하고 데이터 접근성을 향상시켜 콘텐츠 추출을 단순화할 수 있습니다.


  5. 사용자 상호 작용 없는 지연 로딩: 전문가들은 수동 사용자 상호 작용 없이 모든 콘텐츠가 로드되도록 하기 위해 시뮬레이션된 스크롤링을 사용하거나 네트워크 요청을 가로챌 것을 권장했습니다. 이 접근 방식을 사용하면 복잡하고 지연 로드되는 페이지에서도 포괄적인 데이터 추출이 가능합니다.


  6. 동적 콘텐츠의 스크린샷 캡처: 동적 콘텐츠를 처리할 때는 스크린샷을 캡처하기 전에 모든 요소가 완전히 로드될 때까지 기다리는 것이 중요합니다. Firefox의 기본 스크린샷 기능이나 CDP(Chrome DevTools Protocol) 사용과 같은 도구를 사용하면 정확한 전체 페이지 캡처를 용이하게 할 수 있습니다.


  7. 동적 클래스 처리: 동적 클래스의 빈번한 변경을 관리하기 위해 패널에서는 상대 선택기와 데이터 속성에 중점을 둘 것을 제안했습니다. 이러한 요소는 일반적으로 더 안정적이고 변경될 가능성이 적기 때문에 지속적인 스크립트 조정의 필요성이 줄어듭니다.


웨비나의 주요 내용

웹 세미나는 동적 웹 스크래핑을 마스터하는 데 대한 귀중한 통찰력을 제공했습니다. 전문가의 지도를 통해 개발자는 웹 스크래핑의 복잡한 문제를 해결하기 위한 귀중한 전략을 얻었습니다.


우리가 배운 것 :

  • 강력한 선택기 : 탄력적인 스크래핑 스크립트를 생성하려면 ARIA 레이블 및 텍스트 기반 선택기를 선택하세요.
  • API 가로채기 : 더 빠르고 안정적인 데이터 추출을 위한 대상 API 엔드포인트입니다.
  • SPA 관리 : 이벤트 기반 조건자를 활용하여 SPA에 동적으로 로드된 콘텐츠를 처리합니다.
  • 지연 로딩 : 사용자 상호 작용을 시뮬레이션하거나 네트워크 요청을 가로채서 포괄적인 데이터 스크래핑을 보장합니다.
  • Shadow DOM : 올바른 도구와 기술을 사용하여 캡슐화된 요소에 효과적으로 액세스합니다.
  • 봇 방지 조치 : 세션 관리, IP 순환 및 지문 채취 도구를 사용하여 감지를 피하면서 스크래핑 노력을 확장합니다.
  • 동적 클래스 : 스크레이퍼 견고성을 유지하기 위해 안정적인 속성과 데이터 속성에 중점을 둡니다.


패널리스트의 실용적인 팁과 공유된 경험은 개발자가 웹 스크래핑 기술을 개선할 수 있는 견고한 기반을 제공했습니다. 이러한 전략을 구현하면 스크래핑 기능을 향상시키고 유지 관리 노력을 줄이며 다양한 웹 사이트 아키텍처에서 성공적인 데이터 추출을 보장할 수 있습니다.


전반적으로 웹 세미나는 일반적인 스크래핑 문제에 대한 전문가의 관점과 실행 가능한 솔루션을 제공하는 귀중한 리소스였습니다. 숙련된 개발자이든 이제 막 시작하는 개발자이든 이러한 통찰력은 웹 스크래핑 노력을 향상시키는 데 도움이 될 것입니다.