데이터사이언스 대학원 생활/TextAnalytics

파이썬 카카오 검색 API 활용 웹스크래핑(2)

데욱 2023. 6. 13. 10:54

파이썬 카카오 검색 API 활용 웹스크래핑 (tistory.com)

 

파이썬 카카오 검색 API 활용 웹스크래핑

카카오 API 사용해서 웹스크래핑 해보기 네이버 만큼 친절하진 않았지만... 그렇다! 우린 카카오 검색 api 를 사용해서 웹스크래핑을 할 수 있다! Kakao Developers Kakao Developers 카카오 API를 활용하여

wookdata.tistory.com

1편에 이은... 2편이다.

지난 시간에는 API를 이용해서 블로그의 타이틀과 링크 데이터를 가져왔다.

 

이번 시간에서는 link에서 WebScraping을 통해 텍스트 데이터를 추출해보자!

 

이런식으로 타이틀과 링크 데이터를 가져왔다.

네이버 블로그 웹스크래핑

## 필요 모듈 import
import re
from bs4 import BeautifulSoup
import urllib.request

## 정규표현식으로 네이버 블로그 링크만 뽑기
p = re.compile('https:\/\/blog\.naver\.com\/[a-zA-Z0-9_-]+\/\d+')
nb_links = p.findall(text)
print(nb_links)

위 코드를 실행 해보자.

카카오 API를 사용해서 가져온 링크 중에서, naver와 관련된 링크들만 뽑아온다! 다음은 블로그 없나;

 

일단 정적 웹스크래핑 시도 해보도록하자.

## beautifulsoup를 활용해 확인

nb_link = nb_links[0]
html = urllib.request.urlopen(nb_link)
bs_obj = BeautifulSoup(html, 'html.parser')
bs_obj

<body>안에 텍스트 내용이 <iframe>에 감춰져있다.

아앗! 네이버 블로그는 정적 웹스크래핑으만으로는 안되나보다!

그래서... 

https://wonhwa.tistory.com/10

 

[python] Naver 오픈API를 이용하여 원하는 검색어로 블로그 크롤링 하기(제목+본문)

오늘은 NAVER API를 이용하여 네이버 블로그 크롤링을 해 보겠습니다 ;) NAVER OPEN API 신청하는 방법은 여기를 클릭해주세요ㅎㅎ step1. 네이버 OPEN API를 이용하여 원하는 검색어로 관련 게시물 불러오

wonhwa.tistory.com

위 블로그를 참조하여 내 입맛대로 코드를 수정하고,  iframe에 있는 텍스트 데이터를 불러왔다.

## 동적 웹스크래핑을 위한 selenium import
from selenium import webdriver
driver = webdriver.Chrome('C://Users//jeauk//chromedriver.exe')
driver.implicitly_wait(3)

## 추가적인 에러 생성 제거를 위한 import
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException, UnexpectedAlertPresentException, NoAlertPresentException
import time

## 웹 드라이버 초기화
driver = webdriver.Chrome()

## 빈 list 생성
contents = []
links = []

# 네이버 블로그 링크 하나씩 불러오기
for i in nb_links:
    driver.get(i)
    time.sleep(3)
    
    ## 블로그 안 본문이 있는 iframe에 접근하기
    try:
        driver.switch_to.frame("mainFrame")
        
    ## 예상치 못한 알림 창이 나타났을 때 프로그램이 중지하는 것을 방지
    except UnexpectedAlertPresentException:
        try:
            alert = driver.switch_to.alert
            alert.accept()
        except NoAlertPresentException:
            pass
        continue
        
    ## 본문 내용 크롤링하기
    try:
        a = driver.find_element(By.CSS_SELECTOR, 'div.se-main-container').text
        contents.append(a)
        links.append(i)
        
    ## NoSuchElement 오류시 예외처리(구버전 블로그에 적용)
    except NoSuchElementException:
        a = driver.find_element(By.CSS_SELECTOR, 'div#content-area').text
        contents.append(a)
        links.append(i)

driver.quit()  # 창닫기
print("<<본문 크롤링이 완료되었습니다.>>")

위 코드를 돌리면 본문 텍스트를 읽어올 수 있다!

참고로 난 본문 텍스트만 모델링 하기위해서 나머지 데이터(타이틀,링크)는 나중에 다 생략했다.

필요하면 코드를 조금만 수정해도 가능하다.

 

## 본문의 \n 제거 (전처리 과정에서 해도 되지만 알아보기 너무 불편했다.)
nb_contents=[]
for i in contents:
    a = i.replace('\n','')
    nb_contents.append(a)
    
import pandas as pd
df = pd.DataFrame({'Text Data':nb_contents})
df

## csv파일로 저장
df.to_csv('test.csv', encoding='utf-8-sig')
# df.to_csv('test.csv', encoding='utf-8')

위 코드를 돌리면 \n을 삭제해서 데이터프레임을 만들고 csv파일로 저장한다!

참으로 간단하죠잉?!

 

이제 한국어 전처리를 해야한다...

이렇게 하면 네이버 블로그 본문 텍스트 데이터를 가져올 수 있다.

tistory는 정적이기 때문에 매우 쉬우므로... 생략하거나 다음 글에 넣도록하겠다. 이상!