[study] Crawling
네이버 open api으로 한강 나들이 블로그 포스팅 내용 50개를 크롤링하고, 유튜브 동영상 댓글과 추천수 크롤링하기
네이버 open api 웹사이트 : https://developers.naver.com/main/
Naver open api으로 블로그 포스팅 내용 가져오기
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})
댓글남기기