AI 비교AI 찾기AI 뉴스AI 활용
회사 소개
개인정보처리방침이용약관FAQ문의하기문의하기
에이아이비 주식회사사업자정보
© 2026 AIB Inc.

Python AI 웹 스크래퍼 튜토리얼

Python AI 웹 스크래퍼 튜토리얼

KDnuggets·2026년 8월 15일 (토)
  • •Python 스크래퍼가 웹페이지를 가져와 HTML을 정리하고 Markdown으로 변환한 뒤 LLM으로 사용자 질문에 답한다
  • •튜토리얼은 Jupyter Notebook, requests, BeautifulSoup, markdownify, OpenAI, ftfy, python-dotenv를 사용한다
  • •예시 파이프라인은 Olostep 페이지를 테스트하고 Markdown 결과를 ai_scraper_result.md로 저장한다
  • •Python 스크래퍼가 웹페이지를 가져와 HTML을 정리하고 Markdown으로 변환한 뒤 LLM으로 사용자 질문에 답한다
  • •튜토리얼은 Jupyter Notebook, requests, BeautifulSoup, markdownify, OpenAI, ftfy, python-dotenv를 사용한다
  • •예시 파이프라인은 Olostep 페이지를 테스트하고 Markdown 결과를 ai_scraper_result.md로 저장한다
  • •Python 스크래퍼가 웹페이지를 가져와 HTML을 정리하고 Markdown으로 변환한 뒤 LLM으로 사용자 질문에 답한다
  • •튜토리얼은 Jupyter Notebook, requests, BeautifulSoup, markdownify, OpenAI, ftfy, python-dotenv를 사용한다
  • •예시 파이프라인은 Olostep 페이지를 테스트하고 Markdown 결과를 ai_scraper_result.md로 저장한다
  • •Python 스크래퍼가 웹페이지를 가져와 HTML을 정리하고 Markdown으로 변환한 뒤 LLM으로 사용자 질문에 답한다
  • •튜토리얼은 Jupyter Notebook, requests, BeautifulSoup, markdownify, OpenAI, ftfy, python-dotenv를 사용한다
  • •예시 파이프라인은 Olostep 페이지를 테스트하고 Markdown 결과를 ai_scraper_result.md로 저장한다

KDnuggets는 August 14, 2026 Python으로 간단한 AI 웹 스크래퍼를 만드는 튜토리얼을 공개했다. 이 튜토리얼은 Jupyter Notebook, requests, BeautifulSoup, markdownify, OpenAI, ftfy, python-dotenv를 사용한다. 스크래퍼는 웹페이지를 가져오고, 불필요한 HTML을 제거한 뒤 남은 내용을 Markdown으로 바꾸며, 사용자 질문을 받아 전체 웹페이지를 LLM에 보내는 대신 해당 페이지에서 필요한 Markdown 답변만 반환한다. 튜토리얼은 모델이 텍스트를 보기 전에 내비게이션 링크, 버튼, 스크립트, 푸터, 반복 콘텐츠 등 웹페이지 잡음이 제거되기 때문에 답변이 더 깔끔하고 재사용하기 쉬우며 토큰 사용량도 줄어든다고 설명했다.

설정 과정은 `!pip install requests beautifulsoup4 markdownify openai ftfy python-dotenv`를 사용하고, 이어 `os`, `re`, `requests`, `BeautifulSoup`, `Comment`, `fix_text`, `markdownify_html`, `OpenAI`, `load_dotenv`, 노트북 표시 도구를 불러온다. OpenAI API 키는 `.env` 파일에서 `OPENAI_API_KEY=your_api_key_here` 형식으로 로드되며, 키 누락을 확인하는 가드를 거쳐 `client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))` 생성에 쓰인다. 튜토리얼은 `MODEL_NAME = "gpt-5.4-nano"`를 설정하고, 정리된 웹페이지 내용을 읽고 질문을 이해한 뒤 집중된 Markdown 답변을 반환하는 작업에는 더 작은 모델이면 충분하다고 말한다.

첫 함수 `fetch_page(url: str) -> str`는 `requests.get`, `SimpleAIScraper/1.0`이라는 `User-Agent`, `timeout=15`로 원시 HTML을 내려받는다. 이 함수는 `response.raise_for_status()`를 호출해 `404`나 `500` 같은 실패 요청이 코드를 멈추게 한 뒤 `response.text`를 반환한다. 튜토리얼은 `https://www.olostep.com/`에서 이 함수를 테스트하고 첫 `500`자를 출력했으며, 원시 출력에는 여전히 전체 HTML, 태그, 스크립트, 레이아웃 요소, 기타 불필요한 자료가 들어 있다고 짚었다.

