본문 바로가기

참가 후기

Ask Company 대전 세미나 참가 후기

5월 19일 대전광역시 한남대학교에서 열린 Ask Company 파이썬 세미나에 다녀온 후기를 적어보고자 한다.

왠지 한남대학교의 모습은 고등학교를 보는 듯 했다.

약 3시간 정도 진행된 짧은 세미나기에 많은 내용이 오고가진 않았으나 파이썬의 능력과 편리함, 그리고 그 가능성을 볼 수 있는 시간이었다. Ask Company에서 주최하였으며 유클리드소프트, Goorm IDE 등에서 후원을 하여 진행된 세미나였는데 개념 설명보다는 주로 파이썬 라이브러리에 대한 설명과 그를 이용한 간단한 시연으로 진행되었다.

강의실은 약간 작고 낡은 곳이었다.

세미나의 목적

Ask Company 개발/운영자인 '이진석'씨의 말에 따르면 이번 세미나의 목적은 '대전을 중심으로 파이썬 활용 DNA를 전국에 널리 전파'하는 데에 그 목적이 있다고 하였다. 그러면서 파이썬은 데이터 분석, 머신러닝에 국한되지 않고 또한 소프트웨어 개발자에게 국한된 것 역시 아니라 하였는데 나도 파이썬 하면 제일 많이 보이는 단어가 '머신러닝'이었던 만큼 파이썬을 어떤 방식으로 활용할 수 있을지가 궁금하였다.

누구를 위한 파이썬인가?

파이썬은 전문 소프트웨어 개발자 뿐 아니라 데이터분석가, 사무/업무 자동화가 필요한 직장인, 머신러닝 개발자, 마케터, 코드 자동화가 필요한 사람들 등 폭넓은 분야에서 사용될 수 있다.

애플리케이션(Android, iOS) 개발은 불가능하지만 그 외에 다양한 분야에서 사용될 수 있는데 나도 세미나를 들으면서 이렇게 다양한 분야에 응용될 수 있다는 것을 처음 알 수 있었다.

  • 데이터 분석(Pandas)
  • 머신러닝/인공지능(Tensorflow, Keras, PyTorch, ...)
  • API 활용(requests)
  • 엑셀 UI 자동화(xlwings)
  • 엑셀 파일 자동화(openpyxl, xlrd)
  • 웹서비스 개발, 챗봇(Django, Flask)
  • 윈도우 애플리케이션(PyQT, tkinter, IronPython, ...)

우리가 상상할 수 있는 대부분의 것들을 파이썬을 이용하여 개발이 가능하며 필요한 프로그램이 있다면 자신이 직접 만들어 쓰는 것이 더 빠를 수 있다는 것이 인상깊었다.

파이썬을 이용한 크롤링

인터넷 상에 흩어져있는 자료들을 사람 대신에 프로그램을 통해 서핑하며 수집, 가공하는 크롤링, 크롤러는 파이썬을 이용하여 개발할 수 있는 가장 대표적인 예시라고 생각한다. 프로그램 구성에 따라 ActiveX, Javascript의 처리 등 능력에서 차이를 보이는데 가장 기초적인 예시를 이번 세미나에서 보였다.

 

Ask Company VOD(강의)에서는 크롤링을 네 가지 단계로 구분하였다.

  • 초급편: requests/BeautifulSoup4를 이용한 크롤링
  • 중급편: Selenium을 활용한 크롤링
  • 고급편: Scrapy, 클라우드를 이용한 크롤링 자동화 및 스케줄링
  • 초고급편: ActiveX가 적용된 사이트 크롤링

또한 Pandas를 이용하여 DataFrame/Series 자료구조를 통해 보다 편리한 데이터 처리를 이끌어 낼 수 있는데 이는 데이터 분석 쪽에 관련되어 있다.

 

그렇다면 무엇을 크롤링할까? 이는 크롤러를 사용하는 유저의 목적에 따라 다양하게 나뉠 것이다. 네이버 실시간 검색어부터 블로그 검색, 영화 차트, 멜론 차트, 게시글 수집, 경매 정보 등등.. 여기에 주식거래 등 실시간성이 중요한 크롤링은 자동화의 영역으로 발전시켜 나간다면 더욱 바람직할 것이다.

네이버 실시간 검색어 수집

import requests
from bs4 import BeautifulSoup

html = requests.get('https://www.naver.com/').text
soup = BeautifulSoup(html, 'html.parser')

word_list = soup.select('.PM_CL_realtimeKeyword_rolling .ah_item .ah_k')

for rank, tag in enumerate(word_list, 1):
    print(rank, tag.text)

BeautifulSoup를 활용한 크롤링을 보였으며 웹사이트의 HTML, CSS 구조를 분석하여 원하는 부분만 select하는 모습을 볼 수 있다.

