포스트

Camoufox로 구글 SERP 확인하기

목차

  1. Playwright가 아닌 다른 것을 찾게 된 이유
  2. Camoufox란?
  3. Camoufox 설치
  4. Camoufox 사용 예시

Playwright가 아닌 다른 것을 찾게 된 이유

Playwright와 Playwright stealth를 이용해서 구글 크롤링을 하고 있었는데 어느 순간부터 CAPTCHA가 많이 발생하기 시작했다.
CAPTCHA를 해제하기도 하지만 아예 CAPTCHA도 안뜨고 블락되어 버리는 경우가 있어서 다른 방법이 필요했다. 그래서 다른 방법을 찾던 와중에 Camoufox를 알게 되었다.

Camoufox란?

Camoufox는 웹 스크래핑과 봇 탐지 우회를 위해서 만들어진 안티-디텍트 브라우저다.
주요 기능은 크게 3가지로

  1. 핑거프린트 스푸핑 및 회전
    • JavaScript 주입 없이 모든 네비게이터 속성, 화면 크기와 해상도, 지리적 위치, 시간대 등을 조작할 수 있다.
  2. 스텔스 기능
    • Playwright의 내부 Page Agent JavaScript가 샌드박스화되어 웹페이지에서 Playwright/Juggler의 존재를 감지할 수 없다.
    • 데이터가 C++ 구현 수준에서 가로채어져 JavaScript 검사를 통한 변경 사항 감지가 불가능하다.
  3. 실제 트래픽 모방
    • BrowserForge를 사용하여 실제 트래픽의 통계적 분포를 모방하도록 한다.

Camoufox 설치

uv add camoufox[geoip]로 간단하게 설치할 수 있다.
Linux를 새로 설치한 경우에는 다음 Firefox 의존 항목이 추가로 필요할 수 있어서 sudo apt install -y libgtk-3-0 libx11-xcb1 libasound2를 실행해준다.
그리고 Linux를 사용 중이며 Camoufox를 가상 디스플레이에서 헤드리스로 실행하려는 경우 sudo apt-get install xvfb가 필요하다.

Camoufox 사용 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
async def main():
  async with AsyncCamoufox(headless="virtual",
                          geoip=False,
                          humanize=True,
                          config=config,
                          disable_coop=True,
                          i_know_what_im_doing=True) as browser:
    context = await browser.new_context()
    page = await context.new_page()

    await page.goto(search_url, wait_until="networkidle")
    await page.wait_for_timeout(30000)

    await page.screenshot(path=filename, full_page=True)
  


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

이거와 같은 형태로 사용하면 된다.

원하는 적당한 설정을 하게 되면 특정 국가, 지역에서 원하는 키워드를 검색할 수 있게 된다.

  • 프랑스, 파리에서의 검색 결과
    image

  • 일본, 도쿄에서의 검색 결과
    image


상대적으로 기본 설정만으로도 Playwright에 비해서 CAPTCHA 발생 비율이 적은 것 같다.