### 기본적인 Python을 활용한 웹 크롤링 ###
* 정적 크롤링 ( 한 페이지 안에 원하는 정보가 모두 드러남 )
-- 필요한 패키지
# 형태소 분석
import nltk
from konlpy.tag import Kkma
from konlpy.tag import Okt
# wordcloud
import matplotlib.pyplot as plt
from wordcloud import WordCloud
from wordcloud import STOPWORDS
import numpy as np
from PIL import Image
from wordcloud import ImageColorGenerator
# web crawling
import requests
from bs4 import BeautifulSoup
# 네이버 뉴스 기사 제목 추출
date='20220329'
news_title_url ='https://news.naver.com/main/ranking/popularDay.nhn?date={}'.format(date)
# url의 f12 html코드를 확인했을 때의 header정보
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36'}
# 해당 url의 header정보를 request
req_news = requests.get(news_title_url, headers = headers)
# request로 얻은 text를 html -> python으로 파싱
soup = BeautifulSoup(req_news.text, 'html.parser')
# ~밑에 ~ 밑에 ~ 밑에 ~ 밑에로 a태그까지 내려가 데이터 저장
news_titles = soup.select('.rankingnews_box > ul > li > div > a')
# 기사 제목을 리스트에 저장하기
multi_title = []
for i in range(len(news_titles)):
multi_title.append(news_titles[i].text)
print(i+1, news_titles[i].text)
#문장연결하기
title = "".join(multi_title)
stop_title = title.replace('\n',' '.replace('.', ' ').replace(',',' ').replace('"',' ').replace("'"," ").replace('=',' '))
stop_title
* 동적 크롤링 ( 입력, 클릭, 로그인 같은 활동이 있어야 데이터 확인 가능 )
- chromedriver 설치
https://chancoding.tistory.com/136
import pandas as pd
import numpy as np
import time
from selenium import webdriver # !pip install selenium
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless') # 웹드라이버를 브라우저 없이 실행하겠다
chrome_options.add_argument('--no-sandbox') # 보안기능 sandbox를 비활성화
chrome_options.add_argument('--disable-dev-shm-usage') # dev~를 사용하지 않겠다 , 공유메모리 담당
driver = webdriver.Chrome('chromedriver',chrome_options=chrome_options)
# 신의탑 네이버 웹툰 댓글 분석
driver.get("https://comic.naver.com/webtoon/list?titleId=183559&weekday=mon") # 신의탑
data = pd.DataFrame(data=[], columns=['회차','날짜','이름','아이디','댓글'])
from selenium.webdriver.common.by import By
def collector(driver, data, k):
driver = webdriver.Chrome('chromedriver',options=chrome_options)
#수집하고자 하는 웹툰 회차의 URL 활용
url = 'https://comic.naver.com/webtoon/detail?titleId=183559&no='+str(k)
# str(k)는 지정한 회차의댓글을 수집. (ex. 1회~ 140회까지) 7회면 7을 입력
driver.get(url)
time.sleep(2)
#해당 프레임으로 이동
driver.switch_to.frame('commentIframe')
num = k
names = driver.find_elements(by=By.CSS_SELECTOR, value='.u_cbox_nick')
dates = driver.find_elements(by=By.CSS_SELECTOR, value='.u_cbox_date')
user_ids = driver.find_elements(by=By.CSS_SELECTOR, value='.u_cbox_id')
reviews = driver.find_elements(by=By.CSS_SELECTOR, value='.u_cbox_contents')
for i in range(15): # best댓글 15개
temp = []
#요소를 추가하는 코드
temp.append(num-1)
temp.append(dates[i].text)
temp.append(names[i].text)
temp.append(user_ids[i].text)
temp.append(reviews[i].text)
temp = pd.DataFrame(data=[temp], columns=data.columns)
#여러 범위 또는 문자열의 텍스트를 결합
data = pd.concat([data,temp])
driver.close()
print(str(num-1) + '화 베스트 댓글 수집 끝')
return data
# 신의탑 1화 ~ 10화 까지 댓글
for k in range(2,12):
data = collector(driver, data, k)
-- 위와 같은 크롤링을 통해 웹 페이지의 리뷰 분석을 진행할 수 있다!! ( wordcloud, 형태소 분석 등 ~ ) --
'프로그래밍 > Python' 카테고리의 다른 글
[Python] create_lmdb_dataset.py error 해결 (0) | 2022.12.26 |
---|---|
[Python] WordCloud (0) | 2022.04.03 |
[Python] 입력값이 잘못됐을 때 코드를 다시 실행해보자 (0) | 2022.01.09 |
댓글