나의 목표 : 특정 기간 동안 작성된, 특정 키워드로 검색했을 때 나오는 블로그 글 크롤링하기
일단 시행착오부터 설명하겠다. 나는 우선 이 네이버 블로그 화면 검색 결과를 크롤링하고자 했다.
이전에 Beatiful Soup로 크롤링을 해봤으니 어렵지 않을 거라고 생각했으나... 네이버에서 크롤링을 막아둔 것인지 BS로는 크롤링 불가
내 추측으론 angular로 무언가 해서,, 어찌저찌 막아둔 것 같은데,, 이거 해결하려고 node js 기반 puppeteer까지 시도했으나 해결이 안 됐다 (2주 전 일이라 왜 해결이 안 됐는지 기억이 안 남. . .)

아 그러면 네이버 블로그 화면 말고.. 통합검색 -> VIEW -> 블로그 결과를 크롤링 해야겠다고 생각했으나
몰랐는데 VIEW 화면이 무한 스크롤이었다.
이러나저러나 selenium을 써야하는구나~
결국 selenium으로 해결
STEP 1. 검색 결과로 나온 페이지 돌면서 제목, 날짜, url 을 dataframe으로 저장해두기
from turtle import title
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import time
import pandas as pd
driver = webdriver.Chrome("./chromedriver")
title_list = []
link_list = []
date_list = []
content_list = []
#1페이지부터 569페이지까지 크롤링
for page_num in range(1, 570):
url = f'https://section.blog.naver.com/Search/Post.naver?pageNo={page_num}&rangeType=PERIOD&orderBy=sim&startDate=2021-12-01&endDate=2022-01-31&keyword=%EC%97%B0%EB%A7%90%EA%B2%B0%EC%82%B0'
driver.get(url)
time.sleep(0.5)
for n in range(1, 8):
#제목 포함한 요소 추출
element = driver.find_element(By.XPATH, f'//*[@id="content"]/section/div[2]/div[{n}]/div/div[1]/div[1]/a[1]')
#제목 리스트에 추가
title_list.append(element.text)
#링크(url) 리스트에 추가
link_list.append(element.get_attribute('href'))
#날짜 리스트에 추가
date = driver.find_element(By.XPATH, f'//*[@id="content"]/section/div[2]/div[{n}]/div/div[1]/div[2]/span[2]')
date_list.append(date.text)
#일단 dataframe으로 만들고 csv로 저장해두기
df = pd.DataFrame({'title':title_list, 'link':link_list, 'date':date_list})
df.to_csv("links.csv")
* 후반 페이지에는 유의미한 블로그 글이 거의 나오지 않아 569페이지까지만 크롤링 함.
STEP 2. 저장해 둔 csv 파일의 url을 돌면서 dataframe에 블로그 내용 추가하기
from turtle import title
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import time
import pandas as pd
driver = webdriver.Chrome("./chromedriver")
df = pd.read_csv('links.csv')
link_list = df['link']
content_list = []
for url in link_list: # 수집한 url 만큼 반복
driver.get(url) # 해당 url로 이동
content_total = ""
try:
driver.switch_to.frame('mainFrame')
except: #비공개 글로 인한 에러 생길 경우에 대비
content_list.append("")
continue
overlays = ".se-component.se-text.se-l-default" # 내용 크롤링
contents = driver.find_elements(By.CSS_SELECTOR, overlays)
for content in contents:
content_total = content_total + content.text
content_list.append(content_total)
df['contents'] = content_list
df.to_csv("blog.csv")
* 이 과정은 수집하려는 블로그가 많을수록 굉장히 오래 걸리므로 꼭!!! 화면이 자동으로 꺼지지 않도록 설정해두자.
크롤링 돌아가는 건 노트북이 활동으로 인지하지 않아 시간이 지나면 화면이 자동으로 꺼지고, 크롤링도 멈추게 된다.
최종 결과물
7전 8기 끝에 얻은 결과물
총 3982개의 블로그 글을 수집했다.
시간은 2시간 좀 넘게 걸렸다.

전반적으로 이 블로그를 많이 참고했다.
selenium 초반에 삽질할 때 이 블로그를 만났으면 더 빨리 끝낼 수 있었을 듯,,
https://yong0810.tistory.com/46
[python] 네이버 블로그 크롤링 및 분석하기 (1)
부탁을 받아서 네이버에서 특정 키워드를 검색하고, 블로그에서 나온 자료를 크롤링 한 뒤 분석하는 걸 하게됐다. python selenium webdriver를 사용해서 특정 키워드를 검색하고, 블로그 본문 내용을
yong0810.tistory.com
'개발과 데이터' 카테고리의 다른 글
[데이터 분석] SNS 데이터로 사용자 니즈 파악하기 대작전 (0) | 2022.10.24 |
---|