반응형

BeautifulSoup으로 웹 크롤링


웹 페이지 html은 태그, 요소, 속성 등의 구성요소를 사용해 구조적으로 웹페이지를 표시합니다. 

이런 구조화된 문서를 효율적으로 파싱해서 원하는 정보를 찾을 수 있는데, 파이썬 기본 모듈을 사용해도 되지만, Beautifulsoup을 사용하면 더욱 손쉽게 파싱할 수 있습니다.   


1. BeautifulSoup4 설치

파이썬에 기본 설치되는 라이브러리가 아니기 때문에, BeautifulSoup은 별도로 설치해야 합니다.

명령어는 다음과 같습니다.

(리눅스) sudo apt-get install python-bs4

(맥) pip install beautifulsoup4 또는 easy_install beautifulsoup4


2. virtualenv 환경에 대해

라이브러리를 프로젝트 단위로 구분해서 관리하면, 나중에 환경폴더 전체를 다른 컴퓨터로 옮기기가 매우 쉽습니다. 따라서, virtualenv 가상 환경을 사용하는 것이 매우 편리하다는 점을 언급하고 싶습니다. 

pyenv와 virtualenv는 구글링해 보면 설정하는 법이 나와 있으니 참고하면 될 것 입니다.


3. 기본 사용 예제

>>> from urllib.request import urlopen

>>> from bs4 import BeautifulSoup

>>> html = urlopen("http://www.pythonscraping.com/pages/warandpeace.html")

>>> soup = BeautifulSoup(html, 'html.parser')

>>> nameList = soup.find_all('span', {'class':'green'})

>>> for name in nameList:

             print(name.get_text())

jupyter notebook에서 실행해본 결과!


위 사용 예제(참조:파이썬으로 웹 크롤러 만들기)에서, 몇가지 주석을 달아봅니다. 

먼저, {'class':'green'}은 class_ = 'green'으로 변경해서 사용할 수 있습니다. class가 예약어이기 때문에, class_로 표시해야 제대로 처리됩니다.

get_text()는 현재 문서에서 모든 태그를 제거하고 텍스트만 들어 있는 문자열을 반환합니다. 

예를 들어, 하이퍼링크, 문단, 기타 태그가 여럿 들어 있는 텍스트 블록에 사용하면 태그 없는 텍스트만 남기 때문에, 가장 마지막에 원하는 텍스트를 얻을 때 사용하는 것이 좋습니다.

BeautifulSoup를 사용해서 웹페이지를 크롤링하다 보니, re도 많이 사용해야 하더군요. 그리고, 웹페이지 구조를 파악하는 것도 익숙해져야 하구요. 


가끔 웹페이지 크롤링한 예제를 올려보도록 하겠습니다. 

참고) https://www.crummy.com/software/BeautifulSoup/bs4/doc/




반응형
반응형

파이썬에서 CSV파일 읽고 쓰기

파이썬에서 파일로 된 데이터를 처리하는 일은 매우 빈번하게 일어난다. 그 중에서 CSV형태가 가장 일반적일 것이다.  

파이썬 공식 문서에는 CSV(Comma Separated Values)라 불리는 포멧은 스프레드시트와 데이터베이스에서 가장 많이 임포트(import)하고 엑스포트(export)하는 포멧이라고 정의되어 있다.

공식 문서에 나와 있는 CSV에 대해 간략히 정리해 보면 아래와 같다.

물론 앞으로 계속 발전하면서 업데이트 되겠지만 말이다.

'CSV 표준'이라는 것은 사실 없다고 할 수 있다. 즉, 이 포멧은 서로 다른 어플리케이션에서 읽고 쓰는 방식을 통해 기능적으로 미묘한 차이를 갖는다고 할 수 있다. 

이러한 차이점들은 다양한 소스들로부터 CSV 파일을 처리하는 것을 어렵게?(귀찮게) 만든다. 

하지만, 경계기호(delimiters)와 인용 부호가 다르더라도, 전체 포멧은 단일 모듈로 쓰거나 읽을 때 충분히 유사하게 동작하기 때문에 기본적으로 읽고 쓰는 것은 매우 유사하다고 생각한다. 

csv 모듈은 CSV 포멧에서 표 데이터를 읽고 쓰기 위한 클래스를 실행한다. 쉽게 말하자면, 엑셀에서 사용하는 스프레드시트 형태의 포멧으로 처리된다고 생각하면 된다.

csv 모듈의 reader와 writer 객체는 순차적으로 읽기와 쓰기를 행한다. 

또한, DictReader와 DictWriter 클래스를 사용해 딕셔너리 폼에서 데이터를 읽고 쓸 수 있다. 

그럼, reader와 writer, DictReader, DictWriter의 기본적인 사용법을 정리해 보자. (아래 예시는 파이썬 3.5이상을 기준으로 함)


