🖥 VB.NET WinForms 기반 RSS 뉴스 수집기 + 키워드 자동 추출기

반응형

VB.NET WinForms 기반 RSS 뉴스 수집기 + 키워드 자동 추출기

✅ 구성 목표

기능 설명
📡 RSS 피드 입력 사용자가 직접 RSS URL 입력
📥 뉴스 가져오기 RSS 피드의 제목, 요약, 링크를 화면에 표시
🔍 키워드 추출 제목/요약에서 자동으로 상위 키워드 추출
💾 엑셀(CSV) 저장 버튼 클릭으로 파일 저장

🛠 1. 프로젝트 생성

  1. Visual Studio → 새 프로젝트 → Windows Forms App (.NET Framework)
  2. 이름: WinFormsRssNewsCollector
  3. Form1.vb 디자인 구성:
컨트롤 이름 속성
TextBox txtRssUrl 기본값: https://rss.nytimes.com/services/xml/rss/nyt/Technology.xml
Button btnFetch 텍스트: "뉴스 가져오기"
Button btnExport 텍스트: "엑셀로 저장"
ListBox lstFeed 여러 뉴스 항목 표시
ListBox lstKeywords 키워드 목록 표시
Label lblStatus 상태 표시용
TextBox , ListBox가 없는 경우 추가방법

TextBox 추가 방법
ListBox 추가 방법


🧠 2. 전체 코드 (Form1.vb)

vb.net

Imports System.Xml
Imports System.ServiceModel.Syndication
Imports System.IO

Public Class Form1
    Dim feedItems As New List(Of SyndicationItem)

    Private Sub btnFetch_Click(sender As Object, e As EventArgs) Handles btnFetch.Click
        Try
            lstFeed.Items.Clear()
            lstKeywords.Items.Clear()
            lblStatus.Text = "피드 불러오는 중..."

            Dim reader As XmlReader = XmlReader.Create(txtRssUrl.Text)
            Dim feed As SyndicationFeed = SyndicationFeed.Load(reader)
            reader.Close()

            feedItems = feed.Items.ToList()

            For Each item As SyndicationItem In feedItems
                lstFeed.Items.Add(item.Title.Text)
            Next

            ' 키워드 추출
            Dim combinedText As String = String.Join(" ", feedItems.Select(Function(i) i.Title.Text & " " & If(i.Summary IsNot Nothing, i.Summary.Text, "")))
            Dim keywords = ExtractKeywords(combinedText)
            For Each kw In keywords
                lstKeywords.Items.Add("🔍 " & kw)
            Next

            lblStatus.Text = "✅ 완료!"
        Catch ex As Exception
            lblStatus.Text = "❌ 오류: " & ex.Message
        End Try
    End Sub

    Private Sub btnExport_Click(sender As Object, e As EventArgs) Handles btnExport.Click
        Try
            Dim filePath As String = $"rss_export_{Now.ToString("yyyyMMdd_HHmmss")}.csv"
            Using writer As New StreamWriter(filePath, False, System.Text.Encoding.UTF8)
                writer.WriteLine("제목,링크,요약")

                For Each item As SyndicationItem In feedItems
                    Dim title = CleanForCsv(item.Title.Text)
                    Dim link = item.Links(0).Uri.ToString()
                    Dim summary = If(item.Summary IsNot Nothing, CleanForCsv(item.Summary.Text), "")
                    writer.WriteLine($"{title},{link},{summary}")
                Next
            End Using
            lblStatus.Text = $"💾 저장 완료: {filePath}"
        Catch ex As Exception
            lblStatus.Text = "❌ 저장 실패: " & ex.Message
        End Try
    End Sub

    Function CleanForCsv(text As String) As String
        If String.IsNullOrEmpty(text) Then Return ""
        text = text.Replace(vbCrLf, " ").Replace(vbLf, " ").Trim()
        If text.Contains(",") Or text.Contains("""") Then
            text = """" & text.Replace("""", """""") & """"
        End If
        Return text
    End Function

    Function ExtractKeywords(text As String) As List(Of String)
        Dim stopWords = {"the", "and", "of", "to", "in", "is", "a", "for", "on"}
        Dim wordCount As New Dictionary(Of String, Integer)
        Dim words = text.ToLower().Split({" "c, ","c, "."c, ":"c}, StringSplitOptions.RemoveEmptyEntries)

        For Each word In words
            If Not stopWords.Contains(word) AndAlso word.Length > 2 Then
                If wordCount.ContainsKey(word) Then
                    wordCount(word) += 1
                Else
                    wordCount.Add(word, 1)
                End If
            End If
        Next

        Return wordCount.OrderByDescending(Function(k) k.Value).Take(10).Select(Function(k) k.Key).ToList()
    End Function
End Class

📊 실행 결과

  • URL 입력 → [뉴스 가져오기] 클릭 → 리스트에 제목들 표시
  • 우측에 상위 키워드 자동 추출
  • [엑셀로 저장] 누르면 .csv로 저장됨

✅ 다음 확장도 가능합니다

확장기능 설명
⏰ 자동 스케줄링 매일 특정 시간에 뉴스 수집
📈 키워드 변화 추적 시간별 키워드 통계 누적
🖼 UI 테마 다크모드, 아이콘, 로딩 애니메이션 등 추가
☁ Google Sheets 연동 클라우드에 직접 저장 가능

 

Imports System.ServiceModel.Syndication 에서 "ServiceModel.Syndication을 찾을 수 없습니다" 오류가 나는 경우


✅ 원인 요약

System.ServiceModel.Syndication 네임스페이스는 .NET Framework 기본 라이브러리에는 일부 포함되어 있지만, 명시적으로 참조 추가가 필요할 수 있습니다.


✅ 해결 방법 (VB.NET WinForms 또는 콘솔 기준)

✔ 방법 1. 참조 수동 추가 (Visual Studio)

  1. 솔루션 탐색기 → 프로젝트 마우스 우클릭 → [참조 추가]
  2. 왼쪽에서 어셈블리 > 프레임워크 선택
  3. 아래 항목을 찾아서 체크합니다:
✔ System.ServiceModel
✔ System.Xml

System.ServiceModel 참조 추가 화면

  1. 확인 → 빌드 다시 실행

✔ 방법 2. NuGet으로 설치 (권장)

NuGet을 사용하면 더 최신 .NET에서도 호환됩니다.

▶ NuGet 패키지 설치 방법:

  1. 메뉴 상단: 도구 > NuGet 패키지 관리자 > 패키지 관리자 콘솔
  2. 아래 명령 입력 후 Enter:
Install-Package System.ServiceModel.Syndication -Version 4.5.0

또는 NuGet 패키지 관리자 UI에서 직접 "System.ServiceModel.Syndication" 검색 → 설치

설치 후 다시 빌드하면 Imports System.ServiceModel.Syndication 오류가 사라집니다.


✅ 주의사항

항목 설명
.NET Framework 4.5 이상 권장 Syndication은 일부 버전에서만 작동합니다
Visual Studio 2019 이상 권장 NuGet 최신 버전 안정성 향상
반응형