본문 바로가기
Python/Python_Crawling

네이버 뷰 크롤링 : 제목, 작성자, 링크 + 예외처리

by Mr.DonyStark 2024. 1. 30.

□ 목적

  ○ 네이버 뷰에 게시글별 제목, 작성자, 해당글의 링크 데이터를 추출해보자

 고려사항

  ○ 입력한 키워드에 따른, 관련 키워드 뷰 페이지에서 크롤링하도록 구현

  ○ 네이버는 수시로 데이터가 포함된 태그값들이 변화됨

  ○ 이 부분을 고려하여 적절한 예외처리를 진행하여 오류가 발생되도 멈추지 않고 코드가 실행되도록 코딩

 참고사항

  ○ .get_text() 와 .text 차이
     - .get_text() 메서드는 BeautifulSoup에서 제공하는 메서드로, HTML 요소의 모든 텍스트를 추출. 이 메서드는 해당 요소의 모든 자식 요소의 텍스트를 합쳐서 반환. 예를 들어, [ <p>이것은 <b>굵은</b> 텍스트입니다.</p> ]에서 .get_text()를 호출하면 "이것은 굵은 텍스트입니다."를 반환.

     -  .text 속성은 BeautifulSoup에서 제공하는 속성으로, 특정 HTML 요소의 직접적인 텍스트만을 반환. 자식 요소의 텍스트는 고려하지않음. 예를 들어, [ <p>이것은 <b>굵은</b> 텍스트입니다.</p> ]에서 .text를 호출하면 "이것은 텍스트입니다."를 반환.

# 라이브러리 호출
import requests
from bs4 import BeautifulSoup

# 검색어 입력
search_word = input('검색어를 입력해주세요\t:\t')

# 크롤링 페이지 입력
# 네이버뷰 주소 + 검색키워드
target_url = 'https://search.naver.com/search.naver?where=view&sm=tab_jum&query=' + search_word
print(f'접속페이지\t:\t{target_url}')

# 데이터 요청
req_get_url = requests.get(target_url) #검색어관련 뷰 페이지에 데이터 request 및 get 요청  
get_html = req_get_url.text  #get한 데이터를 텍스트로 받음
parser_soup = BeautifulSoup(get_html, 'html.parser') #BeautifulSoup 을 활용해 html.parser로 데이터 구분

# select를 활용하여 태그값에 해당하는 모든 값을 리스트화로 가져옴
raw_data = parser_soup.select('div.view_wrap')

for index, v in enumerate(raw_data):
    index += 1
    
    user_data = v.select_one('a.name').text   #▶▷▶▷▶▷ 뷰 게시글 작성자 추출
    try: #제목 태그를 의미하는 .title_link._cross_trigger 가 None이면, 제목을 의미하는 다른 태그인 .title_link 로 데이터 추출. 그 외 다른 태그값으로 인하여 None 발생을 통한 오류가 생기면 '제목없음'으로 오류 예외처리 진행
        title_data = v.select_one('.title_link._cross_trigger').text.replace('\n','').replace('\t',' ')   #▶▷▶▷▶▷ 뷰 게시글 제목① 추출
        if title_data == None:
            title_data = v.select_one('.title_link').text.replace('\n','').replace('\t',' ')   #▶▷▶▷▶▷ 뷰 게시글 제목② 추출
    except:
        title_data = '제목없음'
    
    try: #링크 속성를 의미하는 data-url이 없어 오류가 발생하면 예외처리를 진행하여 다른 속성 값인 href로 처리 후 데이터 추출.
        link_data = v.select_one('a')['data-url']   #▶▷▶▷▶▷ 뷰 게시글 링크① 추출  +  a태그의 data-url 속성 추출
        if link_data == None:
            link_data = v.select_one('a')['href']
    except:
        link_data = '링크없음'

    print(f'●○●○●○●○ {index} 번째 게시글\n사용자명\t:\t{user_data}\n게시글 제목\t:\t{title_data}\n링크\t:\t{link_data}')
print(f'총 개수\t:\t{index}') #총개수 출력

'Python > Python_Crawling' 카테고리의 다른 글

.text 와 .string 차이점(보완)  (0) 2024.02.02
크롤링 : 멜론  (0) 2024.02.02
특정 영역의 하위태그별 데이터 크롤링  (0) 2024.01.28
공공데이터 포탈 API  (0) 2024.01.22
네이버 API : 데이터 엑셀저장  (0) 2024.01.21