네이버 블로그 검색결과 수집

import requests
from bs4 import BeautifulSoup

def naver_blog_search(q, page=1):
    url = 'https://search.naver.com/search.naver'
    params = {
        'query': q,
        'where': 'post',
        'start': (page-1)*10 + 1,
    }
    response = requests.get(url, params=params)
    html = response.text
    soup = BeautifulSoup(html, 'html.parser')

    post_list = []
    for tag in soup.select('.sh_blog_title'):
        post_list.append({'url': tag['href'], 'title': tag.text})

    return post_list

네이버 메인에서 검색 결과의 블로그 탭에 있는 결과들만 크롤링하는 예시를 보였다. 이번에는 주소창의 매개변수를 분석하여 직접 query, where, start 매개변수를 requests의 get 메소드에 파라미터로 넘김으로써 원하는 단어의 검색 결과를 반환하는 함수를 구현하였다.

where, query 파라미터가 있다. start는 다른 쪽의 글을 보려고 눌렀을 때 보여진다.

import pandas as pd
pd.DataFrame(post_list).to_excel("실검결과.xlsx")  # 엑셀 파일로 저장

또한 Pandas 등을 사용하여 데이터를 좀 더 정제된 모습으로 나타낼 수도 있는데 엑셀파일로 출력하는 것도 가능하였다.

 

다른 예제들(멜론 차트 등)은 좀 더 세부적으로 구현되기도 하였는데 이를테면 Header 정보(User-Agent 등)를 포함한다던가 json을 따로 요청하여 dictionary로 저장하는 등의 사항이 들어가 있기 때문에 학습 후 다른 게시물로 포스팅하는 것이 좋을 것 같다.

파이썬을 이용한 엑셀 자동화

파이썬 엑셀 라이브러리는 다양한 종류가 있는데 openpyxl, pyexcel, xlsxwriter, xlwings 등이 있다. 이번 예제에서는 xlwings를 사용하여 엑셀 자동화를 시연하였다. xlwings는 엑셀 프로그램 자동화 라이브러리로 다른 라이브러리들과 달리 엑셀 프로그램에 의존적이라는 특징을 갖고 있다. 다른 라이브러리들은 엑셀 프로그램과의 연동이 아니라 엑셀 파일 포맷을 지원하는 형태라는 것이 차이점이라 할 수 있다.

 

엑셀을 띄워놓고 파이썬을 통한 셀 값 가져오기/변경을 구현할 수 있고 엑셀의 매크로 기능을 파이썬으로 제작할 수도 있다. 이는 기존에 매크로 용도로 사용하던 VBA를 대체할 수 있다는 것을 의미한다(xlwings가 파이썬 코드를 VBA로 래핑해주기 때문). 이를 UDF(User Defined Function)이라 하는데 설치 및 시작은 이 문서를 참고하자.

 

간단한 매크로를 구현하기에 앞서, Anaconda Prompt에서 "xlwings addin install"을 통해 xlwings를 엑셀에 설치해야 한다. 설치했다면 엑셀을 재시작하면 xlwings 탭이 하나 더 생길 것이다. 빠른 시작을 위해 "xlwings quickstart <프로젝트이름>"을 입력하면 매크로 사용 가능한 엑셀 파일과 파이썬 파일이 생성될 것이다. 기본적으로 같은 이름의 파이썬 모듈에 있는 함수들을 사용하나 엑셀 파일을 열어서 xlwings 탭에서 다른 모듈을 지정할 수도 있다.

 

내 경우는 혹시 몰라서 환경 변수(PATH)에 파이썬 경로도 등록한 후 엑셀 설정에서 개발 도구 - 매크로 보안 - 개발자 매크로 설정에서 'VBA 프로젝트 개체 모델에 안전하게 액세스할 수 있음'을 설정했다. 이는 자동화 오류 440 이 계속 발생하였는데 이 깃헙 이슈에서 찾은 해결방법이다. 개발 도구는 설정에서 따로 탭을 표시해야 한다.

 

설정이 완료되면 xlwings 탭의 Import Functions을 눌러 우리가 만든 모듈을 매크로로 불러올 수 있다. 이때 파이썬 파일에 정의된 함수 중 '@xw.func' 라는 데코레이터 붙은 함수만 불러지므로 유의할 것.

import xlwings as xw


def hello_xlwings():
    wb = xw.Book.caller()
    wb.sheets[0].range("A1").value = "Hello xlwings!"


@xw.func
def hello(name):
    return "hello {0}".format(name)

@xw.func
def double_sum(x, y):
	"""Returns twice of the sum"""
	return 2 * (x + y)

이런 식으로 정의된 파이썬 파일을 엑셀 파일에서 UDF로 등록시키면

이런 식으로 엑셀에서 파이썬을 이용한 매크로를 사용할 수 있다.