1. csv.reader

>>> import csv

>>> with open('file.csv', 'r') as f:

               reader_csv = csv.reader(f, delimiter=',')

               for row in reader_csv:

                    print (row)


2. csv.writer

>>> import csv

>>> with open('file.csv', 'w') as f:

               writer = csv.writer(f, delimiter=',')

               writer.writerow(['love']*3 + ['banana'])

               writer.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])


3. csv.DictReader

>>> import csv

>>> with open('names.csv') as f:

               reader = csv.DictReader(f)

               for row in reader:

                    print(row['first_name'], row['last_name'])


4. csv.DictWriter

>>> import csv

>>> with open('names.csv, 'w') as f:

               fieldnames =['first_name', 'last_name']

               writer = csv.DictWriter(f, fieldnames=fieldnames)

               writer.writeheader()

               writer.writerow({'first_name': 'Baked', 'last_name': 'Beans'})

               writer.writerow({'first_name': 'Lovely', 'last_name': 'Spam'})

               writer.writerow({'first_name': 'Wonderful', 'last_name': 'Spam'})


참고) https://docs.python.org/3/library/csv.html


udacity에서 분석해 보았던 titanic-data.csv 파일, 읽고 쓰는게 문제가 아니라 각 필드별로 분석하는게 노가다... 





반응형
반응형

머신러닝(Machine Learning) 기본 개념(Basci Concept)

머신러닝은 주어진 데이터를 훈련시켜(training), 훈련된 지식을 기반으로 새로운 입력(test input)에 대해 적절한 답(test output)을 찾고자 하는 일련의 과정이라고 말할 수 있습니다. 

이때 훈련시키는 데이터가 질문(training input)과 정답(training output)이 모두 주어진 경우가 있고, 질문만 주어진 경우가 있습니다. 전자의 경우를 라벨링(Labeling)이 되어 있다고 말합니다.


1. 지도학습(Supervised Learning)

훈련 데이터에 라벨링이 되어 있는 경우. 

즉, 각 질문(input)에 대해 무엇이 정답(output)인지 훈련데이터가 알고 있는 경우입니다. 

예를 들면 (2, 4) -> (8), (4, 3) -> (12), 이런 식으로 훈련데이터가 주어져 있다는 것입니다.

ex) regression - (x,y)글의 데이터를 가지고 모함수 y=f(x)의 관계를 예측하는 방법

Classification - 각 그룹별 특징을 학습하여 새로운 데이터가 어느 그룹에 속해야 하는지 판단하는 방법


2. 비지도학습(Unsupervised Learning)

데이터만 잔뜩 주어집니다. 

즉 문제는 있는데 답은 없습니다. 

우리가 할 수 있는 건, 문제 유형 정도를 구분할 수 있겠습니다. 

이를 clustering이라고 합니다.  

ex) clustering - 어떠한 데이터끼리 군집으로 묶을 수 있는지 판단하는 방법

Dimension reduction - 독립적인 특징(축)들을 추출해 이를 중심으로 데이터를 압축하는 저차원으로 압축하는 방법


★ 요즘 비지도학습에 PCA(Principle Component Analysis, 주성분 분석) 알고리즘을 적용하고 딥러닝(Deep Learning)+오토엔코더(Autoencoder)로 확대되면서 인공지능 분야를 가장 핫한 분야가 되게 하였습니다.  이 부분은 나중에 정리해 보도록 하겠습니다.


3. 강화학습(Reinforcement Learning)

미리 정답이 주어져 있진 않고, 시행마다 잘한 정도를 보상(reward)하여 줍니다(이는 동물들이 학습하는 방법과 유사).

ex) 엘레베이터 스케쥴링, 컴퓨터 체스, 복잡한 로봇의 제어 등등


4. 그 외 : 일부만 라벨링이 되어 있는 경우도 있고, 정보가 점진적으로(incremental) 주어지는 경우도 있고, 데이터가 너무 많은 경우, 적은 경우 등 다양한 기계학습 문제가 존재합니다.



아래 그림은 scikit-learn(파이썬에서 많이 사용하고 있는 머신러닝 라이브러리) 관련 사이트에서 머신러닝 알고리즘을 한 눈에 볼 수 있도록 맵으로 제시하고 있습니다. 


머신 러닝에 대한 전체 윤곽을 그려볼 수 있어서 앞으로 머신러닝을 배워나가는 길잡이로 알고 있으면 좋습니다. 


