Today's

길을 나서지 않으면 그 길에서 만날 수 있는 사람을 만날 수 없다

파이썬 스크립트

오늘의 개발일지: 웹 스크래핑 삽질에서 모듈화까지(ft Python)

Billcorea 2025. 10. 28. 15:36
반응형

 

 

오늘의 개발일지: 웹 스크래핑 삽질에서 모듈화까지

웹 스크래핑

 

작성일: 2025년 10월 28일

🚀 오늘의 목표: Daum.net 최신 뉴스, Python으로 가져오기!

오늘의 목표는 Python을 이용해 Daum.net의 최신 주요 뉴스를 가져오는 것이었습니다. 이 기능을 구현하기 위해 requests 라이브러리로 웹페이지에 접속하고, BeautifulSoup 라이브러리로 HTML에서 원하는 정보를 추출하는 '웹 스크래핑(Web Scraping)' 기술을 사용하기로 했습니다.

🚧 1차 시도와 교훈: 웹사이트는 살아있다!

처음에는 Daum 뉴스 페이지의 HTML 구조를 예측해서 뉴스 제목을 가져오는 코드를 작성했습니다. 하지만 웹사이트의 구조는 생각보다 자주 바뀌더군요. 제가 사용했던 CSS 선택자(Selector)가 더 이상 유효하지 않아 아무런 결과도 얻지 못했습니다.

⭐ 오늘의 교훈 #1: 웹사이트는 살아있는 생물과 같습니다. 스크래핑 코드는 한 번 만들고 끝이 아니라, 대상 웹사이트의 구조 변경에 맞춰 꾸준히 유지보수해야 합니다.

🚧 2차 시도와 교훈: "외계어"의 등장 (인코딩 문제)

선택자를 바꿔가며 시도한 끝에 드디어 데이터를 가져오는 데 성공했지만, 결과는 본문 바로가기 와 같은 알아볼 수 없는 글자들 뿐이었습니다. 이는 '인코딩(Encoding)' 문제 때문이었습니다. 웹사이트는 UTF-8이라는 방식으로 한글을 표시하는데, 제 코드가 이 방식을 제대로 인식하지 못한 것이죠.

이 문제는 HTML을 파싱할 때 인코딩 방식을 utf-8로 명확하게 지정해주어 해결할 수 있었습니다.

# BeautifulSoup이 인코딩을 직접 처리하도록 response.content와 from_encoding 사용
soup = BeautifulSoup(response.content, 'html.parser', from_encoding='utf-8')
⭐ 오늘의 교훈 #2: 웹에서 한글 데이터를 다룰 때는 항상 인코딩 문제를 의심해야 합니다. 데이터를 가져온 후에는 반드시 한글이 정상적으로 보이는지 확인하고, 문제가 있다면 인코딩 방식을 명시적으로 지정해주는 것이 안전합니다.

💡 문제 해결의 결정적 열쇠: 페이지 통째로 저장하기

계속된 실패에, 저는 문제의 원인이 '웹페이지를 가져오는 것' 자체에 있는지, 아니면 '가져온 데이터에서 정보를 추출하는 것'에 있는지 확인해야 했습니다. 그래서 스크래핑한 페이지의 전체 HTML을 그대로 파일(daum_page.html)로 저장하는 전략을 사용했습니다.

결과는 대성공! 파일이 정상적으로 만들어졌고, 그 안에는 모든 웹페이지 내용이 담겨 있었습니다. 이로써 웹페이지 자체는 잘 가져오고 있으며, 단지 HTML 구조가 복잡해서 정보를 추출하는 데 어려움을 겪고 있다는 것을 명확히 알 수 있었습니다.

⭐ 오늘의 교훈 #3: 복잡한 문제에 부딪혔을 때는, 문제의 범위를 좁혀나가는 것이 중요합니다. 중간 결과를 파일로 저장하거나 화면에 출력해보는 간단한 방법만으로도 문제의 진짜 원인을 찾는 결정적인 단서가 될 수 있습니다.

✨ 기능 확장 및 모듈화: 재사용 가능한 부품 만들기

이제 안정적으로 뉴스 제목을 가져올 수 있게 되었으니, 기능을 더욱 확장했습니다.

  1. 기사 본문 수집: 뉴스 목록 페이지에서 기사 링크(URL)들만 추출한 뒤, 다시 각 링크에 접속해 제목뿐만 아니라 기사 본문 내용까지 모두 가져오도록 코드를 수정했습니다.
  2. 함수로 만들기 (모듈화): 단순히 파일에 저장하고 끝나는 스크립트가 아니라, 다른 곳에서도 이 기능을 쉽게 가져다 쓸 수 있도록 doDaumSearch()라는 함수로 만들었습니다. 이 함수는 호출될 때마다 최신 뉴스 내용을 반환(return)합니다.
  3. 다른 코드와 통합: 최종적으로, 이렇게 만든 daumSearch 모듈을 원래 작업하던 메인 파일(250731-threads-naribot-posting-kanana.py)에서 import하여 사용했습니다. AI에게 글 생성을 요청하는 프롬프트(prompt)에 doDaumSearch() 함수가 실시간으로 가져온 뉴스 내용을 동적으로 추가하여, 항상 최신 뉴스를 기반으로 새로운 콘텐츠를 만들어내도록 시스템을 완성했습니다.
⭐ 오늘의 교훈 #4: 특정 기능을 완성했다면, 그것을 재사용 가능한 함수나 모듈로 만드는 습관을 들이는 것이 좋습니다. 이는 코드의 중복을 줄이고, 전체 프로그램의 구조를 더 깔끔하고 관리하기 쉽게 만들어줍니다.

오늘의 결론

단순해 보였던 뉴스 스크래핑 작업은 생각보다 많은 "삽질"을 필요로 했습니다. 하지만 선택자, 인코딩, 디버깅 전략, 그리고 모듈화에 이르기까지, 웹 개발의 기초를 다지는 값진 경험이었습니다. 역시 개발은 부딪히고 깨지면서 배우는 것 같습니다!

반응형