일반 함수처럼 자동완성도 뜨기 때문에 편리하다.

 

파이썬 코드에서 직접 엑셀을 조작할 수도 있는데 왼쪽과 같은 코드를 주피터 노트북에서 실행하면 실제로 켜져있는 엑셀 창에서는 오른쪽 화면처럼 바뀌는 모습을 볼 수 있었다. 문서에 따르면 따로 Book(Excel에서 Sheet들의 집합)을 연결할 필요는 없지만 여러 엑셀 파일이 켜져 있을 때는 어떻게 적용되는지 알아봐야 할 것이다.

이는 xlwings 공식 사이트에서도 나와있는 기초적인 예제일 뿐이지만 기존의 VBA를 대신하여 파이썬으로 엑셀 자동화를 수행할 수 있으며 크롤링 함수를 구현하여 매개변수로 키워드만 던져주면 크롤링한 정보를 Pandas의 DataFrame 등을 활용하여 도표로 출력하거나 엑셀에 저장하는 것도 가능하다는 점은 매력적이었다. 

 

이 때문에 강사는 xlwings 뿐만 아니라 크롤링, 머신러닝 등을 활용하면 '엑셀에 날개를 달아준다'고 표현할 정도로 강력한 기능을 갖출 수 있다고 하였다.

 

xlwings는 Anaconda Python에 기본적으로 포함이 되어 있는데 이런 편의성 때문인지 강사는 PyCharm보다는 Anaconda Python을 설치하는 것을 추천하였다. 하지만 막상 설치해보니 이런저런 라이브러리 때문에 용량이 꽤 커서 안그래도 용량이 적은 노트북에 부담이 가는 편이다.

파이썬을 이용한 텔레그램 채팅 봇

채팅 봇을 시연할 때는  이런저런 제약 사항 및 기술적 어려움(네트워크 상태 등..)때문에 강사도 진행에 애를 먹었던 부분이라 난이도가 좀 있는 부분으로 보였다. pip를 통해 'python-telegram-bot'을 설치하고 텔레그램 메신저를 통해 BotFather(역시 봇)와 채팅을 통해 봇 토큰을 획득하면 그를 코드에 적용하여 서버를 실행함으로써 봇을 켜는 시연이었던 걸로 기억하는데 이는 따라하기에도 난이도가 좀 있고 제대로 기억나지 않아 자세하기 적진 않도록 하겠다.

 

다만 파이썬으로 채팅봇을 돌리는 것이 가능하며 Heroku, AWS 등의 클라우드 서비스를 이용하거나 Polling 방식의 코드를 Webhook으로 바꾸고 24시간 가용 가능한 상태로 개발한다면 더욱 효율적으로 구성할 수 있다 하였다.

 

Polling? Webhook?

 

webhooks-vs-polling.md

GitHub Gist: instantly share code, notes, and snippets.

gist.github.com

파이썬을 이용한 웹 개발

아무래도 파이썬을 이용한 웹 개발이라고 하면 유명한 Django나 Flask를 떠올리기 마련이고, 강사 역시 이들을 추천하였다. Django는 백엔드 개발에 필요한 거의 대부분의 것들을 제공하고 Flask는 Django보다는 적은 일부분의 기능들을 제공하는데 이외에도 Pyramid, Bottle같은 simple, micro framework의 존재 역시 알게되었다.

 

국내에서 웹 백엔드라 하면 Spring이나 Node.js을 많이 사용한다고 알고 있었고 파이썬을 백엔드로 활용하는 업체들은 별로 없지 않을까 하는 생각을 했었는데 국내외에 생각보다 많은 곳들이 Django를 사용하고 있었다. 이를테면 인스타그램, Spotify, Pinterest, 요기요, 한국은행, On Demand Korea 등.

 

Django의 장점은 Python 생태계와 같이 자라나고 같은 언어를 사용하며 커뮤니티가 활성화되어있고 10년이라는 기간 동안 충분히 성숙하였기에 풀스택 웹프레임워크라는 특징을 띄고 있다는 것이라 하였다.

세미나가 끝난 후

세미나는 두달 전쯤에 진행하였지만 이런저런 사정으로 미루다가 이제서야 후기를 쓰게 되는데 지금 쓰려니 생각도 안 나고 여러모로 애를 많이 먹었다. 하지만 다시금 정리하면서 파이썬이라는 언어 자체에 대한 관심을 다시금 가지게 되었으니 다행인 것 같다.

 

크롤링은 단독으로 쓰이지 않고 다른 기술(웹, 앱 등)과 병합해야 빛을 발하는 것 같은데 지난 학기때 PHP를 조금 배워봤으니 이번 방학 때 웹 개발을 조금 진행하면서 파이썬을 이용한 크롤링을 적용할 수 있는 방법을 찾아보는 편이 바람직할 듯 하다.