Dev.log

데이터 수집(beautifulsoup & Selenium) 및 KCI 크롤러제작 본문

자연어처리

데이터 수집(beautifulsoup & Selenium) 및 KCI 크롤러제작

포켓몬빵 2022. 2. 16. 14:20

안녕하세요. 이번 포스팅에서는 비정형 데이터(텍스트 데이터) 수집에 관해 포스팅을 진행하겠습니다. 비정형 데이터 분석을 진행하기위해 때론 데이터를 특정 웹 사이트로 부터 가져와야하는 일이 발생합니다. 이러한 일은 손으로 가져왔을 경우, 막대한 시간과 노력이 필요하며 대용량의 데이터를 한번에 가져오기란 쉽지 않습니다. 이에 크롤러(crawler)를 통해 데이터를 수집해야하는 일이 발생힙니다.

 

크롤러란?

웹 크롤링, 웹 크롤러는 인터넷 상에 있는 수많은 자료들을 가져와 프로그래밍하기 쉽게, 혹은 데이터 분석하기 쉬운 형태로 가공하는 작업을 의미합니다. 최근 데이터 분석에 대한 수요가 증가하고 이에 따라 자료를 얻는 원천으로 웹을 자주 드는데요, 이 웹을 가져와서 데이터 분석을 할 수 있는 자료의 형태로 바꾸는 것이 바로 크롤링입니다.

 

웹크롤링 파이썬 패키지

1. beautifulsoup

웹사이트에 표시된 대부분의 데이터는 html의 형태로 이루어져있습니다. 이에 html의 요소에 접근할수 있도록 도와주는 패키지가 beautifulsoup입니다. 아나콘다프롬포트(Anacondo prompt)를 실행시킨후 간단하게 아래의 명령어를 통해 설치할수 있습니다.

$pip install beautifulsoup4

 

이제 간단하게 beautifulsoup 패키지를 활용해서 웹페이지에 존재하는 정보를 추출해 보도록 하겠습니다.

먼저, html의 정보를 가져오기 위한 방법중 하나로 request 라이브러리를 활용할 수 있습니다.

설치의 경우 beautifulsoup 설치와 동일하게 pip 명령어를 통해 설치 할 수 있습니다.

$ pip install request

이제 간단하게 beautifulsoup과 request를 통해 아래의 웹페이지에서 논문의 제목을 추출해 보겠습니다.

 

import requests
from bs4 import BeautifulSoup

url = 'https://www.kci.go.kr/kciportal/ci/sereArticleSearch/ciSereArtiView.kci?sereArticleSearchBean.artiId=ART002678099'
response = requests.get(url)
html = response.text

soup = BeautifulSoup(html, 'html.parser')
soup.find('strong', id = 'artiTitle').text

상기의 코드를 실행한뒤, 결과값을 확인해보면 '인공지능 철학 국내연구 동향 분석 —인공지능 철학의 생장점에서—' 가 올바르게 추출된것을 확인할수 있습니다.

 

2. selenium

Beautifulsoup만으로는 모든 사이트의 정보를 가져올 수 없습니다. 정확이 말하자면 javascript를 활용한 동적으로 정보를 생성하는 사이트의 경우 selenium 패키지를 활용하여 웹 크롤링을 진행해 주어야 합니다.  Selenium은 자동화 테스트를 위해 여러 가지 기능을 지원합니다. Beautifulsoup은 웹사이트에서 버튼을 클릭해야 얻을 수 있는 데이터라던가, Javascript 에 조건이 충족되어야만 얻을 수 있는 데이터에 접근하는 것에 한계가 있습니다. 그래서, 직접적으로 웹 사이트에 접근할 수 있게 해주는 Selenium을 사용해야 합니다. 새로운 환경에서 웹 브라우저를 대신해 줄 웹드라이버가 필요합니다. 웹 드라이버를 눌러 설치를 합시다. 웹 드라이버는 Selenium이 사용할 웹 브라우저이고, Selenium으로 자동화하여 웹사이트를 조작하시면 됩니다. 웹드라이버의 경우 대표적으로 chrome, firefox. safari 등이 있는데, 필자는 크롬을 추천합니다. 크롬웹드라이버의 경우 아래의 링크에서 다운로드 받을 수 있습니다.

sites.google.com/a/chromium.org/chromedriver/downloads

 

Downloads - ChromeDriver - WebDriver for Chrome

WebDriver for Chrome

sites.google.com

이때 크롬 웹드라이버의 경우 자신의 크롬버전과 일치해야하며 크롬버전의 경우 브라우저의 오른쪽 끝의 '더보기 > 도움말 > 크롬정보' 에서 확인 할 수 있습니다.

Selenium 역시 bs4와 동일하게 아나콘드 프롬포트상에서 pip 명령어를 통해 설치 할 수 있습니다.

$ pip install selenium

웹크롤링을 통해 KCI 서지정보 추출하기

먼저 KCI 서지정보 추출을 위한 패키지를 설치해주도록 합시다.

! pip install pandas selenium tqdm beautifulsoup4 requests
#-*-coding:utf-8-*-
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

import pandas as pd
import time
import re
import os
import datetime


download_path = os.getcwd()+'/kci'
try: 
    if not os.path.exists(download_path):
        os.makedirs(download_path) 
except OSError:
    print("Error: {} 생성 불가".format(path))
    
    
options = webdriver.ChromeOptions()
options.add_experimental_option("prefs", {
  "download.default_directory": download_path,
  "download.prompt_for_download": False,
  "download.directory_upgrade": True,
  "safebrowsing.enabled": True
})


items_source = driver.page_source
soup = BeautifulSoup(items_source, 'html.parser')
linkLi = []

# 논문제목, 저자, 퍼블리셔, 저널명,볼륨,날짜,초록
titleL = []
authorL = []
publisherL = []
yearL = []
abstractL = []

for link in soup.findAll('a', {'class': 'subject'}):
    try:
        links = (link['href'])
        linkLi.append(links)
    except KeyError:
        pass

for i in range(len(linkLi)):
    baseURL = 'https://www.kci.go.kr/'+ linkLi[i]
    driver.get(baseURL)
    items_sources = driver.page_source
    soup2 = BeautifulSoup(items_sources, 'html.parser')
    
    try:
        title = soup2.find('strong',id = 'artiTitle').text
    except: title = ''
    
    try:
        abstract = soup2.find('p',id = 'korAbst').text
    except : abstract = ''    
    
    try:
        author = soup2.find('div','author').find('a').text
        authors = re.sub('[\t\\n]','',author)
    except : author = ''
    
    try:
        year = soup2.find('p','vol').text
        years = re.sub('[\t\\n]','',year)[0:4]
    except: year = ''
    
    try : 
        publisher = soup2.find('p','pub').find('a').text
    except: publisher = ''
    
    titleL.append(title)
    abstractL.append(abstract)
    authorL.append(authors)
    yearL.append(years)
    publisherL.append(publisher)

resultDict = dict(title = titleL,
                  abstract = abstractL,
                  author = authorL,
                  year = yearL,
                  publisher = publisherL)
                  
                  
 df = pd.DataFrame(resultDict)
df.to_csv('/Users/Downloads/Crawler_KCI/환경.csv')

 

'자연어처리' 카테고리의 다른 글

토픽모델링이란  (0) 2022.03.03
Latent Dirichlet Allocation(LDA)  (0) 2022.02.19
Word2Vec  (0) 2022.02.18
자연어 처리의 Preprocessing  (0) 2022.02.18
LSTM을 활용한 영문 트위터 감성분석 모델  (0) 2021.02.06
Comments