대한민국 사이트들을 대상으로 검색엔진을 만들고 싶다. 사이트 페이지 타이틀 url, 썸네일, 작성일, 간단한 body 150 자 내외 정도.. 수집하는 .. 어때..?
가능합니다.
그리고 제가 보기에는 사용자님이 생각하는 방향이 오히려 구글보다 구현하기 쉽습니다.
왜냐하면 전체 웹을 색인(Indexing)하는 것이 아니라,
대한민국 사이트만 대상으로 메타 정보(title, url, 썸네일, 작성일, 본문 일부)만 수집하는 검색엔진
이기 때문입니다.
제가 추천하는 구조
+--------------------+
| Seed 사이트 목록 |
| (10만~100만개) |
+---------+----------+
|
Crawl Queue
|
+-------------+-------------+
| |
Crawler 1 Crawler 2
Crawler 3 Crawler 4
| |
+-------------+-------------+
|
Parser
|
title
url
body(150자)
image
date
language
|
MySQL / Elastic
|
Search API
|
React / Vue / Drupal
1. 먼저 사이트 목록 확보
예를 들어
https://www.korea.kr
https://news.naver.com
https://www.yna.co.kr
https://www.hankyung.com
https://blog.naver.com
https://cpmadang.org
...
또는
robots.txt
sitemap.xml
RSS
를 통해 새로운 URL을 계속 확보합니다.
2. 크롤러
Python이 가장 좋습니다.
예를 들면
aiohttp
httpx
BeautifulSoup
lxml
selectolax
이 정도면 충분합니다.
크롤러는
GET
↓
HTML
↓
파싱
↓
DB 저장
만 하면 됩니다.
3. 저장하는 데이터
예를 들어
id
url
domain
title
description
body
thumbnail
published_at
updated_at
language
status
crawl_time
hash
본문은
150자
정도만 저장하면 됩니다.
예)
윤석열 전 대통령은 ...
...
...
...
...
150자만.
4. 썸네일
대부분
<meta property="og:image">
를 사용합니다.
예를 들면
<meta property="og:image"
content="https://....jpg">
이것만 읽으면 됩니다.
없으면
첫 번째 이미지
를 사용하면 됩니다.
5. 작성일
우선순위
article:published_time
↓
time 태그
↓
JSON-LD
↓
RSS
↓
없으면 Crawl 날짜
6. 제목
<title>
또는
og:title
7. body
가장 어려운 부분입니다.
뉴스 사이트마다
article
main
div.article
div#content
등 구조가 다릅니다.
그래서
Python의 Readability 같은 라이브러리를 이용하면 거의 자동으로 본문을 추출할 수 있습니다.
readability-lxml
trafilatura
goose3
이 세 가지가 많이 사용됩니다.
8. 검색
검색은
MySQL
FULLTEXT
도 가능하지만,
추천은
Elasticsearch
또는
OpenSearch
입니다.
그러면
후보
광명
이재명
AI
검색 속도가 엄청 빠릅니다.
9. 크롤링 서버
저라면
Ubuntu 서버 하나에
Supervisor
↓
Crawler
↓
RabbitMQ
↓
Parser
↓
MySQL
↓
OpenSearch
이렇게 구성합니다.
하루에 얼마나 가능할까?
예를 들어
100개의 비동기 요청만 돌려도
1초
↓
100페이지
가능합니다.
보수적으로 계산하면
1분
6,000페이지
1시간
360,000페이지
하루
800만~1000만 페이지
도 가능합니다.
물론 robots.txt 준수, 요청 간격 조절, 사이트별 속도 제한 등을 적용해야 합니다.
하지만 더 좋은 방법이 있습니다.
사실 구글도 처음부터 HTML만 무한 크롤링하지는 않습니다.
대한민국 사이트라면 많은 곳이
sitemap.xml
을 제공합니다.
예를 들어
https://사이트/sitemap.xml
만 읽으면
URL
작성일
변경일
을 거의 공짜로 얻을 수 있습니다.
그 후
변경된 URL만 크롤링
하면 됩니다.
속도가 수십 배 빨라집니다.
제가 추천하는 최종 구조
사용자님이 운영하는 시민정치마당(cpmadang.org)과도 잘 맞는 구조입니다.
① Seed 사이트 수집
│
▼
robots.txt
sitemap.xml
RSS
│
▼
URL Queue (Redis)
│
▼
Python Async Crawler (httpx + aiohttp)
│
▼
본문 추출 (Trafilatura / Readability)
│
▼
MySQL (메타데이터 저장)
│
▼
OpenSearch (검색 색인)
│
▼
FastAPI 검색 API
│
▼
Drupal 또는 Vue/React 프론트엔드
이 방식이면 수백만~수천만 페이지 규모까지 확장할 수 있습니다.
추가로 한 가지 제안을 드리면, 단순한 검색엔진보다 "대한민국 공개 웹 인덱스(Korea Web Index)"를 목표로 하면 활용도가 훨씬 높습니다. 검색뿐 아니라 API를 제공하여 다른 서비스에서도 사용할 수 있습니다.
예를 들어 페이지마다 다음과 같은 정보를 저장할 수 있습니다.
-
URL
-
제목
-
150자 요약
-
썸네일
-
작성일
-
사이트명
-
카테고리(뉴스, 블로그, 공공기관, 기업 등)
-
언어
-
Open Graph 정보
-
본문 해시값(중복 제거)
-
마지막 크롤링 시간
-
검색 점수
이렇게 구축하면 검색 서비스뿐 아니라 AI 학습용 RAG, 뉴스 분석, 정치·사회 이슈 모니터링 등 다양한 서비스의 기반 데이터베이스로도 활용할 수 있습니다. 저는 이 방향이 장기적으로 더 가치가 있다고 봅니다.
댓글 달기