원본 맵 보기(http://scikit-learn.org/stable/tutorial/machine_learning_map/)


반응형
반응형

Jupyter Notebook이란

Jupyter Notebook은 오픈 소스 웹 애플리케이션으로 라이브 코드, 등식, 시각화와 설명을 위한 텍스트 등을 포함한 문서를 만들고 공유하도록 할 수 있습니다. 

주로 데이터 클리닝과 변형, 수치 시뮬레이션, 통계 모델링, 머신 러닝 등에 사용할 수 있습니다.

Jupyter Notebook은 Python, R, Julia, Scala 등 데이터 과학 분야에서 인기있는 40종의 다양한 프로그래밍 언어를 지원합니다. 또한, 이메일, 드롭박스, 깃허브 등으로 공유할 수 있습니다. 가장 큰 장점은 실시간으로 인터렉티브하게 데이터를 조작하고 시각화할 수 있도록 해준다는 점을 것입니다.

신규 사용자는, Anaconda를 설치하는 것을 권장합니다. Anaconda는 과학적 컴퓨팅과 데이터 사이언스를 위해 필요한 라이브러리들을 대부분 포함하고 있기 때문입니다.

추가적으로 말씀드리자면, python 라이브러리들에 대한 관리를 pyenv와 virtualenv(python 가상 환경)을 사용해서 관리하는 것이 좋습니다.  

 

1. Jupyter Notebook 시작

터미널에서 

>>> jupiter notebook

을 입력하세요.

그러면, 기본 웹 브라우저에서 다음과 같은 Notebook Dashboard가 구동되는 것을 볼 수 있을 것입니다.

위 화면에서 확장자가 .ipynb인 파일을 클릭해 이미 작성된 Notebook을 실행시킬 수 있고, 오른쪽 상단의 New버튼을 눌러 팝업 메뉴에서 python[defalut] 또는 python[conda root]를 선택해서 새로운 Notebook을 열 수도 있습니다.(참고로, 새로운 Notebook을 선택하는 Python[conda root, default, 2, 3]는 anaconda로 실행했을 때와 python에 별도로 jupyter notebook 관련 라이브러리를 설치하고 실행했을 때 조금 다르게 보일 수 있습니다)

반응형

2.  Jupyter Notebook 사용해 보기

새로운 Notebook을 실행하고, 각 셀에 파이썬 코드 및 등식, 설명을 입력합니다.설명 및 등식을 입력하려면, 아래 그림과 같이 상단 가운데 선택 메뉴에서 마크다운(Markdown)을 선택하고 입력하면 됩니다. 다 입력한 후에는 Shift+Enter(또는 Ctrl+Enter)로 실행 명령을 내립니다.

 

3. 단축키

<Command Mode>

- Enter : 에디트 모드(Edit Mode)로 진입- Y : 코드(Code) 셀로 전환- M : 마크다운(Markdown) 셀로 전환- R : Raw NB 셀로 전환- 1~6 : 마크다운 H1~H6- a : 위에 셀 삽입- b : 아래 셀 삽입

<Edit Mode>

- Tab : 코드 자동완성, 들여쓰기- Ctrl+] : 들여쓰기(intent)- Ctrl+[ : 내어쓰기(detent)- Ctrl+a : 전체 선택- Ctrl+z : 실행 취소(undo)- Esc : 커맨드 모드(Command mode)로 진입- Shift+Enter : 셀 실행하고 다음 셀 선택- Ctrl+Enter : 셀 실행- Alt+Enter : 셀 실행하고, 아래 셀 삽입


Jupyter Notebook도 제대로 사용하려면 생각보다 많은 것을 배워나가야 할 것 같네요. 그래도 위에 열거한 

기본적인 사항만 알면 실행하는데 크게 문제는 안되리라 생각합니다. 

 

반응형
반응형

파이썬에 대해서 공부하다 보니, 처음에는 매우 쉽다고 생각하다가 시간이 갈수록 참 방대하구나 하는 느낌이 든다.

앞으로 익숙해지려면 좀 시간이 걸리겠구나. 그러면, 내가 배우는 내용을 정리해 나가는 것도 괜찮은 방법이 될 것이라 생각하게 되었다.

우리 나라에는 아직 파이썬이 일반화되지 않아서 그런지 특정 분야의 사람들만 아직 사용하고 있고, 기초적인 사항은 있는데 아직 심도있는 부분을 정리한 곳은 거의 찾아볼 수가 없는 것 같다. 물론 실력있는 분들은 꽤 계시다. ^^ 

나처럼 파이썬을 배우고자 하는 사람들에게 기초와 응용에 대한 아이디어를 줄 수 있는 곳이 되도록 노력할 것이다. 

파이썬이 코딩 언어로써 얼마나 인지도가 있는지 최근 3년간 현황을 보면,

2013년 29.8% 2014년 30.3% 2015년 31.2%로 가장 인기가 좋고, 지속적으로 시장을 확장하고 있다는 것을 알 수 있다.

배우기 쉽고, 인터프리터 방식으로 동적 타이핑 환경을 구성할 수 있다는 점, 그리고 빠른 개발 환경에 적당한 것이 인기를 끄는 매력이 아닐까 생각한다.  






반응형

+ Recent posts