스크래핑

차단 없이 소셜 플랫폼에서 감성 분석용 데이터 스크래핑하기

차단은 단순히 데이터 손실만 초래하는 것이 아니라, 감성 점수를 산출하는 표본 자체에 편향을 만듭니다. 소셜 데이터를 지속 가능하게 수집하고 그 격차를 측정하는 방법을 알아봅니다.

Chris Collins

Chris Collins

2026년 9월 6일 · 6 분 소요

소셜 데이터를 수집하면서 차단을 피해야 하는 이유는 대부분의 튜토리얼이 말하는 것과 다르다. 차단이 수집량을 깎아먹기 때문이 아니다. 문제는 차단이 무작위로 일어나지 않는다는 데 있다.

플랫폼이 스로틀링을 시작할 때, 균일한 샘플을 떨어뜨리는 것이 아니다. 결과 세트의 더 깊은 페이지, 더 높은 볼륨의 쿼리, 가장 빠르게 수집하던 시점의 데이터를 떨어뜨린다. 이런 시점은 정확히 당신이 관심 있는 대화와 상관관계가 있다. 논의가 급증하는 시점은 당신의 요청 빈도가 급증하는 시점이기도 하기 때문이다. 그래서 잃는 샘플은 불균형적으로 중요했던 순간의 샘플이며, 이후 계산하는 감성 점수는 확신에 차 있으면서도 당신이 볼 수 없는 방향으로 틀려 있게 된다.

이것이 지속 가능한 수집을 해야 하는 진짜 이유다. 처리량이 아니라 타당성 때문이다.

API부터 시작하라

이 모든 것을 하기 전에, 플랫폼이 공식적으로 제공하는 것을 먼저 확인하라. API가 존재하고 필요한 필드, 볼륨, 이력을 다룬다면 그것을 사용하라. 안정적이고, 허용되며, 커버리지를 은밀히 바꾸지 않고, 로드맵에서 엔지니어링 항목 전체를 제거해 준다.

현실적으로는 API가 문제의 일부만 다룬다. 과거 데이터 깊이는 흔히 제한적이고, 요청 한도는 흔히 진지한 모니터링 프로그램에 필요한 수준보다 낮으며, 정작 중요한 많은 커뮤니티에는 API 자체가 없다. 공개 페이지 수집이 나머지를 채우며, 이 글의 나머지 내용이 다루는 부분이 바로 그것이다.

크롤러가 아니라 독자처럼 행동하라

차단당하지 않는 것은 대부분 사람이 만들어낼 수 없는 트래픽을 만들지 않는 문제다. 이 기법들은 화려하지 않지만 효과가 있다.

사람이 그럴듯하게 만들어낼 만한 속도로 요청 속도를 맞춰라. 6시간 동안 초당 1회 요청을 지속하는 것이 아니다. 일정한 박자가 아니라 변동을 두어 하루 전체에 수집을 분산하라.

엑시트당 동시성을 제한하라. 전역 동시성 한도를 소수의 풀에 불균등하게 분산하면 소수의 주소에 부하가 집중된다. 총합뿐 아니라 주소별로도 제한하라.

저항의 첫 신호에서 물러나라. 챌린지, 느려진 응답, 잘린 결과 세트. 즉시 재시도하려는 본능이 부드러운 스로틀을 강한 차단으로 바꾼다. 지터를 곁들인 지수 백오프, 그리고 반복된 실패 후 대상을 완전히 멈추는 서킷 브레이커를 rate limiting and request throttling에서 다룬다.

세션의 일관성을 유지하라. 페이지네이션된 스레드를 네 개의 다른 주소에서 읽는 것은 그럴듯한 읽기 세션이 아니다. 논리적 작업 단위 하나를 처리하는 동안 하나의 세션을 유지하라.

공개된 것만 수집하라. 로그인 뒤에 있는 콘텐츠는 법적, 윤리적으로 다른 문제이며, 계정 기반 수집은 프로그램이 정말로 곤란해지는 지점이다. 공개 페이지, 공개 게시물, 공개 스레드만 다뤄라.

