한 줄로
항공권 감시 스크립트(flight-watch)에서 스카이스캐너를 빼고, 네이버를 기준으로 삼고 구글은 보조로만 보도록 바꿨다(03ab94a). Webshare 프록시를 붙이면 차단이 풀리느냐는 질문에는 일부만 풀린다고 판단했다. 처음에는 실행 시간이 줄어든다고 생각했지만 그 설명은 틀렸다. 스카이스캐너는 원래 다른 두 곳과 동시에 조회되고 있었기 때문이다.
용어 두 개
- 데이터센터 IP: 가정용 인터넷이 아니라 호스팅·클라우드 사업자가 가진 IP다. 프록시 서비스가 기본으로 주는 IP가 대개 이런 IP다.
- PerimeterX: 봇 차단 솔루션이다. 이번 판단에서 중요한 점은 요청이 어느 IP에서 왔는지만 보지 않고 브라우저 지문과 행동까지 본다는 것이다.
질문: 프록시를 붙이면 스카이스캐너 차단이 풀리는가
결론은 “일부만 풀린다”였다. 먼저 밝혀 두면, 이 판단은 직접 재 보고 내린 것이 아니라 원리로 따져서 내린 것이다.
풀리는 쪽
- 감시 스크립트가 도는 맥미니의 집 IP가 의심받지 않게 된다.
- 헤드리스 브라우저(화면 없이 도는 브라우저)인 Moli도
--http-proxy옵션을 지원하므로, 붙이는 것 자체는 어렵지 않다.
안 풀리는 쪽
- Webshare의 기본 IP는 데이터센터 IP다. 유튜브 자막을 받을 때 통과율이 약 17%였다.
- PerimeterX는 IP만 보지 않는다. 브라우저 지문과 행동도 본다. 그래서 IP만 바꿔서는 다 풀리지 않는다.
- 결국 막히면 IP를 바꿔 다시 시도하는 수밖에 없다. 이건 의도적으로 차단을 우회하는 일이라 약관에 정면으로 걸린다.
프록시로 차단이 일부만 풀린다는 판단과 별도로, flight-watch에서는 스카이스캐너를 제외하기로 했다.
결정: 네이버를 기준으로, 구글은 보조로
flight-watch는 이제 스카이스캐너 없이 네이버·구글만 조회한다.
- 최저가 규칙: 네이버 값을 쓴다. 구글이 7천 원 이상 쌀 때만 구글 값을 쓴다.
-
sky.mjs를 삭제했다. ego 브라우저로 스카이스캐너를 조회하던 코드다. - 시세 보고, 목표가 알림, 예약 링크, 대시보드에서도 스카이스캐너를 뺐다.
- 다른 세션이 10/9에 남겨 둔 수하물 계산 수정은 섞이지 않게 먼저 따로 커밋했다(
51550b0). -
03ab94a는 푸시했고, 로컬과 원격이 같은 커밋을 가리키는지도 확인했다.
포기한 것: 평균 8,707원
공짜 결정은 아니었다. 그동안 쌓인 기록으로 보면 스카이스캐너가 최저가를 낸 비율이 77%였다. 네이버와 구글만 쓰면 평균 8,707원을 손해 본다. 이 판단 근거는 메모리에 남겨 두었다. 메모리에는 이 비율과 평균 가격 차이를 판단 근거로 기록했다.
정리하면 이렇게 맞바꾼 셈이다. 최저가를 더 잘 잡는 소스를 하나 잃는 대신, 약관 위반 위험과 ego 브라우저에 기대는 구조를 같이 덜어냈다.
검증
테스트 12개가 통과했다. 실제 데이터로는 11/7 출발편 하나만 조회했다.
| 소스 | 가격 |
|---|---|
| 구글 | 372,112원 |
| 네이버 | 374,800원 (카드 할인가 356,700원) |
구글이 2,688원 쌌다. 기준인 7천 원에 못 미치므로 규칙대로 네이버 값이 잡혔다.
9개 날짜를 다 도는 정식 실행은 하지 않았다. 정식 실행은 기준값을 갱신하고 알림을 보낼 수 있어서, 시험 삼아 돌리기에는 부작용이 있다. 그래서 10/11 09:50 정기 실행이 바뀐 코드의 첫 실행이다.
틀렸던 설명: “회차당 약 5분이 줄어든다”
작업 중에 “스카이스캐너를 빼면 회차당 약 5분이 줄어든다”고 설명했는데, 틀린 설명이었다.
스카이스캐너는 원래 구글·네이버와 동시에 조회되고 있었다. 병렬로 도는 작업 하나를 빼도 전체 시간은 가장 느린 쪽이 정한다. 그래서 실행 시간은 날짜당 약 31초로 그대로다.
실제로 얻은 효과는 하나다. 더 이상 ego 브라우저에 기대지 않는다. 소스를 줄일 때 속도가 빨라질 거라고 기대했다면, 그 소스가 순서대로 돌았는지 동시에 돌았는지부터 확인해야 한다.
손대지 않은 것
스카이스캐너를 쓰는 곳을 전부 걷어내지는 않았다.
- Aside 루틴: 실제 알림을 보내는 쪽이고, 여전히 스카이스캐너를 쓴다.
- 숙박 시세: 스카이스캐너 호텔 API를 계속 쓴다. 대신할 곳이 없다.
-
cron-job의
45-flight-watch.sh와 plist: 원래부터 커밋되지 않은 상태다. 이번 작업 범위가 아니어서 그대로 두었다.
이번에 바꾼 것은 flight-watch가 항공권 최저가를 어디서 가져오느냐 하나뿐이다.