Puppeteer에 해당하는 글 2

크롬 Headless 모드에서 GPU 가속하기

Chromium|2024. 1. 25. 03:51

크롬 브라우저의  headless 모드는 웹사이트 테스트나 웹페이지 크롤링에 주로 사용된다. 이때, 웹페이지를  png나  pdf로 저장하기도 하기도 하고, WebGL과 같은  3D 컨텐츠를 테스트할 필요도 있다. 늘 그렇지만 기본적으로 3D 가속은 되지 않는다. 때로는 가속되다가도 크롬 브라우저가 버전업하면서 안되기도 한다. 당연히 버그도 이미 올라와있고, 이 글을 쓰는 본인도 약간의 기여를 한적은 있다. :-)

최근 구글 크롬 개발자 블로그에서 헤드리스 모드에서 GPU 가속을 활성화하는 방법을 자세히 공개했다.

https://developer.chrome.com/blog/supercharge-web-ai-testing

 

웹 AI 모델 테스트 강화: WebGPU, WebGL, 헤드리스 Chrome  |  Blog  |  Chrome for Developers

브라우저 테스트를 지속적으로 자동화하고 애플리케이션 성능을 개선하는 방법에 대한 Google Cloud 솔루션을 살펴보세요.

developer.chrome.com

사실 리눅스용 크롬 브라우저에서는 GPU 가속이 꺼져있다. 리눅스는  distro도 다양하고 게다가 GPU벤더가 지원하는 공식 GPU 드라이버에서 해커들이 개발한 오픈소스 버전도 있기 때문에 구글에서 GPU 가속을 기본적으로 꺼놨다.  현재도 마찬가지로 일부  distro는 자체  GPU 가속이 되는 크롬 브라우저 패키지를 내놓고도 있거나, GPU 가속 방법을 알려주고 있다.

아래 코드를 실행하려면 먼저 GPU driver를 설치되고  잘 동작해야 한다. 아래는  우분투 22.04에서 동작하는 NVidia GPU 예이다.

$ nvidia-smi
Wed Jan 24 10:32:13 2024
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 545.29.06              Driver Version: 545.29.06    CUDA Version: 12.3     |
|-----------------------------------------+----------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |
|                                         |                      |               MIG M. |
|=========================================+======================+======================|
|   0  NVIDIA GeForce RTX 4090        Off | 00000000:01:00.0 Off |                  Off |
|  0%   45C    P8              13W / 450W |   1078MiB / 24564MiB |      0%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+

+---------------------------------------------------------------------------------------+
| Processes:                                                                            |
|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
|        ID   ID                                                             Usage      |
|=======================================================================================|
|    0   N/A  N/A      4265      G   /usr/bin/gnome-shell                          6MiB |
|    0   N/A  N/A     42318      C   /usr/local/bin/ollama                      1056MiB |
+---------------------------------------------------------------------------------------+

아래 코드는 크롬 브라우저의  GPU 환경 페이지를  pdf로 출력해주는 코드이다. 

/* Complete example.js */
import puppeteer from 'puppeteer';

// Configure launch parameters
const browser = await puppeteer.launch({
  headless: 'new',
  args: [
    '--no-sandbox',
    '--headless=new',
    '--use-angle=vulkan',
    '--enable-features=Vulkan',
    '--disable-vulkan-surface',
    '--enable-unsafe-webgpu',
  ]
});

const page = await browser.newPage();
await page.goto('chrome://gpu');

// Verify: log the WebGPU status or save the GPU report as PDF
const txt = await page.waitForSelector('text/WebGPU');
const status = await txt.evaluate(g => g.parentElement.textContent);
console.log(status);
await page.pdf({path: './gpu.pdf'});

await browser.close();

크롬 브라우저를 직접 실행하여 'chrome://gpu' 페이지를 확인하고, 위 코드로 생성된 PDF 결과가 동일하다면 헤드리스 모드에서 GPU 가속이 지원되는 것으로 볼 수 있다.

댓글()

headless 브라우저 감지 회피하기

Web|2023. 6. 9. 05:41

Puppeteer나 Playwright같은 headless 브라우징으로 웹페이지 scaping하는 경우가 많은데, 많은 웹사이트들이 headless브라우저를 감지하고 접근을 차단하고 있다. 이를 어떻게 회피하는지 알아보자.

우선 아래 페이지를 headless 브라우저로 접근하면 일반적인 웹브라우저와 headless브라우저가 어떻게 다른 결과가 나오는지 알 수 있다.

https://infosimples.github.io/detect-headless/

사실 이것말고도 더 많은 방법이 있지만, 이 정도가 알려져있다. 이런 것들을 쉽게 구현해주는 Puppeteer plug-in이 이미 만들어져있다.

https://www.npmjs.com/package/puppeteer-extra-plugin-stealth

reCAPCHA도 대응가능하다.

상용 Proxy 서버 사용

당연히 IP도 체크하므로 상용 Proxy 서버를 사용하는 것이 좋다. 상용 서비스는 Proxy 서버를 rotation해서 여러 IP를 사용하도록 해준다.

사실, 창과 방패의 싸움이라 clludflare같은 회사에서는 headless 브라우저를 잘 감지한다. 가장 확실한 방법은 상용  Proxy server와 함께 사용하는 것이다. 비용은 들지만, 가장 확실한 방법이기도 하다.

 

댓글()