위키피디아 한국어 페이지에서 "평화의 소녀상"을 검색하면 다음과 같은 화면이 나타난다. 해당 URL을 requests 모듈을 이용하여 접속하고, html 소스를 가져온다. 

 

위키피디아 검색 결과 페이지

 

BeautifulSoup 클래스의 find( ) 메소드에 HTML 요소의 태그 이름(‘img’)을 전달하면, 해당 태그 부분을 찾아서 객체로 return 해준다. find( ) 명령은 HTML 문서에서 가장 처음으로 만나는 태그를 한 개 찾는다. 앞의 위키피디아 화면에서 가장 먼저 나오는 사진(img 태그)은 "주한 일본 대사관 앞 평화비"라는 설명이 붙어 있는 사진이다. 

 

"평화의 소녀상, 속초"라는 설명이 있는 사진을 나타내는 ‘img’ 태그를 선택하려면, attrs 매개변수에 해당 태그에만 해당하는 고유의 속성을 추가해야 한다. 개발자 도구를 이용하여 해당 태그를 확인할 수 있는데, alt 속성 값으로 이미지 소스 URL 값을 갖는다. 이 속성을 find( ) 메소드의 attrs 매개변수에 입력하는 방식으로, 특정 태그를 선택할 수 있다. 

 

import requests
from bs4 import BeautifulSoup

url = "https://ko.wikipedia.org/wiki/%ED%8F%89%ED%99%94%EC%9D%98_%EC%86%8C%EB%85%80%EC%83%81"
resp = requests.get(url)
html_src = resp.text

soup = BeautifulSoup(html_src, 'html.parser')
                    
photo_first = soup.find(name='img')
print(photo_first)
print("\n")

photo_sockcho = soup.find(name='img', attrs={'src':'//upload.wikimedia.org/wikipedia/commons/thumb/1/16/%ED%8F%89%ED%99%94%EC%9D%98%EC%86%8C%EB%85%80%EC%83%81%28Statute_of_Peace%29.jpg/220px-%ED%8F%89%ED%99%94%EC%9D%98%EC%86%8C%EB%85%80%EC%83%81%28Statute_of_Peace%29.jpg'})
print(photo_sockcho)

 

 

실행 결과는 다음과 같다. 두 개의 img 태그를 찾아서 내용을 확인할 수 있다. 이처럼, find( ) 메소드는 특정한 태그를 하나만 찾는 경우에 사용되고, 메모리 관리 측면이나 실행 시간에서 유리하다는 장점을 갖는다. 

 

<img alt="" class="thumbimage" data-file-height="3000" data-file-width="4000" decoding="async" height="173" src="//upload.wikimedia.org/wikipedia/commons/thumb/3/36/Japanese_Embassy_in_Seoul_and_watched_from_behind_a_bronze_statue_of_comfort_women.JPG/230px-Japanese_Embassy_in_Seoul_and_watched_from_behind_a_bronze_statue_of_comfort_women.JPG" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/3/36/Japanese_Embassy_in_Seoul_and_watched_from_behind_a_bronze_statue_of_comfort_women.JPG/345px-Japanese_Embassy_in_Seoul_and_watched_from_behind_a_bronze_statue_of_comfort_women.JPG 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/3/36/Japanese_Embassy_in_Seoul_and_watched_from_behind_a_bronze_statue_of_comfort_women.JPG/460px-Japanese_Embassy_in_Seoul_and_watched_from_behind_a_bronze_statue_of_comfort_women.JPG 2x" width="230"/>

 

 

<img alt="" class="thumbimage" data-file-height="2268" data-file-width="4032" decoding="async" height="124" src="//upload.wikimedia.org/wikipedia/commons/thumb/1/16/%ED%8F%89%ED%99%94%EC%9D%98%EC%86%8C%EB%85%80%EC%83%81%28Statute_of_Peace%29.jpg/220px-%ED%8F%89%ED%99%94%EC%9D%98%EC%86%8C%EB%85%80%EC%83%81%28Statute_of_Peace%29.jpg" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/1/16/%ED%8F%89%ED%99%94%EC%9D%98%EC%86%8C%EB%85%80%EC%83%81%28Statute_of_Peace%29.jpg/330px-%ED%8F%89%ED%99%94%EC%9D%98%EC%86%8C%EB%85%80%EC%83%81%28Statute_of_Peace%29.jpg 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/1/16/%ED%8F%89%ED%99%94%EC%9D%98%EC%86%8C%EB%85%80%EC%83%81%28Statute_of_Peace%29.jpg/440px-%ED%8F%89%ED%99%94%EC%9D%98%EC%86%8C%EB%85%80%EC%83%81%28Statute_of_Peace%29.jpg 2x" width="220"/>

 