`clean_html(html)` 함수는 `fix_text()`로 깨진 텍스트 인코딩을 고치고 BeautifulSoup으로 페이지를 파싱한 뒤 `script`, `style`, `noscript`, `svg`, `img`, `iframe`, `nav`, `header`, `footer`, `aside`, `form`, `button` 태그를 제거한다. 또한 class 이름과 ID에서 `cursor`, `modal`, `popup`, `floating`, `signup`, `login`, `cookie`, `banner`, `navbar`, `menu`, `footer`, `header`, `subscribe`, `newsletter`, `loading`, `wait`, `success`, `auth`, `w-nav`, `w-form` 같은 잡음 단어를 확인하고, 일치하는 태그를 안전하게 분해한 뒤 페이지 body나 soup을 HTML로 반환한다.

`html_to_markdown(html)` 함수는 정리된 HTML을 markdownify로 변환하며 `heading_style="ATX"`와 `bullets="-"`를 사용한 뒤 `fix_text()`를 다시 실행한다. 정규식으로 이미지 Markdown을 제거하고, 여분의 공백과 `3`개 이상 이어진 빈 줄을 접으며, `click to try`, `wait...`, `you've successfully reserved your spot.`, `thank you! your submission has been received!`, `oops! something went wrong while submitting the form.`, `product`, `resources`, `company` 같은 반복 줄을 건너뛴다. 그 결과 원시 HTML 대신 유용한 제목, 문단, 글머리표를 갖춘 읽기 쉬운 Markdown이 만들어진다.

`answer_query_from_page(markdown_text, user_query)` 함수는 정리된 Markdown과 사용자의 질문을 OpenAI Responses API로 보낸다. 프롬프트는 모델에 웹페이지 Markdown만 사용해 답하고, 깨끗한 Markdown만 반환하며, 없는 세부사항을 만들지 말라고 지시한다. 또한 내비게이션 링크, 버튼, CTA, 팝업, 장식용 라벨, 이미지 캡션, 반복 마케팅 문구, `Start for free`, `Contact Sales`, `Your AI Agent`, 장식적 워크플로 예시는 질문에 직접 답하지 않는 한 무시해야 한다. 페이지에 답이 없으면 모델은 `The page does not contain this information.`이라고 말해야 한다.

마지막 `ai_web_scraper(url, user_query)` 함수는 웹페이지 가져오기, HTML 정리, Markdown 변환, LLM 질문, 최종 답변 반환을 하나의 파이프라인으로 연결한다. 튜토리얼은 `https://www.olostep.com/`와 `What does this company do?` 질문으로 스크래퍼를 테스트한 뒤, `https://www.olostep.com/pricing`과 `Help me understand the pricing` 질문도 사용했다. 또한 최종 응답을 `ai_scraper_result.md`에 저장하고 `Markdown saved to ai_scraper_result.md`를 출력했으며, 서버 호스팅, LLM 호출, 스크래퍼 유지관리, 깨진 페이지 처리, 오류, 장기 개선에는 시간과 비용이 든다고 경고했다.

KDnuggets는 August 14, 2026 Python으로 간단한 AI 웹 스크래퍼를 만드는 튜토리얼을 공개했다. 이 튜토리얼은 Jupyter Notebook, requests, BeautifulSoup, markdownify, OpenAI, ftfy, python-dotenv를 사용한다. 스크래퍼는 웹페이지를 가져오고, 불필요한 HTML을 제거한 뒤 남은 내용을 Markdown으로 바꾸며, 사용자 질문을 받아 전체 웹페이지를 LLM에 보내는 대신 해당 페이지에서 필요한 Markdown 답변만 반환한다. 튜토리얼은 모델이 텍스트를 보기 전에 내비게이션 링크, 버튼, 스크립트, 푸터, 반복 콘텐츠 등 웹페이지 잡음이 제거되기 때문에 답변이 더 깔끔하고 재사용하기 쉬우며 토큰 사용량도 줄어든다고 설명했다.

