728x90
반응형

어제는 CSVLoader를 활용해 로컬 CSV 데이터를 문서화하는 방법을 배웠습니다.

 

오늘은 그 연장선으로, 웹 페이지 데이터를 직접 불러오는 방법을 다뤄봅니다.

 

LangChain에서는 이를 위해 WebBaseLoader라는 도구를 제공합니다.

 

즉, URL만 있으면 웹 페이지의 텍스트를 바로 Document 객체로 변환할 수 있는 로더입니다.


1. 왜 WebBaseLoader인가?

현실에서 우리가 다루는 정보는 로컬 파일 뿐만 아니라, 웹 문서(뉴스 기사, 블로그 글, 기술 문서)등에도 풍부하게 존재합니다.

 

따라서 RAG 파이프라인에서 웹 데이터를 바로 가져와 사용할 수 있다면, 최신 정보 반영이나 동적 데이터 분석이 가능해집니다.

 

이때 WebBaseLoader 는 웹 페이지의 본문을 긁어와 Document로 만들어주기 때문에, 바로 벡터화 → 검색 → QA 과정으로 이어질 수 있습니다.


2. 기본 사용법

아래 예시는 네이버 뉴스 기사를 불러오는 코드입니다.

BeautifulSoup 옵션(bs_kwargs)을 통해 원하는 영역만 파싱할 수 있습니다.

 

import bs4
from langchain_community.document_loaders import WebBaseLoader

# 뉴스기사 내용을 로드합니다.
loader = WebBaseLoader(
    web_paths=("<https://n.news.naver.com/article/437/0000378416>",),
    bs_kwargs=dict(
        parse_only=bs4.SoupStrainer(
            "div",
            attrs={"class": ["newsct_article _article_body", "media_end_head_title"]},
        )
    ),
    header_template={
        "User_Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36",
    },
)

docs = loader.load()
print(f"문서의 수: {len(docs)}")
docs

 

출력 결과는 뉴스 기사 본문이 page_content에 담겨 반환됩니다.

 

bs_kwargs 인자를 확인하기 위해 아래 그림의 순서대로 진행하면 확인할 수 있습니다.

 

우선, 웹 페이지를 우클릭하면 "검사"가 나옵니다. 이 "검사"를 클릭하면 다음과 같은 화면이 나옵니다.

 

 

 

여기서, 아래 그림을 클릭합니다.

 

그리고 내가 가져오고 싶은 부분을 클릭하면 우측 html에 요소가 보입니다. 이 요소를 bs_kwargs에 넣으면 크롤링이 가능합니다!!

 

 

 

출력 결과:

USER_AGENT environment variable not set, consider setting it to identify your requests.
문서의 수: 1
[Document(metadata={'source': '<https://n.news.naver.com/article/437/0000378416>'}, page_content="\\n출산 직원에게 '1억원' 쏜다…회사의 파격적 저출생 정책\\n\\n\\n[앵커]올해 아이 낳을 계획이 있는 가족이라면 솔깃할 소식입니다. 정부가 저출생 대책으로 매달 주는 부모 급여, 0세 아이는 100만원으로 올렸습니다. 여기에 첫만남이용권, 아동수당까지 더하면 아이 돌까지 1년 동안 1520만원을 받습니다. 지자체도 경쟁하듯 지원에 나섰습니다. 인천시는 새로 태어난 아기, 18살될 때까지 1억원을 주겠다. 광주시도 17살될 때까지 7400만원 주겠다고 했습니다. 선거 때면 나타나서 아이 낳으면 현금 주겠다고 밝힌 사람이 있었죠. 과거에는 표만 노린 '황당 공약'이라는 비판이 따라다녔습니다. 그런데 지금은 출산율이 이보다 더 나쁠 수 없다보니, 이런 현금성 지원을 진지하게 정책화 하는 상황까지 온 겁니다. 게다가 기업들도 뛰어들고 있습니다. 이번에는 출산한 직원에게 단번에 1억원을 주겠다는 회사까지 나타났습니다.이상화 기자가 취재했습니다.[기자]한 그룹사가 오늘 파격적인 저출생 정책을 내놨습니다.2021년 이후 태어난 직원 자녀에 1억원씩, 총 70억원을 지원하고 앞으로도 이 정책을 이어가기로 했습니다.해당 기간에 연년생과 쌍둥이 자녀가 있으면 총 2억원을 받게 됩니다.[오현석/부영그룹 직원 : 아이 키우는 데 금전적으로 많이 힘든 세상이잖아요. 교육이나 생활하는 데 큰 도움이 될 거라 생각합니다.]만약 셋째까지 낳는 경우엔 국민주택을 제공하겠다는 뜻도 밝혔습니다.[이중근/부영그룹 회장 : 3년 이내에 세 아이를 갖는 분이 나올 것이고 따라서 주택을 제공할 수 있는 계기가 될 것으로 생각하고.][조용현/부영그룹 직원 : 와이프가 셋째도 갖고 싶어 했는데 경제적 부담 때문에 부정적이었거든요. (이제) 긍정적으로 생각할 수 있을 것 같습니다.]오늘 행사에서는, 회사가 제공하는 출산장려금은 받는 직원들의 세금 부담을 고려해 정부가 면세해달라는 제안도 나왔습니다.이같은 출산장려책은 점점 확산하는 분위기입니다.법정기간보다 육아휴직을 길게 주거나, 남성 직원의 육아휴직을 의무화한 곳도 있습니다.사내 어린이집을 밤 10시까지 운영하고 셋째를 낳으면 무조건 승진시켜 주기도 합니다.한 회사는 지난해 네쌍둥이를 낳은 직원에 의료비를 지원해 관심을 모았습니다.정부 대신 회사가 나서는 출산장려책이 사회적 분위기를 바꿀 거라는 기대가 커지는 가운데, 여력이 부족한 중소지원이 필요하다는 목소리도 나옵니다.[영상디자인 곽세미]\\n\\t\\t\\n")]

 