프록시 계층이 맞물리는 지점

감성 작업에 특히 중요한 속성이 두 가지 있다.

첫째, 단일 주소에서 발생하는 요청량은 당신이 독자가 아니라는 가장 명확한 신호다. 레지덴셜 프록시는 그 요청량을 실제 ISP 할당 주소들에 분산시켜, 주소당 요청 속도는 그럴듯하게 유지하면서도 전체 처리량은 유용한 수준으로 유지한다.

둘째는 지리적 위치이며, 감성 작업에서 과소평가되는 요소다. 소셜 플랫폼은 지역별로 다른 콘텐츠를 제공한다. 트렌딩 토픽, 표시되는 답글, 애초에 어떤 게시물이 노출되는지까지도. 단일 국가의 시야에서 계산된 전역 감성 수치는 그 국가의 감성에 전역이라는 라벨을 붙인 것에 불과하다. 제품이 국제 사용자를 두고 있다면, 수집은 그들의 시장에서 이뤄져야 한다.

Shifter 게이트웨이를 사용하면 둘 다 p.shifter.io:443에 대한 자격 증명에 들어간다:

customer-USERNAME-country-jp-sid-topic-4417-ttl-600:PASSWORD

country-jp는 관측 지점을 설정하고, sid-topic-4417은 하나의 스레드와 그 페이지네이션 동안 하나의 엑시트를 유지하며, ttl-600은 그 주소를 10분 동안 유지한다. sid가 없으면 게이트웨이는 요청마다 회전하는데, 이는 독립적인 쿼리에는 맞지만 연속성이 필요한 작업에는 맞지 않는다. 더 폭넓은 소셜 수집 관점은 social media data collection 페이지에, 계정 측 관행은 social media proxies에 있다.

특정 대상에서 주소가 챌린지를 받기 시작한다면, 진단과 복구 절차는 what to do when residential proxy IPs get banned에 있다.

파이프라인, 순서대로

collect -> dedupe -> language detect -> filter -> score -> aggregate

각 단계마다 결과를 조용히 훼손하는 방식이 있다.

점수를 매기기 전에 중복 제거하라. 그렇지 않으면 동일한 발언의 재게시, 인용, 스크린샷이 하나의 시끄러운 게시물을 트렌드로 만들어 버린다. 고정된 규칙을 사용하고, 복사본은 표준 레코드에 연결된 상태로 유지하라. 확산은 볼륨과는 별개의 신호이기 때문이다.

점수를 매기기 전에 언어를 감지하라. 영어 감성 모델을 다국어 텍스트에 그대로 돌리면 실패가 눈에 띄게 드러나지 않는다. 이해하지 못한 텍스트에 대해서도 확신에 찬 수치를 반환하며, 여러 시장에서 수집하면 다국어 코퍼스는 일상적인 경우가 된다.

키워드만이 아니라 관련성으로 필터링하라. 흔한 단어이기도 한 브랜드 이름은 당신과 아무 관련 없는 텍스트를 끌어들인다. 이는 쿼리 설계 문제이며, 후속 모델로는 고칠 수 없다.

커버리지 지표를 함께 붙여 집계하라. 모든 감성 수치는 동일한 시간대의 수집 성공률과 함께 다녀야 한다. 그래야 독자가 의견의 변화와 볼 수 있었던 범위의 변화를 구분할 수 있다.

감성 점수 산정은 정직한 프로그램이 정직함을 유지해야 하는 지점이다

결과물을 소비하는 사람에게 분명히 밝혀야 할 몇 가지 한계가 있다.

