[Python.Web] 실시간 금융 데이터 파싱하기 추출

2020. 11. 18. 05:00Python과 머신러닝/웹 데이터 추출

요약

  • URL로부터 정보를 뽑아오는 3번째 예제이다 (앞의 예제를 못 봤다면 참고해야 이해가 될 것이다)

 

 

Python으로 웹사이트에서 데이터 추출하기 (urllib, regular expression)

웹사이트에서 원하는 형태의 데이터를 긁어오는 방법을 알아보자. 요약 1. 원하는 URL을 정한다. 2. URL로부터 모든 text를 string으로 읽어온다. 3. 내가 찾고자 하는 string을 regular expression 형태로 정

coding-grandpa.tistory.com

 

  • 이번에도 비슷한 예제이지만, 조금은 더 실용적인 네이버 금융에서 금융정보를 뽑아오는 예제를 볼 것이다.
  • 정답부터 보자면 다음과 같다
import re
from urllib import request

url = "https://finance.naver.com/item/main.nhn?code=293490"  # 카카오게임즈 url 입력
html = request.urlopen(url).read().decode("cp949")

# dl class 뽑기
pattern1 = r"(\<dl class=\"blind\"\>)([\s\S]+?)(\</dl\>)"
result = re.findall(pattern1, html)  # <dl class="blind"> </dl> 읽어오기 list type
result = result[0][1].strip() # html 헤더정보는 제외하고 중간의 원하는 정보만 뽑아와서 str으로 변환한다.

# dd 정보들 뽑기
pattern2 = r"(\<dd\>)([\s\S]+?)(\</dd\>)"
detail_results = re.findall(pattern2, result)  #변환된 list 중 필요한 정보는 전부 <dd> </dd>로 쌓여 있으니, 이 정보만 list로 뽑아온다

# 다듬기 및 출력
for detail_result in detail_results[1:]:  # 각각의 tuple을  뽑아내서 string으로 출력하기
    #tuple 들 중 0번 index는 버린다 (장마감 시간)
    print(detail_result[1].split(" ")) # [0]과 [2]는 각각 <dd>와 </dd> 이기 때문에 버리고 [1]의 실제 데이터만 사용한다
                                       # [1]의 데이터도 띄어쓰기를 구분하여 보면 더 분석이 용이하니 split 한다

 

1. 네이버 금융의 주소에서 html 소스 읽어오기

  • 이전 두 개의 예제와 완전히 동일하기 때문에 설명은 생략
  • 참고로, 네이버 금융은 code=XXXXXX 이런식으로 6자리 종목코드를 넣으면 조회가 가능하다.
  • 조회하려는 종목들의 코드만 배열로 따로 정리한다면, 얼마든지 원하는 정보를 웹에서 주기적으로 읽어올 수 있다.
  • 293490은 최근에 핫했던 카카오게임즈의 종목코드이고, 예시일 뿐이다.
import re
from urllib import request

url = "https://finance.naver.com/item/main.nhn?code=293490"  # 카카오게임즈 url 입력
html = request.urlopen(url).read().decode("cp949")

 

2. <dl class> 정보만 추출하기

  • 위 주소의 소스를 들여다보면 우리가 원하는 정보의 대부분은 <dl class> </dl> 내부에 있다는 것을 알 수 있다.
  • 그렇기 때문에 첫 정규식은 다음과 같이 정의하면 될 것 같다 ("(\<dl class=\"blind\"\>)([\s\S]+?)(\</dl\>)")
  • 이걸 코드로 표현하면 다음과 같이 나온다.
# dl class 뽑기
pattern1 = r"(\<dl class=\"blind\"\>)([\s\S]+?)(\</dl\>)"
result = re.findall(pattern1, html)  # <dl class="blind"> </dl> 읽어오기 list type
result = result[0][1].strip() # html 헤더정보는 제외하고 중간의 원하는 정보만 뽑아와서 str으로 변환한다.
  • 이 상태에서 result를 출력하면 다음과 같이 나온다

얼추 원하는 정보들이 나온 것 같다

 

3. <dd> 정보만 2차 추출하기

  • 이 정보를 그대로 사용해서 추출할 수도 있지만, 정규식을 사용해서 <dd> 정보만 뽑는 것이 더 효율적일 것이다.
  • <dd> 정보만 뽑는 정규식은 다음과 같이 정의하면 된다 ("(\<dd\>)([\s\S]+?)(\</dd\>)")
  • 그러면 코드는 다음과 같이 나온다.
# dd 정보들 뽑기
pattern2 = r"(\<dd\>)([\s\S]+?)(\</dd\>)"
detail_results = re.findall(pattern2, result)  #변환된 list 중 필요한 정보는 전부 <dd> </dd>로 쌓여 있으니, 이 정보만 list로 뽑아온다

 

4. 추출된 정보 다듬기

  • 위와 같이 나온 정보 중 쓸모 있는 정보만 뽑아보자
  • 우선 리스트의 첫 번째 요소는 필요가 없어 보인다(장 마감 기준 시간) -> detail_results의 1번 요소부터 추출한다
  • 1번 tuple부터 봐도, 앞뒤로는 <dd> </dd>이기 때문에 분석에 도움이 되지 않는 정보들이다
    -> 각 tuple의 [1] 위치에 있는 string만 뽑아서 사용한다.
  • 이 string도 '종목명 카카오게임즈' 이런 식으로 붙어 있으니 이를 .split 함수로 나눠서 보면 가장 좋을 것 같다.
# 다듬기 및 출력
for detail_result in detail_results[1:]:  # 각각의 tuple을  뽑아내서 string으로 출력하기
    #tuple 들 중 0번 index는 버린다 (장마감 시간)
    print(detail_result[1].split(" ")) # [0]과 [2]는 각각 <dd>와 </dd> 이기 때문에 버리고 [1]의 실제 데이터만 사용한다
                                       # [1]의 데이터도 띄어쓰기를 구분하여 보면 더 분석이 용이하니 split 한다

 

마무리

  • 웹을 통해서 추출할 정보가 너무 많고, python을 통해서 이 데이터를 읽어오는 것은 아주 간단하다
  • 약간의 노력을 통해 정규식을 한번 잘 세우면, 컴퓨터가 계속해서 실시간 데이터를 읽어올 수 있다
  • 정규식이 복잡해지면 이번 예제처럼 2번 이상에 나눠서 추출하는 것이 더 좋을 수 있다
  • 주식 투자, 부동산 시세 등을 가지고 빅데이터 분석을 하려면 여기서부터 시작하는 것도 좋은 생각일 것 같다

 

관련 포스트

 

[Python.Web] BeautifulSoup으로 하는 웹크롤링, 데이터 스크레이핑

요약 XML이란 eXtensible Markup Language의 약자로 데이터의 구조와 의미를 설명하기 위해 Tag(Markup)를 사용하는 언어이다. HTML과 비슷하게 데이터가 정형화되어 있어 분석이 편리하고, 이를 더욱 쉽게 Pa

coding-grandpa.tistory.com

 

[Python.Web] BeautifulSoup과 wget 으로 웹크롤링, 데이터 스크레이핑

요약 지난 내용은 다운로드하여놓은 xml파일을 분석했다면, 이번엔 웹에서 다운로드하는 단계까지 자동화한다 BeautifulSoup으로 하는 웹크롤링, 데이터 스크레이핑 요약 XML이란 eXtensible Markup Languag

coding-grandpa.tistory.com