대니
danny's blog@dannywon_dev
발행 138 · 대기 180

1인 개발자. 클로드 코드를 팀처럼 굴린다. 매일 겪은 것만 쓴다.

← 클로드 코드

크롤링한 전화번호 20개가 가짜였다 — 정규식으로는 못 잡는다

갤러리 175곳을 훑어 전화 106개를 모았는데, 검사를 돌렸더니 20개가 연도와 인스타 숫자 ID였다

크롤러를 돌리고 나면 제일 먼저 보는 건 몇 칸을 채웠는지다. 나도 그랬다.

2026-08-25. 어떤 아트페어의 참가 갤러리 175곳에 대해 행사 공식 사이트에서 이름·도시·홈페이지를 받아오고, 각 갤러리 홈페이지를 훑어 주소·전화·이메일·인스타를 모았다. 47초에 다 돌았다.

  • 전화 106
  • 이메일 111
  • 인스타 117
  • 주소 67

숫자만 보면 성공이다. 그런데 DB 에 넣기 전에 검사를 한 번 더 돌렸더니 전화 20개가 가짜였다.

  • 2025 2024 — 사이트 하단의 연도를 전화로 읽었다
  • 036-5516-6104 — 서로 다른 세 곳에 똑같이 들어갔다. 036 은 한국에 없는 지역번호다
  • 05314453895 — 다른 두 곳에 똑같이 들어갔다
  • 03134091207 — 홈페이지 자리가 인스타 주소였던 갤러리다. 인스타 로그인 화면에 널린 숫자 ID 를 전화로 읽었다

인스타 칸도 같았다. rsrc.php(페이스북 정적 파일) · wix · cargoworld(사이트 빌더 계정)가 갤러리 계정 자리에 앉아 있었다.

정규식을 조여도 통과하는 값이 있었다

처음엔 정규식을 조이는 문제로 봤다. 전화 패턴에 구분자를 요구하고, 인스타 차단 목록을 만드는 쪽. 그건 맞는데 부족했다. 조이고 다시 돌려도 036-5516-6104 는 그대로 통과했다. 형식이 완벽한 전화번호처럼 생겼기 때문이다.

판단이 갈린 지점은 여기였다. 「이 값이 그럴듯한가」로는 못 거른다. 그럴듯한 쓰레기가 제일 위험하다.

효과가 있었던 건 형식 검사가 아니라 관계 검사였다.

같은 값이 둘 이상을 가리키면 버린다.

전화번호 하나가 두 갤러리에 있으면 한쪽은 반드시 틀렸고, 어느 쪽인지 알 방법이 없다. 그러니 둘 다 버린다. 이 한 줄이 형식 검사가 못 잡은 것을 잡았다.

실패했으면 오히려 나았다

같은 날 두 번째로 걸린 것도 결이 같았다. 주소를 못 찾은 곳에는 도시 이름("서울"·"파리")을 채워 넣었는데, 화면의 「오시는 길」 버튼이 그 값으로 지도를 열었다. 구글은 "서울"을 잘 찾아준다. 에러도 안 나고 빈 화면도 안 뜬다. 그냥 도시 한복판이 뜬다.

성공한 것처럼 보이는 실패는 검사에 안 걸린다.

바꾼 것

수집 쪽에 버리는 규칙 셋을 넣었다.

  1. 구분자 없는 숫자열은 전화로 안 친다 — 그 형태로 잡힌 11개가 전부 가짜였다
  2. 한국 번호는 실재하는 지역번호일 때만 남긴다 — 036 같은 건 형식이 맞아도 없는 번호다
  3. 같은 값이 둘 이상을 가리키면 버린다 — 위의 관계 검사

결과는 전화 106 → 83. 숫자가 줄었는데 자료는 좋아졌다.

주소도 같은 방향으로 갔다. 느슨하게 잡아 67곳을 채우던 것을, 번지·건물번호가 있는 39곳만 남기게 조였다. 나머지는 「없음」으로 둔다.

화면 쪽에는 판정을 하나 옮겼다. 지도 링크는 「찾아갈 수 있는 주소」일 때만 만든다. 판정 기준은 숫자가 있나 하나다. 번지가 곧 「그 앞에 설 수 있나」이고, 한국 주소와 바깥 주소 양쪽에 다 통한다. 덤으로 원래 있던 구멍도 막혔다. 갤러리가 직접 주소 칸에 "서울"이라고만 적어 넣어도 이제 같은 일이 안 난다.

남은 것

「몇 건 채웠나」를 성과로 보면 이 규칙들은 전부 손해로 보인다. 106을 83으로 줄이고 67을 39로 줄였으니까. 그래서 자동 수집은 채운 수를 세는 순간 나빠진다.

세야 하는 건 따로 있었다. 같은 값이 몇 번 겹쳤나. 그 수가 0이 될 때까지가 수집이다.

← 목록으로