안녕하세요, 천상나타입니다.지난 글(API가 없는 사이트를 자동화하는 법 — Playwright 입문)에서는 브라우저 자동화의 기본기를 정리했는데요, 이번엔 실제로 만들면서 삽질한 지점들을 공유합니다. 세션 저장, 파일 업로드, SPA 대기 — 문서만 보면 쉬워 보이는데 실전에선 다 함정이 있었어요.1. 로그인 세션 저장 — 프로필 폴더가 곧 로그인 상태입문편에서 잠깐 나온 persistent context는 자동화의 생명줄입니다. 브라우저 프로필 폴더를 통째로 지정해서, 쿠키·로컬스토리지·세션이 디스크에 저장됩니다.const ctx = await chromium.launchPersistentContext('profiles/mysite', { channel: 'chrome', // 진짜 크롬 사용 ..
안녕하세요, 천상나타입니다.이 시리즈를 쓰게 된 계기가 된 궁금증이 하나 있었습니다. 제 블로그가 네이버에 분명 색인은 돼 있는데, 검색 노출이 한 달에 7회밖에 안 나온 거예요. "색인됨 = 검색에 뜬다"라고 생각하면 이해가 안 되는 현상인데, 두 검색엔진의 구조를 비교해보니 답이 나왔습니다. 시리즈 마지막으로 그 분석을 정리합니다.상황 정리: 색인은 정상인데 노출이 0에 가까움네이버 서치어드바이저 진단 리포트를 보면 제 블로그는 이런 상태였어요(실제 캡처, 사이트 정보는 가명 처리).색인: 1,700건 — 네이버가 문서를 정상적으로 보관 중색인 제외: 0건 — 수집 거부당한 것도 없음수집 현황도 주기적으로 돌아감색인 쪽으론 완벽히 정상입니다. 그런데 "콘텐츠 노출/클릭" 리포트를 보면,최근 30일 총..
안녕하세요, 천상나타입니다.구글 서치콘솔 API를 쓰면서 제일 처음 부딪힌 벽이 "로그인"이었어요. 브라우저 없이 코드만으로 구글 데이터를 읽으려면 사람 로그인을 대신할 뭔가가 필요한데, 그게 바로 서비스 계정입니다. OAuth가 뭔지, 서비스 계정이 어떻게 인증되는지 처음부터 정리해봅니다.OAuth란 — "내 비밀번호를 주지 않는 위임"OAuth를 한 문장으로 말하면, 비밀번호를 직접 넘기지 않고 권한만 위임하는 표준입니다.우리가 "구글 계정으로 로그인" 버튼을 누르면 일어나는 일이 그거예요.앱이 "이 사용자의 프로필을 읽고 싶습니다"라고 구글에 요청사용자가 구글 로그인 화면에서 "허용" 클릭구글이 앱에 액세스 토큰을 발급앱은 그 토큰으로 허용된 것만 조회여기서 핵심은 앱이 사용자 비밀번호를 절대 모른..
안녕하세요, 천상나타입니다.지난 글에서 제 사이트 색인 상태를 전수 검사한 이야기를 했는데요, 그 결과에서 가장 골치 아팠던 게 바로 canonical 문제였습니다. 한국어 페이지는 96% 색인됐는데 다국어 페이지는 17~32%밖에 안 됐거든요. 원인을 파고들다 보니 canonical 버그였고, 개념 정리 + 실제 사고 사례로 정리해봅니다.canonical이 뭔가요?같은 내용의 페이지가 여러 주소로 존재할 수 있습니다. mysite.com/page와 mysite.com/page?utm=ad처럼요. 이때 검색엔진에 "이 중에서 이 주소가 대표야"라고 알려주는 게 canonical(표준 주소)입니다.이 선언이 왜 중요하냐면, 검색엔진은 비슷한 페이지들을 하나로 묶어서 관리해요. 표준 주소가 정해지면 나머지는..
안녕하세요, 천상나타입니다.최근 몇 달간 "API가 없는 웹사이트를 어떻게 자동화할까"를 계속 고민하면서 브라우저 자동화 도구인 Playwright를 많이 써봤습니다. 네이버 서치어드바이저 색인 검사 자동화, 티스토리 글 발행 자동화 같은 게 전부 이걸로 만들었는데요, 처음 쓰시는 분들이 알면 좋을 핵심 개념들을 정리해봅니다.Playwright가 뭔데요?Microsoft가 만든 브라우저 자동화 라이브러리예요. 코드로 크롬을 띄워서 사람이 하는 것처럼 클릭하고, 입력하고, 화면을 읽는 도구입니다. 예전엔 Selenium이 표준이었는데, 요즘은 Playwright가 더 많이 쓰여요. 이유는 간단합니다.최신 브라우저 이벤트(파일 선택창, 다운로드 등)를 공식적으로 지원"요소가 나타날 때까지 기다리기"가 기본 ..