SSL 인증 오류를 우회하기 위해, “verify” 옵션을 설정할 수 있습니다.

# ssl 인증 우회
loader.requests_kwargs = {"verify": True}

# 데이터 로드
docs = loader.load()

 

여러 웹 페이지를 한 번에 로드할 수도 있습니다. 이를 위해 urls의 리스트를 로더에 전달하면, 전달된 urls의 순서대로 문서 리스트를 반환합니다.

loader = WebBaseLoader(
    web_paths=[
        "<https://n.news.naver.com/article/437/0000378416>",
        "<https://n.news.naver.com/mnews/hotissue/article/092/0002340014?type=series&cid=2000063>",
    ],
    bs_kwargs=dict(
        parse_only=bs4.SoupStrainer(
            "div",
            attrs={"class": ["newsct_article _article_body", "media_end_head_title"]},
        )
    ),
    header_template={
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36",
    },
)

# 데이터 로드
docs = loader.load()

# 문서 수 확인
print(len(docs))

 

출력 결과:

2

 

웹에서 가져온 결과를 출력합니다.

print(docs[0].page_content[:500])
print("===" * 10)
print(docs[1].page_content[:500])

 

출력 결과:

출산 직원에게 '1억원' 쏜다…회사의 파격적 저출생 정책

[앵커]올해 아이 낳을 계획이 있는 가족이라면 솔깃할 소식입니다. 정부가 저출생 대책으로 매달 주는 부모 급여, 0세 아이는 100만원으로 올렸습니다. 여기에 첫만남이용권, 아동수당까지 더하면 아이 돌까지 1년 동안 1520만원을 받습니다. 지자체도 경쟁하듯 지원에 나섰습니다. 인천시는 새로 태어난 아기, 18살될 때까지 1억원을 주겠다. 광주시도 17살될 때까지 7400만원 주겠다고 했습니다. 선거 때면 나타나서 아이 낳으면 현금 주겠다고 밝힌 사람이 있었죠. 과거에는 표만 노린 '황당 공약'이라는 비판이 따라다녔습니다. 그런데 지금은 출산율이 이보다 더 나쁠 수 없다보니, 이런 현금성 지원을 진지하게 정책화 하는 상황까지 온 겁니다. 게다가 기업들도 뛰어들고 있습니다. 이번에는 출산한 직원에게 단번에 1억원을 주겠다는 회사까지 나타났습니다.이상화 기자가 취재했습니다.[기자]한 그룹사가 오늘 파격적인 저출생 정책을 내놨
==============================

고속 성장하는 스타트업엔 레드팀이 필요하다

[이균성의 溫技] 초심, 본질을 잃을 때한 스타트업 창업자와 최근 점심을 같이 했다. 조언을 구할 게 있다고 했다. 당장 급한 현안이 있는 건 아니었다. 여러 번 창업한 경험이 있는데 지금 하고 있는 아이템은 대박 느낌이 든다고 헸다. 그런데 오히려 더 조심해야겠다는 생각이 들더란다. 조언을 구하고자 하는 바도 성장이 예상될 때 무엇을 경계해야 할지 알고 싶다는 거였다. 적잖은 스타트업 창업자를 만났지만 드문 사례였다.2년 가까이 스타트업 창업자를 릴레이 인터뷰 하면서 의미 있게 생각했던 것이 두 가지 있다. 첫째, 회사라는 단어보다 팀이라는 어휘를 주로 쓰고 있다는 점이었다. 그 표현의 유래나 의미 때문이라기보다는 팀이라는 말이 더 정겨워 뜻 깊게 생각된 듯하다. 이해관계보다 지향하는 뜻에 더 중점을 두고 하나의 마음으로 한 곳을 향해 달려가는 집단을 가리키는 표현이라는 생각에 더 정겨웠다.스타트업 대표들의 창업 동기는 대부분 ‘사회

3. 실무 적용 포인트

  • bs_kwargs를 잘 설정하면 불필요한 광고/메뉴 영역 제거 가능
  • header_template에 User-Agent를 넣으면 크롤링 차단을 피할 수 있음
  • requests_kwargs로 SSL, timeout 등 세부 옵션을 조정할 수 있음
  • 한 번에 여러 URL을 불러와 도메인 전용 지식베이스를 만들 수 있음

실무에서는 보통 문서 전처리(Text Splitter)를 거쳐야 검색 정확도가 높아집니다.

즉, WebBaseLoader는 “데이터 수집 단계”에 해당하고, 이후 단계(임베딩, 검색기, QA)에 어떻게 이어붙이느냐가 핵심입니다.


마무리

오늘은 WebBaseLoader를 활용해 웹 데이터를 RAG 파이프라인에 연결하는 방법을 살펴봤습니다.

  • URL → Document 변환
  • BeautifulSoup 옵션으로 원하는 영역만 파싱
  • SSL/헤더 설정, 여러 페이지 동시에 로드 가능
728x90
반응형

+ Recent posts