앞서, requests 모듈을 사용하여 웹 페이지를 요청하고, 응답 객체의 text 속성을 통해 HTML 소스코드를 얻는 과정을 살펴보았다.

 

2019/08/01 - [웹 스크래핑 (Web Scraping)] - [5] 파이썬 웹 스크래핑 - requests 모듈, HTML 소스코드 확인

 

 

HTML 태그와 같이 요소별로 구분하여 HTML 문서를 해석하는 작업을 파싱이라고 부른다. HMTL 소스코드를 파싱(parsing)하고 원하는 정보를 추출하기 위해 BeautifulSoup 라이브러리를 사용한다. 파이썬 클래스로 정의되어 있고, 윈도 명령 프롬프트 또는 터미널 창에서 “pip install beautifulsoup4”를 입력하여 설치한다. 

 

BeautifulSoup 클래스는 매개변수로 전달받은 HTML 소스코드를 해석하여 BeautifulSoup 객체를 생성한다. 이 때, HTML을 파싱(해석)하는 적절한 구문 해석기(파서, parser)를 함께 입력해야 한다. 파서에는 "html.parser", "lxml" 등이 자주 사용된다. (주: XML 구문 해석을 위해서는 "xml" 파서를 따로 설치해서 사용한다.)

 

1) requests 모듈로 html 소스코드 얻기

import requests
from bs4 import BeautifulSoup

url = "https://en.wikipedia.org/wiki/Main_Page"
resp = requests.get(url)
print(resp)
print("\n")

html = resp.text
print(html[:300])
print("\n")

 

requests 모듈의 get( ) 함수의 요청에 웹 서버가 정상 응답하는 경우 코드 200의 값을 갖는다. 응답 객체의 text 속성을 html 변수에 저장하고 일부를 출력하면 html 소스코드를 확인할 수 있다. 

 

<Response [200]>

 

 

<!DOCTYPE html>

<html class="client-nojs" lang="en" dir="ltr">

<head>

<meta charset="UTF-8"/>

<title>Wikipedia, the free encyclopedia</title>

<script>document.documentElement.className=document.documentElement.className.replace(/(^|\s)client-nojs(\s|$)/,"$1client-js$2");RLCONF={"wgCanonicalNamespace

 

 

 

2) html 소스코드를 BeautifulSoup 클래스 객체로 변환하기

soup = BeautifulSoup(html, 'html.parser')
print(type(soup))
print("\n")                 
print(soup.head)
print("\n")
print(soup.body)
print("\n")

 

다음에는 html 문자열을 BeautifulSoup 클래스 객체로 변환한다. type( ) 함수로 soup 객체를 확인하면, BeautifulSoup 클래스 객체라는 것을 알 수 있다. 여기서 soup 객체의 head 부분을 따로 지정할 수 있는데, 다음 실행결과와 같이 <head> 태그 부분이 출력된다. 마찬가지로 <body> 태그 부분을 따로 선택할 수도 있다. 

 

<class 'bs4.BeautifulSoup'>

 

 

<head>

<meta charset="utf-8"/>

<title>Wikipedia, the free encyclopedia</title>

<script>document.documentElement.className=document.documentElement.className.replace(/(^|\s)client-nojs(\s|$)/,"$1client-js$2");RLCONF={"wgCanonicalNamespace":"","wgC ... <중략>...

 

 

<body class="mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Main_Page rootpage-Main_Page skin-vector action-view">

<div class="noprint" id="mw-page-base"></div>

<div class="noprint" id="mw-head-base"></div>

<div class="mw-body" id="content" role="main">

<a id="top"></a>

<div class="mw-body-content" id="siteNotice"><!-- CentralNotice --></div>

<div class="mw-indicators mw-body-content">

</div>  

<h1 class="firstHeading" id="firstHeading" lang="en">Main Page</h1>

<div class="mw-body-content" id="bodyContent">

<div class="noprint" id="siteSub">From Wikipedia, the free encyclopedia</div>

<div id="contentSub"></div>

<div id="jump-to-nav"></div>  ... <이하 생략>...

 

3) BeautifulSoup 클래스 속성 확인하기

