TL;DR
- 구글 뉴스 RSS에서 제공하는 링크는 실제 뉴스 페이지가 아닌 리디렉션 URL임
- 이 링크는 URL-safe base64와 protobuf 형식으로 인코딩되어 있어 직접 처리가 어려움
- 본문 추출을 위한 두 가지 접근법: ①오픈소스 패키지 활용과 ②브라우저 자동화(Playwright)
- 두 방법 모두 장단점이 있으며, 어떤 것을 사용할지는 각자의 상황에 맞게 선택해야 함
- 앞으로의 글에서 각 방법의 구체적인 구현 방법과 성과를 다룰 예정
📡 구글 뉴스 RSS 링크: 리디렉션 URL과 본문 추출의 시작
RSS로 수집한 기사 주소를 보면 알겠지만, 사람이 읽고 이해할 수 있는 형태가 아니다. Google이 제공하는 URL을 클릭하면 실제 뉴스 사이트로 이동하지만, 이 주소는 원문 사이트 주소가 아니다. trafilatura는 웹에서 바로 정보를 가져와서 본문을 추출하는 기능이 있지만, 이 URL을 직접 입력하면 작동하지 않는다. 이 주소를 원문 사이트 주소로 바꿔주어야 정상 작동하는 것을 알 수 있다.
import trafilatura url = "https://news.google.com/rss/articles/CBMicEFVX3lxTFBpYk5ZakJVbWRmaW5MLW1Da1pNUEc2dG5uTHdsZXFWSDFFMXVRVF9qajVyYllpNjFmRWR6TnpwQktka0hpTUdURVlLdXdLc3FSQ0hpTlkwSm5uSjlZRnNxZzRyekE4dE1MSENDRno3SWvSAXRBVV95cUxNdXBTR0NLMHVaTEZHb3pGME1BdGNwNjVBNTJzTDd6U1RHbzJCbDlhbmpYMXZ1Tk00M3N5YkxXWTF1Q1FqUXl5X2Z4TC0ycnBxZmVEclEzazRmcmtMY0szaVN5c3dWRWwtemZhNjJNVGZFWEJGVQ?oc=5" html = trafilatura.fetch_url(url) text = trafilatura.extract(html) text
import trafilatura url = "https://www.steeldaily.co.kr/news/articleView.html?idxno=191742" html = trafilatura.fetch_url(url) text = trafilatura.extract(html) text
'대구경 강관 전문 제조 기업 동양철관의 1분기 매출 및 영업이익은 전년 동기 대비 동반 축소된 것으로 나타났다.
동양철관은 15일 금융감독원에 분기보고서를 제출하고 1분기 별도 기준 경영 실적에 대해 △매출액 329억 5,100만 원(전년 동기 대비 44.9% 감소) △영업손실 4억 2,900만 원(적자전환) △순손실 15억 6,000만 원(적자전환)을 기록했다고 밝혔다.
이로써 1분기 연결 실적은 매출액 436억 5,800만 원(전년 동기 대비 36% 감소), 영업손실 2,900만 원(적자전환), 순손실 12억 600만 원(적자전환)으로 집계됐다.
이명화 선임기자
lmh@steelnsteel.co.kr'
❌ 왜 Google 링크를 사용하면 본문 추출이 작동하지 않을까?
Google이 제공하는 이 URL은 실제 뉴스 기사 페이지가 아니라, Google 서버를 거쳐 리디렉션되는 중간 링크이다. 이 구조는 다음과 같은 이유로 설계되어 있다:
Google은 사용자의 클릭을 추적하여 어떤 뉴스가 인기 있는지, 클릭률이 어떻게 형성되는지를 분석한다. 이를 위해 리디렉션 URL과 추가 추적 매개변수(예: url, ref, v, ptok, ei, ctid 등)를 사용하여 사용자의 이동 경로를 기록한다.
이 중간 주소에는 원문 URL을 포함한 다양한 정보가 Google의 프로토콜 버퍼(Protobuf) 형식으로 직렬화된 후, URL-safe Base64로 인코딩되어 URL 매개변수에 포함될 가능성이 높다. 이러한 직렬화 및 Base64 인코딩은 해당 형식을 알지 못하면 Base64 디코딩만으로는 원문 링크를 포함한 의미 있는 정보를 직접 파악하는 것을 매우 어렵게 만든다.
최근 Google의 리디렉션 주소는 더욱 복잡해졌으며, URL에는 리디렉션 요청의 유효성을 Google 서버 측에서 검증하기 위해 사용될 가능성이 높은 "signature" (sig 또는 유사한 이름), "timestamp" (ts 또는 유사한 이름), "gn_art_id" (id 또는 유사한 이름)와 같은 매개변수가 포함될 수 있다. 이러한 서명 및 검증 정보는 클라이언트가 원문 URL을 직접 디코딩하는 데 필요한 정보라기보다는, Google 서버가 리디렉션 요청을 처리할 때 유효성을 확인하는 데 사용된다. 따라서 정상적인 리디렉션 처리를 위해서는 이러한 매개변수가 포함된 요청이 Google 서버로 전송되어야 한다.
초기에는 간단한 Base64 디코딩만으로 원문 URL의 일부를 추출할 수 있었을 수도 있지만, Google은 자동화된 스크립트나 봇의 대량 정보 추출을 방지하기 위해 지속적으로 URL 구조, 데이터 인코딩 방식, 추적 메커니즘 등을 변경하고 복잡하게 만들고 있다. 최근에는 대량의 리디렉션 요청을 감지하고 차단하는 비율 제한(rate limiting) 메커니즘이 적용될 수 있으며, 이를 우회하려는 시도에는 프록시 서버 사용 등의 더욱 복잡한 기술적 접근이 필요해지고 있다.
🔐 요약하자면, Google은 원문 주소를 외부에 직접 노출하지 않도록 설계했고, 중간 주소를 역으로 복호화하거나 디코딩하는 방식이 점점 더 복잡해지고 있다.
✅ 본문 추출을 위한 두 가지 접근법
Google News RSS 링크에서 실제 뉴스 본문을 추출하기 위한 두 가지 주요 전략이 존재한다. 이 글에서는 간략히 두 방법을 소개하고, 앞으로의 글에서 각 방법을 다룰 예정이다.
🔮 앞으로 다룰 내용
이번 글에서는 Google News RSS 링크의 특징과 본문 추출을 위한 두 가지 기본 접근법을 소개했다. 앞으로의 글에서는 다음의 주제들을 다룰 예정이다:
- 복잡한 디코딩 과정 없이 원문 URL 해결하기
- 병렬 처리로 대량 URL 처리 최적화 방법
- 본문 추출 도구 적용 방법
- Playwright vs Selenium 비교 및 Playwright 선택 이유
- 효율적인 브라우저 자동화 설정
- Playwright의 비동기 처리를 통한 성능 향상
- 본문 추출 도구 적용 방법
- 속도, 정확도, 리소스 사용량 비교
- 대규모 배치 처리와 실시간 처리의 차이
- 통계적 유의미성을 위한 최소 표본 크기(300-500개 기사)
📝마치며
Google News RSS에서 수집된 링크는 원문 뉴스 URL이 아니며, Google의 복잡한 리디렉션 구조를 따르는 중간 링크다. 이 링크를 이용해서 실제 뉴스 본문을 추출하기 위해서는 오픈소스 패키지를 활용한 URL 변환 방식과 브라우저 자동화 방식이라는 두 가지 접근법이 존재한다.
다음 글에서는 첫 번째 방법인 오픈소스 패키지 활용 접근법에 대해 살펴보고, 코드로 구현하는 방법과 결과를 알아볼 예정이다.