설정 과정은 `!pip install requests beautifulsoup4 markdownify openai ftfy python-dotenv`를 사용하고, 이어 `os`, `re`, `requests`, `BeautifulSoup`, `Comment`, `fix_text`, `markdownify_html`, `OpenAI`, `load_dotenv`, 노트북 표시 도구를 불러온다. OpenAI API 키는 `.env` 파일에서 `OPENAI_API_KEY=your_api_key_here` 형식으로 로드되며, 키 누락을 확인하는 가드를 거쳐 `client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))` 생성에 쓰인다. 튜토리얼은 `MODEL_NAME = "gpt-5.4-nano"`를 설정하고, 정리된 웹페이지 내용을 읽고 질문을 이해한 뒤 집중된 Markdown 답변을 반환하는 작업에는 더 작은 모델이면 충분하다고 말한다.

첫 함수 `fetch_page(url: str) -> str`는 `requests.get`, `SimpleAIScraper/1.0`이라는 `User-Agent`, `timeout=15`로 원시 HTML을 내려받는다. 이 함수는 `response.raise_for_status()`를 호출해 `404`나 `500` 같은 실패 요청이 코드를 멈추게 한 뒤 `response.text`를 반환한다. 튜토리얼은 `https://www.olostep.com/`에서 이 함수를 테스트하고 첫 `500`자를 출력했으며, 원시 출력에는 여전히 전체 HTML, 태그, 스크립트, 레이아웃 요소, 기타 불필요한 자료가 들어 있다고 짚었다.

`clean_html(html)` 함수는 `fix_text()`로 깨진 텍스트 인코딩을 고치고 BeautifulSoup으로 페이지를 파싱한 뒤 `script`, `style`, `noscript`, `svg`, `img`, `iframe`, `nav`, `header`, `footer`, `aside`, `form`, `button` 태그를 제거한다. 또한 class 이름과 ID에서 `cursor`, `modal`, `popup`, `floating`, `signup`, `login`, `cookie`, `banner`, `navbar`, `menu`, `footer`, `header`, `subscribe`, `newsletter`, `loading`, `wait`, `success`, `auth`, `w-nav`, `w-form` 같은 잡음 단어를 확인하고, 일치하는 태그를 안전하게 분해한 뒤 페이지 body나 soup을 HTML로 반환한다.

`html_to_markdown(html)` 함수는 정리된 HTML을 markdownify로 변환하며 `heading_style="ATX"`와 `bullets="-"`를 사용한 뒤 `fix_text()`를 다시 실행한다. 정규식으로 이미지 Markdown을 제거하고, 여분의 공백과 `3`개 이상 이어진 빈 줄을 접으며, `click to try`, `wait...`, `you've successfully reserved your spot.`, `thank you! your submission has been received!`, `oops! something went wrong while submitting the form.`, `product`, `resources`, `company` 같은 반복 줄을 건너뛴다. 그 결과 원시 HTML 대신 유용한 제목, 문단, 글머리표를 갖춘 읽기 쉬운 Markdown이 만들어진다.

`answer_query_from_page(markdown_text, user_query)` 함수는 정리된 Markdown과 사용자의 질문을 OpenAI Responses API로 보낸다. 프롬프트는 모델에 웹페이지 Markdown만 사용해 답하고, 깨끗한 Markdown만 반환하며, 없는 세부사항을 만들지 말라고 지시한다. 또한 내비게이션 링크, 버튼, CTA, 팝업, 장식용 라벨, 이미지 캡션, 반복 마케팅 문구, `Start for free`, `Contact Sales`, `Your AI Agent`, 장식적 워크플로 예시는 질문에 직접 답하지 않는 한 무시해야 한다. 페이지에 답이 없으면 모델은 `The page does not contain this information.`이라고 말해야 한다.

마지막 `ai_web_scraper(url, user_query)` 함수는 웹페이지 가져오기, HTML 정리, Markdown 변환, LLM 질문, 최종 답변 반환을 하나의 파이프라인으로 연결한다. 튜토리얼은 `https://www.olostep.com/`와 `What does this company do?` 질문으로 스크래퍼를 테스트한 뒤, `https://www.olostep.com/pricing`과 `Help me understand the pricing` 질문도 사용했다. 또한 최종 응답을 `ai_scraper_result.md`에 저장하고 `Markdown saved to ai_scraper_result.md`를 출력했으며, 서버 호스팅, LLM 호출, 스크래퍼 유지관리, 깨진 페이지 처리, 오류, 장기 개선에는 시간과 비용이 든다고 경고했다.

원문 보기 (영어)·2026년 8월 14일
#web scraping#python#jupyter notebook#beautifulsoup#markdownify#openai#gpt 5 4 nano#responses api#python dotenv#olostep