업무 자동화를 위해 데이터를 수집하고 분류하는 일을 가장 먼저 처리해야 하는데요. 파이썬을 이용한 크롤링 방법이 많이 있지만, 일상에서 사용하기는 쉽지 않은데요. 오늘은 사무실에서 자주 사용하는 엑셀 VBA를 이용한 네이버 뉴스 크롤링하는 방법을 알아보겠습니다. 오늘 작성한 엑셀 파일은 맨 아래에 있으니 다운로드 받으시기 바랍니다.
1. html 코드 분석하기
네이버 뉴스와 같은 웹페이지를 크롤링하기 위해서는 가장 먼저 웹 페이지의 구조를 파악해야 합니다. 크롤링은 해당 웹 문서의 html 구조를 파악하고 수집하고자 하는 데이터의 위치를 알아야 합니다. 기본적으로 웹에는 ID, 클래스, 태그 등으로 구성되어있습니다. 이런 html의 구조를 파악하기가 쉽지 않은데요. 오늘은 기본 구조를 잘 모르더라도 챗지피티(ChatGPT)를 이용하여 구조를 파악하고 원하는 데이터를 크롤링하는 방법을 알아보겠습니다.
1) 네이버 뉴스 html 코드 분석하기
크롬 브라우저에서 F12키를 누르면 개발자 도구가 활성화되는데요. 아래 그림과 같이 개발자 도구의 왼쪽 상단에 있는 화살표 아이콘을 클릭합니다. 그런 다음 네이버 뉴스에서 기사 제목, 내용 등이 포함되도록 영역을 선택합니다. 아래 그림은 네이버 뉴스에서 삼성전자를 검색하였을 때 가장 상단에 위치한 뉴스를 선택하였습니다. 화면에서 선택한 기사의 html 코드는 개발자 도구에서 표시되는데요. “<li class=”bx” id=”sp_nws1″>”라는 코드가 선택되는 것을 확인할 수 있습니다.
2) 해당 html 코드 복사하기
위에서 기사를 선택했을 때 “<li class=”bx” id=”sp_nws1″>”라는 코드가 선택되는 것을 확인했다면 해당 코드를 선택하고 마우스 오른쪽을 클릭합니다. 상단에” copy”를 선택하고 “Copy Element” 선택하면 해당 html 코드가 복사할 수 있습니다.
3) 챗지피티(ChatGPT)로 html 코드 분석하기
위에서 복사한 html 코드를 챗지피티를 이용하여 분석하겠습니다. 우선 프롬프트를 입력하고 복사한 html 코드를 붙여넣기합니다. 사용한 프롬프트는 “아래 코드에 대한 정보를 크롤링 하려고 한다. 크롤링을 위한 ID, 클래스, 태그를 분석해서 알려줘” 입니다. 프롬프트에 대한 답변은 상황에 따라 다를 수 있으니 참고하세요.
4) 분석한 클래스, 태그 정보
ChatGPT를 이용하여 각 클래스와 태그 정보를 확인할 수 있는데요. 오늘 네이버 뉴스에서 기사 제목, 출처, 본문 내용, 해당 기사 링크를 추출하기 위한 클래스와 태그 정보는 아래와 같습니다. 이제 해당 클래스와 태그에 대한 정보를 토대로 VBA를 이용하여 엑셀에 기록할 수 있는 코드를 작성할 수 있습니다.
(1) 뉴스 제목 (news_tit 클래스):
- 클래스: news_tit
- 속성: title (뉴스 제목 텍스트)
- 링크: href 속성 (뉴스 원본 링크)
(2) 뉴스 출처 (언론사 이름, press 클래스):
- 클래스: info press
- 속성: href (언론사 URL)
- 텍스트: 언론사 이름 (예: 연합뉴스)
(3) 뉴스 본문 (api_txt_lines dsc_txt_wrap 클래스):
- 클래스: api_txt_lines dsc_txt_wrap
- 링크: href (본문 링크)
- 텍스트: 뉴스 요약 (본문 텍스트)
2. 네이버 뉴스 크롤링을 위한 VBA 코드 작성하기
네이버 뉴스 크롤링을 위해 클래스, 태그를 알아냈다면, VBA 코드를 작성하여 원하는 정보를 추출할 수 있습니다. 예를 들어 뉴스 제목의 클래스인 “news_tit”에 있는 텍스트를 추출하면 제목이 추출됩니다. 추출된 정보를 엑셀 시트의 원하는 위치에 기록하는 과정을 거치면, 뉴스 제목을 크롤링할 수 있습니다. 이와 같은 방식으로 제목, 기사 링크, 출처, 기사 내용 등을 크롤링할 수 있습니다.
네이버 뉴스는 한 페이지에 10개의 기사가 있는데요. 변수 “i”는 0 ~ 9 까지 10개의 기사를 추출하도록 코드를 작성하였습니다. 시작 번호가 “0”으로 시작한다는 점 꼭 확인하시기 바랍니다. 또한 시작 페이지와 마지막 페이지를 지정하여 네이버 뉴스의 정보를 크롤링 하도록 코드를 작성했습니다. “Start = 10 * Page – 9” 코드는 페이지를 구분하기 위한 수식인데요. 페이지에 1이 대입되면 1페이지의 정보를 크롤링하며, 페이지의 숫자가 증가하면 해당 페이지의 뉴스 기사를 크롤링합니다.
1) 전체 코드
전체 코드는 아래와 같습니다. 이해가 되지 않는 부분이 있다면, ChatGPT를 이용하여 해석을 요청하면 알기 쉽게 설명해줍니다. 총 3개의 파트로 초기화, 크롤링, 웹 페이지 접속으로 나누어져 있습니다.
Sub 초기화()
Range("5:1048576").ClearContents
End Sub
Sub 검색()
Dim r As Long
Dim 키워드 As String
Dim Page As Integer
Dim Start As Integer
Dim i As Integer
Dim doc As Object
Dim newsTitle As String
Dim summary As String
Dim press As String
Dim updateTime As String
Dim newsLink As String
r = 5
키워드 = Range("A2").Value
' B1과 B2 셀의 값을 Page 변수로 사용
For Page = Range("c1").Value To Range("c2").Value
Start = 10 * Page - 9
Set doc = GetDocumentByURL("https://search.naver.com/search.naver?where=news&sm=tab_jum&query=" & 키워드 & "&start=" & Start)
For i = 0 To 9
On Error Resume Next
' 뉴스 제목 크롤링
newsTitle = doc.querySelectorAll(".news_tit").Item(i).innerText
newsLink = doc.querySelectorAll(".news_tit").Item(i).getAttribute("href") ' 뉴스 링크 추출
Cells(r, 1).Value = newsTitle
' 링크를 하이퍼링크로 추가
If newsLink <> "" Then
Cells(r, 4).Hyperlinks.Add Anchor:=Cells(r, 4), Address:=newsLink, TextToDisplay:=newsLink
End If
' 요약 크롤링
summary = doc.querySelectorAll(".api_txt_lines").Item(i).innerText
Cells(r, 2).Value = summary
' 언론사 크롤링 (info.press 클래스 내부 텍스트 가져오기)
press = doc.querySelectorAll(".info.press").Item(i).innerText
Cells(r, 3).Value = press
Rows(r).Select
DoEvents
r = r + 1
Next i
Next Page
End Sub
Function GetDocumentByURL(URL)
Set winHttp = CreateObject("WinHttp.WinHttpRequest.5.1")
Set document = CreateObject("Htmlfile")
winHttp.Open "GET", URL, False
' User-Agent
winHttp.SetRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
' Accept 헤더 설정
winHttp.SetRequestHeader "Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8"
winHttp.send
document.body.innerhtml = winHttp.responsetext
Set GetDocumentByURL = document
End Function
3. 코드 실행 및 사용방법
① 검색할 뉴스 기사의 키워드를 “A2” 셀에 입력합니다.
② “C1″셀에 시작 페이지, “C2” 셀에 마지막 페이지 번호를 입력합니다.
③ 검색 버튼을 클릭하면 해당 키워드의 기사가 크롤링 됩니다.
④ 초기화 버튼을 누르면 크롤링 된 정보가 모두 초기화됩니다.