본문 바로가기
프로그래밍/Python

[Python] 웹 크롤링 ( Web Crawling )

by rahites 2022. 4. 3.

 

### 기본적인 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 

 

[파이썬] Selenium 셀레니움 설치하기 / 크롬 드라이버 설치하기

목차 1. Python Selenium 설치하기 다른 라이브러리를 설치하는 것과 동일합니다. pip 또는 conda 명령어를 사용해서 설치해주세요. pip install selenium conda install selenium 2. Chrome Driver 설치하기 Sele..

chancoding.tistory.com

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, 형태소 분석 등 ~ ) --

댓글