□ 목적
○ 네이버 뷰에 게시글별 제목, 작성자, 해당글의 링크 데이터를 추출해보자
□ 고려사항
○ 입력한 키워드에 따른, 관련 키워드 뷰 페이지에서 크롤링하도록 구현
○ 네이버는 수시로 데이터가 포함된 태그값들이 변화됨
○ 이 부분을 고려하여 적절한 예외처리를 진행하여 오류가 발생되도 멈추지 않고 코드가 실행되도록 코딩
□ 참고사항
○ .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 |