1. IT 관련 기사를 스크래핑
네이버 IT 카페고리 뉴스 기사의 헤드라인 뉴스를 뽑는다
https://news.naver.com/main/main.naver?mode=LSD&mid=shm&sid1=105
태그 추출은 지난 블로그를 토대로 진행한다.
2024.01.13 - [Python] - 웹 스크래핑으로 뉴스 기사 링크 받아오기
2. 스크랩한 날짜, 기사 제목, 기사 링크, 기사 내용을 엑셀에 넣는다
1. 필요 라이브러리 임포트
#셀레니움 관련 라이브러리
from selenium import webdriver
from selenium.webdriver.common.by import By
#엑셀 관련 라이브러리
from openpyxl import Workbook, load_workbook
import os
#날짜 관련 라이브러리
import datetime
2. 크롬 웹드라이버 생성
driver = webdriver.Chrome()
driver.implicitly_wait(3)
driver.get("https://news.naver.com/main/main.naver?mode=LSD&mid=shm&sid1=105")
3. 엑셀 워크북 생성/불러오기
#경로에 파일이 없다면
if not os.path.isfile("경로/뉴스.xlsx"):
#엑셀 워크북 생성
wb = Workbook(write_only=True)
ws = wb.create_sheet('IT 뉴스')
#날짜, 뉴스 기사 제목, 링크, 본문 내용
ws.append(['날짜', '뉴스 제목', '링크', '본문 내용'])
#경로에 파일이 있다면
else:
wb = load_workbook('경로/뉴스.xlsx')
ws = wb['IT 뉴스']
if not os.path.isfile() 사용
4. 숨겨진 헤드라인 뉴스가 있기 때문에 더보기 버튼 클릭
#헤드라인 뉴스 더보기 클릭
driver.find_element(By.CSS_SELECTOR, 'a.cluster_more_inner').click()
5. 스크롤을 하기
(더보기 버튼을 클릭해서 맨 위의 헤드라인 뉴스 기사가 화면을 벗어나기 때문에)
driver.execute_script('window.scrollTo(0,0)')
6. 8개의 헤드라인 뉴스 수집
혹시 모를 오류를 위해 예외처리를 한다
#8개 헤드라인 뉴스 수집
for num in range(len(driver.find_elements(By.CSS_SELECTOR, 'li.sh_item div.sh_text>a'))):
#기사 보기
try:
news = driver.find_elements(By.CSS_SELECTOR, 'li.sh_item div.sh_text>a')[num]
#기사 제목
title = news.text
#print(title)
#기사 링크
link = news.get_attribute('href')
#print(link)
#기사 본문 클릭
news.click()
content = driver.find_element(By.CSS_SELECTOR, 'article#dic_area').text
#print(content)
#엑셀에 넣기
ws.append([date, title, link, content])
#뒤로 가기
driver.back()
except:
pass
7. 웹드라이버 종료 및 엑셀 저장
driver.quit()
wb.save('뉴스.xlsx')
결과
오류 프로파일링
1. ElementClickInterceptedException 오류
더보기 클릭 후 첫 번째 요소(첫 번째 기사)를 클릭하려고 할 때 오류 발생
이유: 요소가 가려지거나, 화면을 벗어나기 때문에
https://wise-office-worker.tistory.com/63
해결법 -> 요소를 클릭할 수 있도록 스크롤을 한다
저는 맨 위로 스크롤 하여 첫 번째 요소를 화면에 보여주는 방법으로 해결했습니다
driver.execute_script('window.scrollTo(0,0)')
2. StaleElementReferenceException 오류
오류 코드
for news in headline_news:
#기사 제목
title = news.text
#기사 링크
link = news.get_attribute('href')
#기사 본문 클릭
news.click()
content = driver.find_element(By.CSS_SELECTOR, 'article#dic_area').text
#뒤로 가기
driver.back()
새 탭이 생기지 않고, 원래 탭에서 다른 사이트가 나타날 때 driver.back()으로 다시 돌아오면
for문이 제대로 동작하지 않는다(새로고침도)
이유: driver.back()을 할 경우 기존에 가지고 있던 요소 정보를 잃어 버리기 때문!
해결법 -> 요소를 다시 찾아야 한다
저는 for문을 find_elements의 길이만큼 돌고, 인덱스를 사용하는 방법으로 해결했습니다
# 길이만큼
for num in range(len(driver.find_elements(By.CSS_SELECTOR, 'li.sh_item div.sh_text>a'))):
# find_elements() 다시 하고, index로 접근
news = driver.find_elements(By.CSS_SELECTOR, 'li.sh_item div.sh_text>a')[num]
+ 그 외 셀레니움을 사용하면서 만나는 오류들
https://cat-minzzi.tistory.com/28
try, except 문을 잘 활용합시다!
'Python' 카테고리의 다른 글
[Python] 힙 (1) | 2024.02.05 |
---|---|
웹 스크래핑으로 인기 급상승 동영상 데이터 저장하기 (1) | 2024.01.22 |
Selenium 사용하여 웹 자동화하기2 (1) | 2024.01.16 |
Selenium 사용하여 웹 자동화하기1 (0) | 2024.01.15 |
웹 스크래핑으로 뉴스 기사 링크 받아오기 (0) | 2024.01.13 |