print(soup.title)
print(soup.title.name)
print(soup.title.string)

 

<title> 태그를 먼저 선택해서 출력하면 태그의 문자열까지 전부 확인할 수 있다. 여기서 하위 속성인 name을 이용하면, 태그명을 선택할 수 있고, string 속성을 이용하면 문자열을 따로 추출할 수도 있다.

 

<title>Wikipedia, the free encyclopedia</title>

title

Wikipedia, the free encyclopedia

 

파이썬 requests 모듈은 웹 서버에 요청을 보내고 응답 객체를 받는데 사용한다. 응답 객체 중에서 HTML 소스 코드를 얻는 방법을 알아본다. 

 

import requests

url = "https://www.wikipedia.org/"
resp = requests.get(url)

html = resp.text
print(html[:1000])

1. requests 모듈을 불러온다.

 

2. 위키피디아 웹 주소를 변수에 저장한다. 

 

3. 웹 서버에 GET 요청을 보내고, 서버가 응답한 객체를 변수에 저장한다.

 

4. text 속성에 HTML 소스코드가 들어 있다. 

 

5. 문자열로 저장되어 있는 HTML 소스코드를 출력한다. 앞에서 1000개의 글자를 지정하여 일부 소스코드만 확인한다. 


<실행 결과 > HTML 소스코드 확인

