[Python.Web] 실시간 금융 데이터 파싱하기 추출
2020. 11. 18. 05:00ㆍPython과 머신러닝/웹 데이터 추출
요약
- URL로부터 정보를 뽑아오는 3번째 예제이다 (앞의 예제를 못 봤다면 참고해야 이해가 될 것이다)
- 이번에도 비슷한 예제이지만, 조금은 더 실용적인 네이버 금융에서 금융정보를 뽑아오는 예제를 볼 것이다.
- 정답부터 보자면 다음과 같다
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번 이상에 나눠서 추출하는 것이 더 좋을 수 있다
- 주식 투자, 부동산 시세 등을 가지고 빅데이터 분석을 하려면 여기서부터 시작하는 것도 좋은 생각일 것 같다
관련 포스트
- 2020/11/20 - [Python과 머신러닝/웹 데이터 추출] - [Python.Web] BeautifulSoup으로 하는 웹크롤링, 데이터 스크레이핑
- 2020/11/23 - [Python과 머신러닝/웹 데이터 추출] - [Python.Web] BeautifulSoup과 wget 으로 웹크롤링, 데이터 스크레이핑
'Python과 머신러닝 > 웹 데이터 추출' 카테고리의 다른 글
[Python.Web] BeautifulSoup과 wget 으로 웹크롤링, 데이터 스크레이핑 (0) | 2020.11.23 |
---|---|
[Python.Web] BeautifulSoup으로 하는 웹크롤링, 데이터 스크레이핑 (0) | 2020.11.20 |
[Python.Web] wget으로 웹 데이터 다운로드 및 파싱 - wget.download (0) | 2020.11.17 |
[Python.Web] 정규표현식을 이용한 웹 데이터 파싱 - urllib, regular expression (0) | 2020.11.13 |
보일러 플레이트(Boiler Plate) 이해하기 (0) | 2020.10.31 |