풍자와 반어는 여전히 신뢰하기 어렵고, 사람들이 불만을 토로하는 바로 그 공간에서 과대표된다. 도메인 어휘는 극성을 뒤집는다. “sick”, “insane”, “unreal” 같은 단어는 일부 커뮤니티에서 칭찬이다. 별점과 리뷰 텍스트는 자주 서로 어긋나며, 어긋날 때는 대체로 텍스트 쪽이 진실에 더 가깝다. 그리고 큰 중립 클래스는 하나의 발견이 아니라, 흔히 모델이 파싱하지 못한 텍스트에 대해 의견이 없다는 신호일 뿐이다.

가장 유용한 원칙은 수준이 아니라 변동을 보고하는 것이다. 절대적인 감성 점수 0.62는 누구에게도 의미가 없다. 지난달 대비, 동일한 방식으로 계산되고 비교 가능한 커버리지 위에서 나온 변화는 의미가 있다. 이는 종단적 웹 패널 전반에 적용되는 동일한 측정 논리이며, 통째로 빌려올 가치가 있다.

개인 데이터, 그리고 멈춰야 할 지점

소셜 게시물은 사람이 작성한 것이며, 이 점이 가격 스크레이핑과 다르게 만든다.

공개 게시물을 수집하고, 필요 없는 것은 저장한 뒤 자제하겠다고 약속하는 대신 수집 시점에 제거하라. 사용자 이름, 프로필 링크, 텍스트에 등장하는 연락처는 집계 감성을 계산하는 데 거의 필요하지 않다. 결과물이 추세선이라면, 저장소가 개인들의 데이터베이스일 필요는 없다.

각 플랫폼이 명시한 이용약관을 존중하고, 수집량을 비례적으로 유지하며, 인증이 필요한 콘텐츠는 범위 밖으로 취급하라. 일반적인 틀은 ethical residential proxies for AI data collection에 있으며, 여기서는 대상이 기업이 아니라 사람이기 때문에 더욱 강하게 적용된다.

자주 묻는 질문

레지덴셜 프록시를 쓰면 차단을 막을 수 있나요?

가장 흔한 원인, 즉 하나의 주소나 식별 가능한 데이터센터 대역에서 집중되는 요청량은 제거해 줍니다. 하지만 사람이 만들어내지 않을 요청 속도까지 보완해 주지는 않습니다. 속도 조절과 백오프가 여전히 대부분의 역할을 합니다.

감성 분석에는 실제로 얼마나 많은 데이터가 필요한가요?

트렌드 탐지에는 대부분의 팀이 생각하는 것보다 적게 필요하고, 세분화에는 생각하는 것보다 많이 필요합니다. 안정적인 주간 트렌드에는 볼륨보다 일관성이 더 필요합니다. 시장, 제품, 주제별로 감성을 세분화하면 각 항목이 의미를 가지려면 필요한 샘플이 배로 늘어납니다.

제품이 글로벌하다면 여러 국가에서 수집해야 하나요?

그렇습니다. 집계하기 전에 각 시장을 별도의 시계열로 다루세요. 뒤섞인 전역 수치는 실제로 움직이고 있는 시장을 숨겨 버립니다.

가장 흔한 단 하나의 실수는 무엇인가요?

실제로는 커버리지 변화였던 것을 감성 변화로 보고하는 것입니다. 점수 옆에 성공률을 함께 공개하면 이런 실수는 거의 다 방지됩니다.

결론

지속 가능한 수집은 처리량 선호가 아니라 샘플링 요구사항이다. 차단은 샘플을 조용한 시기 쪽으로 치우치게 하고 시끄러운 시기에서 멀어지게 만드는데, 이는 감성 프로그램이 측정하려는 것과 정반대다.

존재하는 곳에서는 공식 API를 사용하고, 독자처럼 요청 속도를 조절하며, 세션의 일관성을 유지하고, 사용자가 실제로 있는 시장의 레지덴셜 주소에 요청량을 분산시키고, 점수 옆에 커버리지를 함께 공개하라. 요금은 pricing page에 있다.

시작할 준비가 되셨나요?

205M개 이상의 IP, 195개 이상의 국가를 지원하는 Shifter의 레지덴셜 프록시를 $0.10/GB부터 이용해보세요.

시작하기