<!DOCTYPE html>
<html lang="mul" class="no-js">
<head>
<meta charset="utf-8">
<title>Wikipedia</title>
<meta name="description" content="Wikipedia is a free online encyclopedia, created and edited by volunteers around the world and hosted by the Wikimedia Foundation.">
<![if gt IE 7]>
<script>
document.documentElement.className = document.documentElement.className.replace( /(^|\s)no-js(\s|$)/, "$1js-enabled$2" );
</script>
<![endif]>
<!--[if lt IE 7]><meta http-equiv="imagetoolbar" content="no"><![endif]-->
<meta name="viewport" content="initial-scale=1,user-scalable=yes">
<link rel="apple-touch-icon" href="/static/apple-touch/wikipedia.png">
<link rel="shortcut icon" href="/static/favicon/wikipedia.ico">
<link rel="license" href="//creativecommons.org/licenses/by-sa/3.0/">
<style>
.sprite{background-image:url(portal/wikipedia.org/assets/img/sprite-3f2e1b8f.png);background-image:linear-gradient(transparent,transparent),url(portal/wikipedia.org/assets/img/sprite-3f2e1b8f.svg);background

 

1. 클립보드에서 읽어 오기

 

   * pd.read_clipboard( ) : 클립보드에 있는 내용을 read_table( )에 전달. 웹 또는 다른 파일에 있는 텍스트를 선택하여 클립보드에 저장한 상태에서, 클립보드에서 바로 파이썬에서 다룰 수 있는 데이터로 가져올 수 있게 하는 기능.


   - DataFrame을 만들고, 내용을 확인한다.  

 

>>> df = pd.DataFrame([[1, 2], [3, 5], [5, 9]], columns=['A', 'B'])
>>> df
    A B
0  1 4
1  2 5
2  3 6

 

   -  위 텍스트 부분을 마우스로 전부 선택해서 Ctrl+C를 눌러서 클립보드에 저장한다. 

 

판다스 클립보드 활용

 

      -  pd.read_clipboard( )를 이용하여, 클립보드의 데이터를 clip_df 변수에 저장한다. 

 

>>> clip_df = pd.read_clipboard( )
>>> clip_df
   A  B0  1  21  3  52  5  9
 

 

 

2. 클립보드로 보내기

 

   * pd.to_clipboard( ) -데이터프레임을 텍스트로 변환하여 클립보드에 저장. 클립보드에 저장된 데이터(텍스트로 저장)를 붙여넣기(Ctrl+V)를 통해서 워드프로세스서나 다른 파일로 바로 옮길 수 있다. 

 

pd.to_clipboard( )  클립보드로 보내기

 

늘은 인터넷에서 CSV 파일을 다운로드받아서, 필요한 정보만을 추출해서 정리하는 작업을 해보겠습니다.

 

코딩을 이제 배우기 시작하는 직장인의 입장에서 파이썬 문법 기초부터 차근차근 배워나가는 것도 필요하지만, 당장 실무에 적용할 수 있는 파이썬 라이브러리 위주로 집중 학습하는 것도 좋은 방법이라고 생각합니다.

 

이런 관점에서 지난 번 포스팅(http://pydata.tistory.com/1)에서 사용했던 판다스(pandas) 모듈을 계속 활용합니다. 지난 번에는 판다스(pandas) 모듈의 read_html 함수를 사용하여 html 웹 페이지에 있는 모든 표를 가져오는 방법을 배웠는데요. 이번에는 read_csv 함수를 사용하여 CSV 파일을 읽어들이는 과정을 만나보겠습니다.  

 


 

CSV 파일 다운로드

  

오늘 활용할 데이터는 KOSPI 상장 주식 종목 리스트입니다. 한국증권거래소(KRX) 홈페이지에 들어가면 상장종목현황(http://marketdata.krx.co.kr/mdi#document=040601)을 제공합니다. KOSPI와 KOSDAQ 종목을 구분하고 있고, 다운받을 컬럼 항목을 선택할 수도 있습니다. 파일 형식은 Excel과 CSV를 지원하는데 우리는 CSV 부분을 클릭해서 CSV 파일을 PC에 저장합니다. 이때 파일명을 'kospi_stock_code.csv'로 바꾸고 파이썬(Python) 실행파일이 위치한 폴더에 저장합니다. 

 

 

<KRX 한국거래소 상장종목 현황>

 

 

<'kospi_stock_code.csv' 파일>

 


 

 

파이썬 실행 코드 작성

다운로드한 CSV 파일을 살펴 보면, 위와 같이 표(table) 형식으로 정리된 자료입니다. 파이썬에서 CSV 파일의 데이터에 접근하기 위해서는 파이썬이 인식할 수 있는 자료형으로 변환해주어야 합니다. 판다스(pandas)에서는 데이터프레임(dataframe)이라는 자료형을 주로 사용하기 때문에, read_csv 함수로 CSV 파일을 읽어 오면 데이터프레임(dataframe)으로 저장됩니다. 실행코드는 주석을 제외하고 세 줄이면 충분합니다.

 

# 판다스 모듈 불러오기 (편의 상, pd라는 이름으로 사용)
import pandas as pd

 

# csv 파일을 해석하여 dataframe으로 변환하고, stock_data 변수에 저장
stock_data = pd.read_csv('kospi_stock_code.csv')

 

#종목코드 컬럼만 선택하여 stock_code 변수에 저장
stock_code = stock_data[['종목코드', '기업명']]

 

 

결과(stock_code) 확인하기

 

 

 

 

stock_code 변수에 저장된 데이터프레임(dataframe) 내용을 확인합니다. 제일 왼쪽 컬럼(column)의 숫자는 인덱스(index)라고 부르며, '종목코드'와 '기업명'은 컬럼(columns)명이라고 합니다. 

 

데이터프레임에서 컬럼(열)을 선택할 때는 데이터프레임['컬럼명'] 형식으로 지정하는데, 종목코드만 선택하고 싶을 때는 stock_code['종목코드']라고 입력합니다. 로우(행)을 선택하려면 데이터프레임.iloc[인덱스]라고 입력합니다. stock_code.iloc[1]라고 입력하면 AJ렌터카에 대한 정보만을 선택해서 볼 수 있습니다.    

 

 

 

 

요약하며...

 

코드를 모아서 정리하면 모두 3줄입니다. 다음 포스팅에서는 종목코드를 이용하여 개별 주식 종목에 대한 정보를 가져오는 방법에 대해서 알아보겠습니다. 

+ Recent posts