1 분 소요

네이버 open api으로 한강 나들이 블로그 포스팅 내용 50개를 크롤링하고, 유튜브 동영상 댓글과 추천수 크롤링하기
네이버 open api 웹사이트 : https://developers.naver.com/main/

import urllib.request
import requests

Id = str(input('오픈api Id 입력: '))
password = str(input('오픈api 비번 입력: '))
text = input('블로그 검색어 입력: ')
txt = urllib.parse.quote(text)
num =  input("출력결과 개수: ")

open_api = 'https://openapi.naver.com/v1/search/blog?query=' + txt + "&display=" + num
header_params = {'X-Naver-Client-Id' : Id, 'X-Naver-Client-Secret' : password}
res = requests.get(open_api, headers = header_params)

data = res.json()



블로그 검색어 입력: 미세먼지 경보 한강 나들이
출력결과 개수: 50

블로그 포스팅 링크 가져오기

links = []

for _ in range(len(data['items'])):
    links.append(data['items'][_]['link'])

크롬드라이버 가상환경 설치

import time
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

# chromedriver 설치
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.implicitly_wait(2)

각각 링크의 블로그 포스팅에 들어가 본문 df에 저장

from tqdm import tqdm
from selenium.webdriver.common.by import By

blog_posts = []

for _ in tqdm(links):
    driver.get(_)
    time.sleep(1)
    
    driver.switch_to.frame('mainFrame')
    
    try:
        post = driver.find_element(By.CSS_SELECTOR, 'div.se-main-container').text
        blog_posts.append(post.replace('\n', ' '))
    except:
        post = driver.find_element(By.CSS_SELECTOR, 'div#content-area').text
        blog_posts.append(post.replace('\n', ' '))
        
driver.quit()

import pandas as pd
df = pd.DataFrame({'blog' : blog_posts})
df

유튜브 동영상 댓글 크롤링

import time
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

# chromedriver 설치
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.implicitly_wait(2)

동영상 댓글 cnt만큼 스크롤해 새로고침 이후 comment, likes 리스트에 append

from bs4 import BeautifulSoup

# 동영상 ㄹ이크
url = 'https://www.youtube.com/watch?v=iV6k4CNS3Hw'
driver.get(url)

# 0 -> 600만큼 스크롤
time.sleep(3)
driver.execute_script("window.scrollTo(0, 600)") 
time.sleep(1)

# 스크롤 다시 원위치
height = driver.execute_script("return document.documentElement.scrollHeight")
cnt = 0

# cnt만큼 코드 진행
while cnt < 10:
    driver.execute_script("window.scrollTo(300, document.documentElement.scrollHeight);")
    time.sleep(2)
    new_height = driver.execute_script("return document.documentElement.scrollHeight")
    
    # 종점에 다다랐으면 종료
    if new_height == height:
        break
    height = new_height
    cnt += 1
    
html_source = driver.page_source

# bs4으로 댓글, 추천수 크롤링
soup = BeautifulSoup(html_source, 'html.parser')

comments = soup.select('yt-formatted-string#content-text')
likes = soup.select('div#toolbar > span')

driver.quit()

전처리 후 df에 할당

import pandas as pd

yt_comments = []
yt_likes = []

for _ in range(len(comments)):
    tmp_c = str(comments[_].text)
    tmp_c = tmp_c.replace('\n', '')
    tmp_c = tmp_c.replace("\t", '')
    tmp_c = tmp_c.replace('               ', '')
    yt_comments.append(tmp_c)
    
    tmp_l = str(likes[_].text.strip(' '))
    tmp_l = tmp_l.replace('\n', '')
    yt_likes.append(tmp_l)
    
df = pd.DataFrame({'comment' : yt_comments, 'likes' : yt_likes})  

댓글남기기