🔥알림🔥
① 테디노트 유튜브 -
구경하러 가기!
② LangChain 한국어 튜토리얼
바로가기 👀
③ 랭체인 노트 무료 전자책(wikidocs)
바로가기 🙌
④ RAG 비법노트 LangChain 강의오픈
바로가기 🙌
⑤ 서울대 PyTorch 딥러닝 강의
바로가기 🙌
셀레니움(selenium)을 활용한 네이버 환율 정보 크롤링
이번 튜토리얼에서는 네이버의 환율 정보를 크롤링하는 방법에 대해 알아보겠습니다. 이 과정에서 Python의 셀레니움(selenium)
을 사용할 예정입니다. 크롤링 과정에서 발생할 수 있는 다양한 오류들을 어떻게 처리 하는지에 대해서도 알아보겠습니다. 튜토리얼 마지막 부분에서는 코드를 클래스(Class)로 만들어 더 깔끔하게 정리하는 방법을 다룰 것입니다.
라이브러리 설치
# Pandas, Selenium, Webdriver Manager 설치
!pip install pandas
!pip install selenium
!pip install webdriver-manager
모듈 import
import pandas as pd
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
# 드라이버 생성
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
네이버 환율 정보
# 네이버 환율 정보 테이블에 접근
driver.get('https://finance.naver.com/marketindex/?tabSel=exchange#tab_section')
iframe 스위칭
환율 정보 테이블은 iframe 으로 래핑하여 제공하기 때문에 iframe 스위칭 한 뒤 정보를 가져올 수 있습니다.
# iframe 객체는 반드시 스위칭 후에 UI Element 접근 가능
driver.switch_to.frame('frame_ex1')
X-Path / Tag Name으로 요소 가져오기
# X-Path로 환율 정보 테이블 가져오기
currency_body = driver.find_element(By.XPATH, '/html/body/div/table/tbody')
# tr 태그 정보로 순회하면서 데이터 조회
for tr in currency_body.find_elements(By.TAG_NAME, 'tr'):
print(tr.text)
미국 USD 1,301.40 1,324.17 1,278.63 1,314.10 1,288.70 1.000 유럽연합 EUR 1,412.28 1,440.38 1,384.18 1,426.40 1,398.16 1.085 일본 JPY (100엔) 901.22 916.99 885.45 910.05 892.39 0.693 중국 CNY 179.36 188.32 170.40 181.15 177.57 0.138 홍콩 HKD 166.39 169.66 163.12 168.05 164.73 0.128 대만 TWD 41.69 47.15 37.53 N/A N/A 0.032 영국 GBP 1,653.75 1,686.32 1,621.18 1,670.28 1,637.22 1.271 오만 OMR 3,380.35 3,616.97 3,143.73 N/A N/A 2.598 캐나다 CAD 979.75 999.05 960.45 989.54 969.96 0.753 스위스 CHF 1,448.66 1,477.19 1,420.13 1,463.14 1,434.18 1.113 스웨덴 SEK 118.82 121.73 115.91 120.00 117.64 0.091 호주 AUD 867.58 884.67 850.49 876.25 858.91 0.667 뉴질랜드 NZD 805.24 821.10 789.38 813.29 797.19 0.619 체코 CZK 59.44 64.49 54.10 60.09 58.79 0.046 칠레 CLP 1.63 1.79 1.47 N/A N/A 0.001 튀르키예 TRY 50.05 N/A N/A 50.60 49.50 0.039 몽골 MNT 0.38 N/A N/A N/A N/A 0.000 이스라엘 ILS 351.78 386.95 323.64 N/A N/A 0.270 덴마크 DKK 189.60 194.24 184.96 191.49 187.71 0.146 노르웨이 NOK 121.95 124.93 118.97 123.16 120.74 0.094 사우디아라비아 SAR 346.96 368.81 323.02 350.42 343.50 0.267 쿠웨이트 KWD 4,234.95 4,510.22 3,896.16 4,277.29 4,192.61 3.254 바레인 BHD 3,452.08 3,673.01 3,175.92 3,486.60 3,417.56 2.653 아랍에미리트 AED 354.33 373.81 329.89 357.87 350.79 0.272 요르단 JOD 1,834.64 1,997.92 1,687.87 N/A N/A 1.410 이집트 EGP 42.12 N/A N/A N/A N/A 0.032 태국 THB 37.13 38.98 34.91 37.50 36.76 0.029 싱가포르 SGD 962.15 981.29 943.01 971.77 952.53 0.739 말레이시아 MYR 278.97 299.61 258.33 N/A 276.19 0.214 인도네시아 IDR 100 8.66 9.52 7.80 8.74 8.58 0.007 카타르 QAR 357.12 N/A N/A N/A N/A 0.274 카자흐스탄 KZT 2.92 N/A N/A N/A N/A 0.002 브루나이 BND 962.15 1,000.63 904.43 N/A N/A 0.739 인도 INR 15.81 N/A N/A N/A N/A 0.012 파키스탄 PKR 4.69 N/A N/A N/A N/A 0.004 방글라데시 BDT 12.00 N/A N/A N/A N/A 0.009 필리핀 PHP 23.42 25.76 21.50 23.65 23.19 0.018 멕시코 MXN 76.54 84.57 68.51 77.30 75.78 0.059 브라질 BRL 268.40 295.77 241.56 N/A 265.18 0.206 베트남 VND 100 5.48 6.12 4.84 5.53 5.43 0.004 남아프리카 공화국 ZAR 69.33 74.87 63.79 70.16 68.50 0.053 러시아 RUB 14.34 15.70 11.84 14.84 13.84 0.011 헝가리 HUF 3.70 4.04 3.41 3.74 3.66 0.003 폴란드 PLN 316.35 341.65 291.05 319.82 312.88 0.243 스리랑카 LKR 4.24 N/A N/A N/A N/A 0.003 알제리 DZD 9.57 N/A N/A N/A N/A 0.007 케냐 KES 9.24 N/A N/A N/A N/A 0.007 콜롬비아 COP 0.32 N/A N/A N/A N/A 0.000 탄자니아 TZS 0.54 N/A N/A N/A N/A 0.000 네팔 NPR 9.89 N/A N/A N/A N/A 0.008 루마니아 RON 285.29 N/A N/A N/A N/A 0.219 리비아 LYD 270.20 N/A N/A 272.90 267.50 0.208 마카오 MOP 161.16 N/A N/A N/A N/A 0.124 미얀마 MMK 0.62 N/A N/A N/A N/A 0.001 에티오피아 ETB 23.65 N/A N/A N/A N/A 0.018 우즈베키스탄 UZS 0.11 N/A N/A N/A N/A 0.000 캄보디아 KHR 0.32 N/A N/A N/A N/A 0.000 피지 FJD 584.91 N/A N/A N/A N/A 0.449
currency_list = []
for tr in currency_body.find_elements(By.TAG_NAME, 'tr'):
currency_list.append(tr.text.split())
조회한 데이터를 DataFrame으로 변환합니다.
# 조회한 환율 정보 테이블을 DataFrame 변환
pd.DataFrame(currency_list)
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
---|---|---|---|---|---|---|---|---|---|
0 | 미국 | USD | 1,301.40 | 1,324.17 | 1,278.63 | 1,314.10 | 1,288.70 | 1.000 | None |
1 | 유럽연합 | EUR | 1,412.28 | 1,440.38 | 1,384.18 | 1,426.40 | 1,398.16 | 1.085 | None |
2 | 일본 | JPY | (100엔) | 901.22 | 916.99 | 885.45 | 910.05 | 892.39 | 0.693 |
3 | 중국 | CNY | 179.36 | 188.32 | 170.40 | 181.15 | 177.57 | 0.138 | None |
4 | 홍콩 | HKD | 166.39 | 169.66 | 163.12 | 168.05 | 164.73 | 0.128 | None |
5 | 대만 | TWD | 41.69 | 47.15 | 37.53 | N/A | N/A | 0.032 | None |
6 | 영국 | GBP | 1,653.75 | 1,686.32 | 1,621.18 | 1,670.28 | 1,637.22 | 1.271 | None |
7 | 오만 | OMR | 3,380.35 | 3,616.97 | 3,143.73 | N/A | N/A | 2.598 | None |
8 | 캐나다 | CAD | 979.75 | 999.05 | 960.45 | 989.54 | 969.96 | 0.753 | None |
9 | 스위스 | CHF | 1,448.66 | 1,477.19 | 1,420.13 | 1,463.14 | 1,434.18 | 1.113 | None |
10 | 스웨덴 | SEK | 118.82 | 121.73 | 115.91 | 120.00 | 117.64 | 0.091 | None |
11 | 호주 | AUD | 867.58 | 884.67 | 850.49 | 876.25 | 858.91 | 0.667 | None |
12 | 뉴질랜드 | NZD | 805.24 | 821.10 | 789.38 | 813.29 | 797.19 | 0.619 | None |
13 | 체코 | CZK | 59.44 | 64.49 | 54.10 | 60.09 | 58.79 | 0.046 | None |
14 | 칠레 | CLP | 1.63 | 1.79 | 1.47 | N/A | N/A | 0.001 | None |
15 | 튀르키예 | TRY | 50.05 | N/A | N/A | 50.60 | 49.50 | 0.039 | None |
16 | 몽골 | MNT | 0.38 | N/A | N/A | N/A | N/A | 0.000 | None |
17 | 이스라엘 | ILS | 351.78 | 386.95 | 323.64 | N/A | N/A | 0.270 | None |
18 | 덴마크 | DKK | 189.60 | 194.24 | 184.96 | 191.49 | 187.71 | 0.146 | None |
19 | 노르웨이 | NOK | 121.95 | 124.93 | 118.97 | 123.16 | 120.74 | 0.094 | None |
20 | 사우디아라비아 | SAR | 346.96 | 368.81 | 323.02 | 350.42 | 343.50 | 0.267 | None |
21 | 쿠웨이트 | KWD | 4,234.95 | 4,510.22 | 3,896.16 | 4,277.29 | 4,192.61 | 3.254 | None |
22 | 바레인 | BHD | 3,452.08 | 3,673.01 | 3,175.92 | 3,486.60 | 3,417.56 | 2.653 | None |
23 | 아랍에미리트 | AED | 354.33 | 373.81 | 329.89 | 357.87 | 350.79 | 0.272 | None |
24 | 요르단 | JOD | 1,834.64 | 1,997.92 | 1,687.87 | N/A | N/A | 1.410 | None |
25 | 이집트 | EGP | 42.12 | N/A | N/A | N/A | N/A | 0.032 | None |
26 | 태국 | THB | 37.13 | 38.98 | 34.91 | 37.50 | 36.76 | 0.029 | None |
27 | 싱가포르 | SGD | 962.15 | 981.29 | 943.01 | 971.77 | 952.53 | 0.739 | None |
28 | 말레이시아 | MYR | 278.97 | 299.61 | 258.33 | N/A | 276.19 | 0.214 | None |
29 | 인도네시아 | IDR | 100 | 8.66 | 9.52 | 7.80 | 8.74 | 8.58 | 0.007 |
30 | 카타르 | QAR | 357.12 | N/A | N/A | N/A | N/A | 0.274 | None |
31 | 카자흐스탄 | KZT | 2.92 | N/A | N/A | N/A | N/A | 0.002 | None |
32 | 브루나이 | BND | 962.15 | 1,000.63 | 904.43 | N/A | N/A | 0.739 | None |
33 | 인도 | INR | 15.81 | N/A | N/A | N/A | N/A | 0.012 | None |
34 | 파키스탄 | PKR | 4.69 | N/A | N/A | N/A | N/A | 0.004 | None |
35 | 방글라데시 | BDT | 12.00 | N/A | N/A | N/A | N/A | 0.009 | None |
36 | 필리핀 | PHP | 23.42 | 25.76 | 21.50 | 23.65 | 23.19 | 0.018 | None |
37 | 멕시코 | MXN | 76.54 | 84.57 | 68.51 | 77.30 | 75.78 | 0.059 | None |
38 | 브라질 | BRL | 268.40 | 295.77 | 241.56 | N/A | 265.18 | 0.206 | None |
39 | 베트남 | VND | 100 | 5.48 | 6.12 | 4.84 | 5.53 | 5.43 | 0.004 |
40 | 남아프리카 | 공화국 | ZAR | 69.33 | 74.87 | 63.79 | 70.16 | 68.50 | 0.053 |
41 | 러시아 | RUB | 14.34 | 15.70 | 11.84 | 14.84 | 13.84 | 0.011 | None |
42 | 헝가리 | HUF | 3.70 | 4.04 | 3.41 | 3.74 | 3.66 | 0.003 | None |
43 | 폴란드 | PLN | 316.35 | 341.65 | 291.05 | 319.82 | 312.88 | 0.243 | None |
44 | 스리랑카 | LKR | 4.24 | N/A | N/A | N/A | N/A | 0.003 | None |
45 | 알제리 | DZD | 9.57 | N/A | N/A | N/A | N/A | 0.007 | None |
46 | 케냐 | KES | 9.24 | N/A | N/A | N/A | N/A | 0.007 | None |
47 | 콜롬비아 | COP | 0.32 | N/A | N/A | N/A | N/A | 0.000 | None |
48 | 탄자니아 | TZS | 0.54 | N/A | N/A | N/A | N/A | 0.000 | None |
49 | 네팔 | NPR | 9.89 | N/A | N/A | N/A | N/A | 0.008 | None |
50 | 루마니아 | RON | 285.29 | N/A | N/A | N/A | N/A | 0.219 | None |
51 | 리비아 | LYD | 270.20 | N/A | N/A | 272.90 | 267.50 | 0.208 | None |
52 | 마카오 | MOP | 161.16 | N/A | N/A | N/A | N/A | 0.124 | None |
53 | 미얀마 | MMK | 0.62 | N/A | N/A | N/A | N/A | 0.001 | None |
54 | 에티오피아 | ETB | 23.65 | N/A | N/A | N/A | N/A | 0.018 | None |
55 | 우즈베키스탄 | UZS | 0.11 | N/A | N/A | N/A | N/A | 0.000 | None |
56 | 캄보디아 | KHR | 0.32 | N/A | N/A | N/A | N/A | 0.000 | None |
57 | 피지 | FJD | 584.91 | N/A | N/A | N/A | N/A | 0.449 | None |
(시행착오 1) 테이블 데이터 전처리
숫자가 처음 등장하는 index를 반환하는 함수
import re
# 정규표현식을 활용하여 숫자가 처음 등장하는 index를 반환하는 함수 구현
def find_number(text):
pattern = r'\d'
match = re.search(pattern, text)
if match:
# 숫자가 처음 등장하는 인덱스
return match.start()
else:
# No Numbers Found
return 0
# 각 행의 데이터를 '통화명' / '데이터' 로 구분하기 위하여 위의 함수를 구현 후 적용
print(tr.text)
print('---'*10)
idx = find_number(tr.text)
print(tr.text[:idx])
print(tr.text[idx:])
피지 FJD 584.91 N/A N/A N/A N/A 0.449 ------------------------------ 피지 FJD 584.91 N/A N/A N/A N/A 0.449
테이블 반복문에 적용
# 환율 딕셔너리 생성
currency_dict = dict()
for tr in currency_body.find_elements(By.TAG_NAME, 'tr'):
# 나라별 환율 정보 행
row = tr.text
# 구분 인덱스
idx = find_number(row)
# 분할
name = row[:idx].strip()
data = row[idx:]
# 정보 업데이트
currency_dict[name] = data.split()
currency_dict
{'미국 USD': ['1,301.40', '1,324.17', '1,278.63', '1,314.10', '1,288.70', '1.000'], '유럽연합 EUR': ['1,412.28', '1,440.38', '1,384.18', '1,426.40', '1,398.16', '1.085'], '일본 JPY (': ['100엔)', '901.22', '916.99', '885.45', '910.05', '892.39', '0.693'], '중국 CNY': ['179.36', '188.32', '170.40', '181.15', '177.57', '0.138'], '홍콩 HKD': ['166.39', '169.66', '163.12', '168.05', '164.73', '0.128'], '대만 TWD': ['41.69', '47.15', '37.53', 'N/A', 'N/A', '0.032'], '영국 GBP': ['1,653.75', '1,686.32', '1,621.18', '1,670.28', '1,637.22', '1.271'], '오만 OMR': ['3,380.35', '3,616.97', '3,143.73', 'N/A', 'N/A', '2.598'], '캐나다 CAD': ['979.75', '999.05', '960.45', '989.54', '969.96', '0.753'], '스위스 CHF': ['1,448.66', '1,477.19', '1,420.13', '1,463.14', '1,434.18', '1.113'], '스웨덴 SEK': ['118.82', '121.73', '115.91', '120.00', '117.64', '0.091'], '호주 AUD': ['867.58', '884.67', '850.49', '876.25', '858.91', '0.667'], '뉴질랜드 NZD': ['805.24', '821.10', '789.38', '813.29', '797.19', '0.619'], '체코 CZK': ['59.44', '64.49', '54.10', '60.09', '58.79', '0.046'], '칠레 CLP': ['1.63', '1.79', '1.47', 'N/A', 'N/A', '0.001'], '튀르키예 TRY': ['50.05', 'N/A', 'N/A', '50.60', '49.50', '0.039'], '몽골 MNT': ['0.38', 'N/A', 'N/A', 'N/A', 'N/A', '0.000'], '이스라엘 ILS': ['351.78', '386.95', '323.64', 'N/A', 'N/A', '0.270'], '덴마크 DKK': ['189.60', '194.24', '184.96', '191.49', '187.71', '0.146'], '노르웨이 NOK': ['121.95', '124.93', '118.97', '123.16', '120.74', '0.094'], '사우디아라비아 SAR': ['346.96', '368.81', '323.02', '350.42', '343.50', '0.267'], '쿠웨이트 KWD': ['4,234.95', '4,510.22', '3,896.16', '4,277.29', '4,192.61', '3.254'], '바레인 BHD': ['3,452.08', '3,673.01', '3,175.92', '3,486.60', '3,417.56', '2.653'], '아랍에미리트 AED': ['354.33', '373.81', '329.89', '357.87', '350.79', '0.272'], '요르단 JOD': ['1,834.64', '1,997.92', '1,687.87', 'N/A', 'N/A', '1.410'], '이집트 EGP': ['42.12', 'N/A', 'N/A', 'N/A', 'N/A', '0.032'], '태국 THB': ['37.13', '38.98', '34.91', '37.50', '36.76', '0.029'], '싱가포르 SGD': ['962.15', '981.29', '943.01', '971.77', '952.53', '0.739'], '말레이시아 MYR': ['278.97', '299.61', '258.33', 'N/A', '276.19', '0.214'], '인도네시아 IDR': ['100', '8.66', '9.52', '7.80', '8.74', '8.58', '0.007'], '카타르 QAR': ['357.12', 'N/A', 'N/A', 'N/A', 'N/A', '0.274'], '카자흐스탄 KZT': ['2.92', 'N/A', 'N/A', 'N/A', 'N/A', '0.002'], '브루나이 BND': ['962.15', '1,000.63', '904.43', 'N/A', 'N/A', '0.739'], '인도 INR': ['15.81', 'N/A', 'N/A', 'N/A', 'N/A', '0.012'], '파키스탄 PKR': ['4.69', 'N/A', 'N/A', 'N/A', 'N/A', '0.004'], '방글라데시 BDT': ['12.00', 'N/A', 'N/A', 'N/A', 'N/A', '0.009'], '필리핀 PHP': ['23.42', '25.76', '21.50', '23.65', '23.19', '0.018'], '멕시코 MXN': ['76.54', '84.57', '68.51', '77.30', '75.78', '0.059'], '브라질 BRL': ['268.40', '295.77', '241.56', 'N/A', '265.18', '0.206'], '베트남 VND': ['100', '5.48', '6.12', '4.84', '5.53', '5.43', '0.004'], '남아프리카 공화국 ZAR': ['69.33', '74.87', '63.79', '70.16', '68.50', '0.053'], '러시아 RUB': ['14.34', '15.70', '11.84', '14.84', '13.84', '0.011'], '헝가리 HUF': ['3.70', '4.04', '3.41', '3.74', '3.66', '0.003'], '폴란드 PLN': ['316.35', '341.65', '291.05', '319.82', '312.88', '0.243'], '스리랑카 LKR': ['4.24', 'N/A', 'N/A', 'N/A', 'N/A', '0.003'], '알제리 DZD': ['9.57', 'N/A', 'N/A', 'N/A', 'N/A', '0.007'], '케냐 KES': ['9.24', 'N/A', 'N/A', 'N/A', 'N/A', '0.007'], '콜롬비아 COP': ['0.32', 'N/A', 'N/A', 'N/A', 'N/A', '0.000'], '탄자니아 TZS': ['0.54', 'N/A', 'N/A', 'N/A', 'N/A', '0.000'], '네팔 NPR': ['9.89', 'N/A', 'N/A', 'N/A', 'N/A', '0.008'], '루마니아 RON': ['285.29', 'N/A', 'N/A', 'N/A', 'N/A', '0.219'], '리비아 LYD': ['270.20', 'N/A', 'N/A', '272.90', '267.50', '0.208'], '마카오 MOP': ['161.16', 'N/A', 'N/A', 'N/A', 'N/A', '0.124'], '미얀마 MMK': ['0.62', 'N/A', 'N/A', 'N/A', 'N/A', '0.001'], '에티오피아 ETB': ['23.65', 'N/A', 'N/A', 'N/A', 'N/A', '0.018'], '우즈베키스탄 UZS': ['0.11', 'N/A', 'N/A', 'N/A', 'N/A', '0.000'], '캄보디아 KHR': ['0.32', 'N/A', 'N/A', 'N/A', 'N/A', '0.000'], '피지 FJD': ['584.91', 'N/A', 'N/A', 'N/A', 'N/A', '0.449']}
# 일본 (100엔) 데이터,
# 인도네시다 IDR 100 데이터
# 베트남 VND 100 때문에 오류 발생
pd.DataFrame(currency_dict)
(시행착오 2)일본, 인도네시아, 베트남 통화명 오류 처리
# 확장성을 위하여 함수로 만들었습니다. (유지보수에 용이)
def clean_currency_title(text):
cleaned_text = text.replace(r'(100엔)', '') # 일본 엔화
cleaned_text = cleaned_text.replace(r'IDR 100', 'IDR') # 인도네시아
cleaned_text = cleaned_text.replace(r'VND 100', 'VND') # 베트남
cleaned_text = cleaned_text.replace(r',', '') # 통화 1,000 단위 콤마 제거
return cleaned_text
# 환율 딕셔너리 생성
currency_dict = dict()
for tr in currency_body.find_elements(By.TAG_NAME, 'tr'):
# 나라별 환율 정보 행, (100엔) 제거 처리, IDR 100 -> IDR 로 변경 처리
row = clean_currency_title(tr.text)
# 구분 인덱스
idx = find_number(row)
# 분할
name = row[:idx].strip()
data = row[idx:]
# 정보 업데이트
currency_dict[name] = data.split()
# print(name, len(data.split()))
currency_dict
{'미국 USD': ['1301.40', '1324.17', '1278.63', '1314.10', '1288.70', '1.000'], '유럽연합 EUR': ['1412.28', '1440.38', '1384.18', '1426.40', '1398.16', '1.085'], '일본 JPY': ['901.22', '916.99', '885.45', '910.05', '892.39', '0.693'], '중국 CNY': ['179.36', '188.32', '170.40', '181.15', '177.57', '0.138'], '홍콩 HKD': ['166.39', '169.66', '163.12', '168.05', '164.73', '0.128'], '대만 TWD': ['41.69', '47.15', '37.53', 'N/A', 'N/A', '0.032'], '영국 GBP': ['1653.75', '1686.32', '1621.18', '1670.28', '1637.22', '1.271'], '오만 OMR': ['3380.35', '3616.97', '3143.73', 'N/A', 'N/A', '2.598'], '캐나다 CAD': ['979.75', '999.05', '960.45', '989.54', '969.96', '0.753'], '스위스 CHF': ['1448.66', '1477.19', '1420.13', '1463.14', '1434.18', '1.113'], '스웨덴 SEK': ['118.82', '121.73', '115.91', '120.00', '117.64', '0.091'], '호주 AUD': ['867.58', '884.67', '850.49', '876.25', '858.91', '0.667'], '뉴질랜드 NZD': ['805.24', '821.10', '789.38', '813.29', '797.19', '0.619'], '체코 CZK': ['59.44', '64.49', '54.10', '60.09', '58.79', '0.046'], '칠레 CLP': ['1.63', '1.79', '1.47', 'N/A', 'N/A', '0.001'], '튀르키예 TRY': ['50.05', 'N/A', 'N/A', '50.60', '49.50', '0.039'], '몽골 MNT': ['0.38', 'N/A', 'N/A', 'N/A', 'N/A', '0.000'], '이스라엘 ILS': ['351.78', '386.95', '323.64', 'N/A', 'N/A', '0.270'], '덴마크 DKK': ['189.60', '194.24', '184.96', '191.49', '187.71', '0.146'], '노르웨이 NOK': ['121.95', '124.93', '118.97', '123.16', '120.74', '0.094'], '사우디아라비아 SAR': ['346.96', '368.81', '323.02', '350.42', '343.50', '0.267'], '쿠웨이트 KWD': ['4234.95', '4510.22', '3896.16', '4277.29', '4192.61', '3.254'], '바레인 BHD': ['3452.08', '3673.01', '3175.92', '3486.60', '3417.56', '2.653'], '아랍에미리트 AED': ['354.33', '373.81', '329.89', '357.87', '350.79', '0.272'], '요르단 JOD': ['1834.64', '1997.92', '1687.87', 'N/A', 'N/A', '1.410'], '이집트 EGP': ['42.12', 'N/A', 'N/A', 'N/A', 'N/A', '0.032'], '태국 THB': ['37.13', '38.98', '34.91', '37.50', '36.76', '0.029'], '싱가포르 SGD': ['962.15', '981.29', '943.01', '971.77', '952.53', '0.739'], '말레이시아 MYR': ['278.97', '299.61', '258.33', 'N/A', '276.19', '0.214'], '인도네시아 IDR': ['8.66', '9.52', '7.80', '8.74', '8.58', '0.007'], '카타르 QAR': ['357.12', 'N/A', 'N/A', 'N/A', 'N/A', '0.274'], '카자흐스탄 KZT': ['2.92', 'N/A', 'N/A', 'N/A', 'N/A', '0.002'], '브루나이 BND': ['962.15', '1000.63', '904.43', 'N/A', 'N/A', '0.739'], '인도 INR': ['15.81', 'N/A', 'N/A', 'N/A', 'N/A', '0.012'], '파키스탄 PKR': ['4.69', 'N/A', 'N/A', 'N/A', 'N/A', '0.004'], '방글라데시 BDT': ['12.00', 'N/A', 'N/A', 'N/A', 'N/A', '0.009'], '필리핀 PHP': ['23.42', '25.76', '21.50', '23.65', '23.19', '0.018'], '멕시코 MXN': ['76.54', '84.57', '68.51', '77.30', '75.78', '0.059'], '브라질 BRL': ['268.40', '295.77', '241.56', 'N/A', '265.18', '0.206'], '베트남 VND': ['5.48', '6.12', '4.84', '5.53', '5.43', '0.004'], '남아프리카 공화국 ZAR': ['69.33', '74.87', '63.79', '70.16', '68.50', '0.053'], '러시아 RUB': ['14.34', '15.70', '11.84', '14.84', '13.84', '0.011'], '헝가리 HUF': ['3.70', '4.04', '3.41', '3.74', '3.66', '0.003'], '폴란드 PLN': ['316.35', '341.65', '291.05', '319.82', '312.88', '0.243'], '스리랑카 LKR': ['4.24', 'N/A', 'N/A', 'N/A', 'N/A', '0.003'], '알제리 DZD': ['9.57', 'N/A', 'N/A', 'N/A', 'N/A', '0.007'], '케냐 KES': ['9.24', 'N/A', 'N/A', 'N/A', 'N/A', '0.007'], '콜롬비아 COP': ['0.32', 'N/A', 'N/A', 'N/A', 'N/A', '0.000'], '탄자니아 TZS': ['0.54', 'N/A', 'N/A', 'N/A', 'N/A', '0.000'], '네팔 NPR': ['9.89', 'N/A', 'N/A', 'N/A', 'N/A', '0.008'], '루마니아 RON': ['285.29', 'N/A', 'N/A', 'N/A', 'N/A', '0.219'], '리비아 LYD': ['270.20', 'N/A', 'N/A', '272.90', '267.50', '0.208'], '마카오 MOP': ['161.16', 'N/A', 'N/A', 'N/A', 'N/A', '0.124'], '미얀마 MMK': ['0.62', 'N/A', 'N/A', 'N/A', 'N/A', '0.001'], '에티오피아 ETB': ['23.65', 'N/A', 'N/A', 'N/A', 'N/A', '0.018'], '우즈베키스탄 UZS': ['0.11', 'N/A', 'N/A', 'N/A', 'N/A', '0.000'], '캄보디아 KHR': ['0.32', 'N/A', 'N/A', 'N/A', 'N/A', '0.000'], '피지 FJD': ['584.91', 'N/A', 'N/A', 'N/A', 'N/A', '0.449']}
데이터 프레임 생성
df = pd.DataFrame(currency_dict).T.reset_index()
df.columns = ['통화명', '환율', '현찰_buy', '현찰_sell', '송금_send', '송금_receive', '미화환산율']
df
통화명 | 환율 | 현찰_buy | 현찰_sell | 송금_send | 송금_receive | 미화환산율 | |
---|---|---|---|---|---|---|---|
0 | 미국 USD | 1301.40 | 1324.17 | 1278.63 | 1314.10 | 1288.70 | 1.000 |
1 | 유럽연합 EUR | 1412.28 | 1440.38 | 1384.18 | 1426.40 | 1398.16 | 1.085 |
2 | 일본 JPY | 901.22 | 916.99 | 885.45 | 910.05 | 892.39 | 0.693 |
3 | 중국 CNY | 179.36 | 188.32 | 170.40 | 181.15 | 177.57 | 0.138 |
4 | 홍콩 HKD | 166.39 | 169.66 | 163.12 | 168.05 | 164.73 | 0.128 |
5 | 대만 TWD | 41.69 | 47.15 | 37.53 | N/A | N/A | 0.032 |
6 | 영국 GBP | 1653.75 | 1686.32 | 1621.18 | 1670.28 | 1637.22 | 1.271 |
7 | 오만 OMR | 3380.35 | 3616.97 | 3143.73 | N/A | N/A | 2.598 |
8 | 캐나다 CAD | 979.75 | 999.05 | 960.45 | 989.54 | 969.96 | 0.753 |
9 | 스위스 CHF | 1448.66 | 1477.19 | 1420.13 | 1463.14 | 1434.18 | 1.113 |
10 | 스웨덴 SEK | 118.82 | 121.73 | 115.91 | 120.00 | 117.64 | 0.091 |
11 | 호주 AUD | 867.58 | 884.67 | 850.49 | 876.25 | 858.91 | 0.667 |
12 | 뉴질랜드 NZD | 805.24 | 821.10 | 789.38 | 813.29 | 797.19 | 0.619 |
13 | 체코 CZK | 59.44 | 64.49 | 54.10 | 60.09 | 58.79 | 0.046 |
14 | 칠레 CLP | 1.63 | 1.79 | 1.47 | N/A | N/A | 0.001 |
15 | 튀르키예 TRY | 50.05 | N/A | N/A | 50.60 | 49.50 | 0.039 |
16 | 몽골 MNT | 0.38 | N/A | N/A | N/A | N/A | 0.000 |
17 | 이스라엘 ILS | 351.78 | 386.95 | 323.64 | N/A | N/A | 0.270 |
18 | 덴마크 DKK | 189.60 | 194.24 | 184.96 | 191.49 | 187.71 | 0.146 |
19 | 노르웨이 NOK | 121.95 | 124.93 | 118.97 | 123.16 | 120.74 | 0.094 |
20 | 사우디아라비아 SAR | 346.96 | 368.81 | 323.02 | 350.42 | 343.50 | 0.267 |
21 | 쿠웨이트 KWD | 4234.95 | 4510.22 | 3896.16 | 4277.29 | 4192.61 | 3.254 |
22 | 바레인 BHD | 3452.08 | 3673.01 | 3175.92 | 3486.60 | 3417.56 | 2.653 |
23 | 아랍에미리트 AED | 354.33 | 373.81 | 329.89 | 357.87 | 350.79 | 0.272 |
24 | 요르단 JOD | 1834.64 | 1997.92 | 1687.87 | N/A | N/A | 1.410 |
25 | 이집트 EGP | 42.12 | N/A | N/A | N/A | N/A | 0.032 |
26 | 태국 THB | 37.13 | 38.98 | 34.91 | 37.50 | 36.76 | 0.029 |
27 | 싱가포르 SGD | 962.15 | 981.29 | 943.01 | 971.77 | 952.53 | 0.739 |
28 | 말레이시아 MYR | 278.97 | 299.61 | 258.33 | N/A | 276.19 | 0.214 |
29 | 인도네시아 IDR | 8.66 | 9.52 | 7.80 | 8.74 | 8.58 | 0.007 |
30 | 카타르 QAR | 357.12 | N/A | N/A | N/A | N/A | 0.274 |
31 | 카자흐스탄 KZT | 2.92 | N/A | N/A | N/A | N/A | 0.002 |
32 | 브루나이 BND | 962.15 | 1000.63 | 904.43 | N/A | N/A | 0.739 |
33 | 인도 INR | 15.81 | N/A | N/A | N/A | N/A | 0.012 |
34 | 파키스탄 PKR | 4.69 | N/A | N/A | N/A | N/A | 0.004 |
35 | 방글라데시 BDT | 12.00 | N/A | N/A | N/A | N/A | 0.009 |
36 | 필리핀 PHP | 23.42 | 25.76 | 21.50 | 23.65 | 23.19 | 0.018 |
37 | 멕시코 MXN | 76.54 | 84.57 | 68.51 | 77.30 | 75.78 | 0.059 |
38 | 브라질 BRL | 268.40 | 295.77 | 241.56 | N/A | 265.18 | 0.206 |
39 | 베트남 VND | 5.48 | 6.12 | 4.84 | 5.53 | 5.43 | 0.004 |
40 | 남아프리카 공화국 ZAR | 69.33 | 74.87 | 63.79 | 70.16 | 68.50 | 0.053 |
41 | 러시아 RUB | 14.34 | 15.70 | 11.84 | 14.84 | 13.84 | 0.011 |
42 | 헝가리 HUF | 3.70 | 4.04 | 3.41 | 3.74 | 3.66 | 0.003 |
43 | 폴란드 PLN | 316.35 | 341.65 | 291.05 | 319.82 | 312.88 | 0.243 |
44 | 스리랑카 LKR | 4.24 | N/A | N/A | N/A | N/A | 0.003 |
45 | 알제리 DZD | 9.57 | N/A | N/A | N/A | N/A | 0.007 |
46 | 케냐 KES | 9.24 | N/A | N/A | N/A | N/A | 0.007 |
47 | 콜롬비아 COP | 0.32 | N/A | N/A | N/A | N/A | 0.000 |
48 | 탄자니아 TZS | 0.54 | N/A | N/A | N/A | N/A | 0.000 |
49 | 네팔 NPR | 9.89 | N/A | N/A | N/A | N/A | 0.008 |
50 | 루마니아 RON | 285.29 | N/A | N/A | N/A | N/A | 0.219 |
51 | 리비아 LYD | 270.20 | N/A | N/A | 272.90 | 267.50 | 0.208 |
52 | 마카오 MOP | 161.16 | N/A | N/A | N/A | N/A | 0.124 |
53 | 미얀마 MMK | 0.62 | N/A | N/A | N/A | N/A | 0.001 |
54 | 에티오피아 ETB | 23.65 | N/A | N/A | N/A | N/A | 0.018 |
55 | 우즈베키스탄 UZS | 0.11 | N/A | N/A | N/A | N/A | 0.000 |
56 | 캄보디아 KHR | 0.32 | N/A | N/A | N/A | N/A | 0.000 |
57 | 피지 FJD | 584.91 | N/A | N/A | N/A | N/A | 0.449 |
데이터 타입 변환
df.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 58 entries, 0 to 57 Data columns (total 7 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 통화명 58 non-null object 1 환율 58 non-null object 2 현찰_buy 58 non-null object 3 현찰_sell 58 non-null object 4 송금_send 58 non-null object 5 송금_receive 58 non-null object 6 미화환산율 58 non-null object dtypes: object(7) memory usage: 3.3+ KB
# 환율 정보를 object -> float 로 변경
df['환율'] = pd.to_numeric(df['환율'], errors='coerce')
df.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 58 entries, 0 to 57 Data columns (total 7 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 통화명 58 non-null object 1 환율 58 non-null float64 2 현찰_buy 58 non-null object 3 현찰_sell 58 non-null object 4 송금_send 58 non-null object 5 송금_receive 58 non-null object 6 미화환산율 58 non-null object dtypes: float64(1), object(6) memory usage: 3.3+ KB
for col in df.loc[:, '환율':].columns:
# 숫자는 숫자로 변환, 나머지는 결측치로 치환
df[col] = pd.to_numeric(df[col], errors='coerce')
df.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 58 entries, 0 to 57 Data columns (total 7 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 통화명 58 non-null object 1 환율 58 non-null float64 2 현찰_buy 36 non-null float64 3 현찰_sell 36 non-null float64 4 송금_send 30 non-null float64 5 송금_receive 32 non-null float64 6 미화환산율 58 non-null float64 dtypes: float64(6), object(1) memory usage: 3.3+ KB
전처리가 끝난 데이터프레임을 출력합니다.
df
통화명 | 환율 | 현찰_buy | 현찰_sell | 송금_send | 송금_receive | 미화환산율 | |
---|---|---|---|---|---|---|---|
0 | 미국 USD | 1301.40 | 1324.17 | 1278.63 | 1314.10 | 1288.70 | 1.000 |
1 | 유럽연합 EUR | 1412.28 | 1440.38 | 1384.18 | 1426.40 | 1398.16 | 1.085 |
2 | 일본 JPY | 901.22 | 916.99 | 885.45 | 910.05 | 892.39 | 0.693 |
3 | 중국 CNY | 179.36 | 188.32 | 170.40 | 181.15 | 177.57 | 0.138 |
4 | 홍콩 HKD | 166.39 | 169.66 | 163.12 | 168.05 | 164.73 | 0.128 |
5 | 대만 TWD | 41.69 | 47.15 | 37.53 | NaN | NaN | 0.032 |
6 | 영국 GBP | 1653.75 | 1686.32 | 1621.18 | 1670.28 | 1637.22 | 1.271 |
7 | 오만 OMR | 3380.35 | 3616.97 | 3143.73 | NaN | NaN | 2.598 |
8 | 캐나다 CAD | 979.75 | 999.05 | 960.45 | 989.54 | 969.96 | 0.753 |
9 | 스위스 CHF | 1448.66 | 1477.19 | 1420.13 | 1463.14 | 1434.18 | 1.113 |
10 | 스웨덴 SEK | 118.82 | 121.73 | 115.91 | 120.00 | 117.64 | 0.091 |
11 | 호주 AUD | 867.58 | 884.67 | 850.49 | 876.25 | 858.91 | 0.667 |
12 | 뉴질랜드 NZD | 805.24 | 821.10 | 789.38 | 813.29 | 797.19 | 0.619 |
13 | 체코 CZK | 59.44 | 64.49 | 54.10 | 60.09 | 58.79 | 0.046 |
14 | 칠레 CLP | 1.63 | 1.79 | 1.47 | NaN | NaN | 0.001 |
15 | 튀르키예 TRY | 50.05 | NaN | NaN | 50.60 | 49.50 | 0.039 |
16 | 몽골 MNT | 0.38 | NaN | NaN | NaN | NaN | 0.000 |
17 | 이스라엘 ILS | 351.78 | 386.95 | 323.64 | NaN | NaN | 0.270 |
18 | 덴마크 DKK | 189.60 | 194.24 | 184.96 | 191.49 | 187.71 | 0.146 |
19 | 노르웨이 NOK | 121.95 | 124.93 | 118.97 | 123.16 | 120.74 | 0.094 |
20 | 사우디아라비아 SAR | 346.96 | 368.81 | 323.02 | 350.42 | 343.50 | 0.267 |
21 | 쿠웨이트 KWD | 4234.95 | 4510.22 | 3896.16 | 4277.29 | 4192.61 | 3.254 |
22 | 바레인 BHD | 3452.08 | 3673.01 | 3175.92 | 3486.60 | 3417.56 | 2.653 |
23 | 아랍에미리트 AED | 354.33 | 373.81 | 329.89 | 357.87 | 350.79 | 0.272 |
24 | 요르단 JOD | 1834.64 | 1997.92 | 1687.87 | NaN | NaN | 1.410 |
25 | 이집트 EGP | 42.12 | NaN | NaN | NaN | NaN | 0.032 |
26 | 태국 THB | 37.13 | 38.98 | 34.91 | 37.50 | 36.76 | 0.029 |
27 | 싱가포르 SGD | 962.15 | 981.29 | 943.01 | 971.77 | 952.53 | 0.739 |
28 | 말레이시아 MYR | 278.97 | 299.61 | 258.33 | NaN | 276.19 | 0.214 |
29 | 인도네시아 IDR | 8.66 | 9.52 | 7.80 | 8.74 | 8.58 | 0.007 |
30 | 카타르 QAR | 357.12 | NaN | NaN | NaN | NaN | 0.274 |
31 | 카자흐스탄 KZT | 2.92 | NaN | NaN | NaN | NaN | 0.002 |
32 | 브루나이 BND | 962.15 | 1000.63 | 904.43 | NaN | NaN | 0.739 |
33 | 인도 INR | 15.81 | NaN | NaN | NaN | NaN | 0.012 |
34 | 파키스탄 PKR | 4.69 | NaN | NaN | NaN | NaN | 0.004 |
35 | 방글라데시 BDT | 12.00 | NaN | NaN | NaN | NaN | 0.009 |
36 | 필리핀 PHP | 23.42 | 25.76 | 21.50 | 23.65 | 23.19 | 0.018 |
37 | 멕시코 MXN | 76.54 | 84.57 | 68.51 | 77.30 | 75.78 | 0.059 |
38 | 브라질 BRL | 268.40 | 295.77 | 241.56 | NaN | 265.18 | 0.206 |
39 | 베트남 VND | 5.48 | 6.12 | 4.84 | 5.53 | 5.43 | 0.004 |
40 | 남아프리카 공화국 ZAR | 69.33 | 74.87 | 63.79 | 70.16 | 68.50 | 0.053 |
41 | 러시아 RUB | 14.34 | 15.70 | 11.84 | 14.84 | 13.84 | 0.011 |
42 | 헝가리 HUF | 3.70 | 4.04 | 3.41 | 3.74 | 3.66 | 0.003 |
43 | 폴란드 PLN | 316.35 | 341.65 | 291.05 | 319.82 | 312.88 | 0.243 |
44 | 스리랑카 LKR | 4.24 | NaN | NaN | NaN | NaN | 0.003 |
45 | 알제리 DZD | 9.57 | NaN | NaN | NaN | NaN | 0.007 |
46 | 케냐 KES | 9.24 | NaN | NaN | NaN | NaN | 0.007 |
47 | 콜롬비아 COP | 0.32 | NaN | NaN | NaN | NaN | 0.000 |
48 | 탄자니아 TZS | 0.54 | NaN | NaN | NaN | NaN | 0.000 |
49 | 네팔 NPR | 9.89 | NaN | NaN | NaN | NaN | 0.008 |
50 | 루마니아 RON | 285.29 | NaN | NaN | NaN | NaN | 0.219 |
51 | 리비아 LYD | 270.20 | NaN | NaN | 272.90 | 267.50 | 0.208 |
52 | 마카오 MOP | 161.16 | NaN | NaN | NaN | NaN | 0.124 |
53 | 미얀마 MMK | 0.62 | NaN | NaN | NaN | NaN | 0.001 |
54 | 에티오피아 ETB | 23.65 | NaN | NaN | NaN | NaN | 0.018 |
55 | 우즈베키스탄 UZS | 0.11 | NaN | NaN | NaN | NaN | 0.000 |
56 | 캄보디아 KHR | 0.32 | NaN | NaN | NaN | NaN | 0.000 |
57 | 피지 FJD | 584.91 | NaN | NaN | NaN | NaN | 0.449 |
통화명 분리
df['통화명'].str.split()
0 [미국, USD] 1 [유럽연합, EUR] 2 [일본, JPY] 3 [중국, CNY] 4 [홍콩, HKD] 5 [대만, TWD] 6 [영국, GBP] 7 [오만, OMR] 8 [캐나다, CAD] 9 [스위스, CHF] 10 [스웨덴, SEK] 11 [호주, AUD] 12 [뉴질랜드, NZD] 13 [체코, CZK] 14 [칠레, CLP] 15 [튀르키예, TRY] 16 [몽골, MNT] 17 [이스라엘, ILS] 18 [덴마크, DKK] 19 [노르웨이, NOK] 20 [사우디아라비아, SAR] 21 [쿠웨이트, KWD] 22 [바레인, BHD] 23 [아랍에미리트, AED] 24 [요르단, JOD] 25 [이집트, EGP] 26 [태국, THB] 27 [싱가포르, SGD] 28 [말레이시아, MYR] 29 [인도네시아, IDR] 30 [카타르, QAR] 31 [카자흐스탄, KZT] 32 [브루나이, BND] 33 [인도, INR] 34 [파키스탄, PKR] 35 [방글라데시, BDT] 36 [필리핀, PHP] 37 [멕시코, MXN] 38 [브라질, BRL] 39 [베트남, VND] 40 [남아프리카, 공화국, ZAR] 41 [러시아, RUB] 42 [헝가리, HUF] 43 [폴란드, PLN] 44 [스리랑카, LKR] 45 [알제리, DZD] 46 [케냐, KES] 47 [콜롬비아, COP] 48 [탄자니아, TZS] 49 [네팔, NPR] 50 [루마니아, RON] 51 [리비아, LYD] 52 [마카오, MOP] 53 [미얀마, MMK] 54 [에티오피아, ETB] 55 [우즈베키스탄, UZS] 56 [캄보디아, KHR] 57 [피지, FJD] Name: 통화명, dtype: object
# 통화명에 공백을 기준으로 분리 후,
# 가장 마지막 단어는 통화단위
# 마지막을 제외한 나머지 단어는 통화명
def split_title(title):
# 통화 단위
unit = title.split()[-1]
name = title.split()[:-1]
name = ' '.join(name)
return name, unit
df['통화명'].apply(split_title)
0 (미국, USD) 1 (유럽연합, EUR) 2 (일본, JPY) 3 (중국, CNY) 4 (홍콩, HKD) 5 (대만, TWD) 6 (영국, GBP) 7 (오만, OMR) 8 (캐나다, CAD) 9 (스위스, CHF) 10 (스웨덴, SEK) 11 (호주, AUD) 12 (뉴질랜드, NZD) 13 (체코, CZK) 14 (칠레, CLP) 15 (튀르키예, TRY) 16 (몽골, MNT) 17 (이스라엘, ILS) 18 (덴마크, DKK) 19 (노르웨이, NOK) 20 (사우디아라비아, SAR) 21 (쿠웨이트, KWD) 22 (바레인, BHD) 23 (아랍에미리트, AED) 24 (요르단, JOD) 25 (이집트, EGP) 26 (태국, THB) 27 (싱가포르, SGD) 28 (말레이시아, MYR) 29 (인도네시아, IDR) 30 (카타르, QAR) 31 (카자흐스탄, KZT) 32 (브루나이, BND) 33 (인도, INR) 34 (파키스탄, PKR) 35 (방글라데시, BDT) 36 (필리핀, PHP) 37 (멕시코, MXN) 38 (브라질, BRL) 39 (베트남, VND) 40 (남아프리카 공화국, ZAR) 41 (러시아, RUB) 42 (헝가리, HUF) 43 (폴란드, PLN) 44 (스리랑카, LKR) 45 (알제리, DZD) 46 (케냐, KES) 47 (콜롬비아, COP) 48 (탄자니아, TZS) 49 (네팔, NPR) 50 (루마니아, RON) 51 (리비아, LYD) 52 (마카오, MOP) 53 (미얀마, MMK) 54 (에티오피아, ETB) 55 (우즈베키스탄, UZS) 56 (캄보디아, KHR) 57 (피지, FJD) Name: 통화명, dtype: object
# 통화, 단위로 컬럼 분리
df.insert(1, '통화', df['통화명'].apply(split_title).str[0])
df.insert(2, '단위', df['통화명'].apply(split_title).str[1])
df
통화명 | 통화 | 단위 | 환율 | 현찰_buy | 현찰_sell | 송금_send | 송금_receive | 미화환산율 | |
---|---|---|---|---|---|---|---|---|---|
0 | 미국 USD | 미국 | USD | 1301.40 | 1324.17 | 1278.63 | 1314.10 | 1288.70 | 1.000 |
1 | 유럽연합 EUR | 유럽연합 | EUR | 1412.28 | 1440.38 | 1384.18 | 1426.40 | 1398.16 | 1.085 |
2 | 일본 JPY | 일본 | JPY | 901.22 | 916.99 | 885.45 | 910.05 | 892.39 | 0.693 |
3 | 중국 CNY | 중국 | CNY | 179.36 | 188.32 | 170.40 | 181.15 | 177.57 | 0.138 |
4 | 홍콩 HKD | 홍콩 | HKD | 166.39 | 169.66 | 163.12 | 168.05 | 164.73 | 0.128 |
5 | 대만 TWD | 대만 | TWD | 41.69 | 47.15 | 37.53 | NaN | NaN | 0.032 |
6 | 영국 GBP | 영국 | GBP | 1653.75 | 1686.32 | 1621.18 | 1670.28 | 1637.22 | 1.271 |
7 | 오만 OMR | 오만 | OMR | 3380.35 | 3616.97 | 3143.73 | NaN | NaN | 2.598 |
8 | 캐나다 CAD | 캐나다 | CAD | 979.75 | 999.05 | 960.45 | 989.54 | 969.96 | 0.753 |
9 | 스위스 CHF | 스위스 | CHF | 1448.66 | 1477.19 | 1420.13 | 1463.14 | 1434.18 | 1.113 |
10 | 스웨덴 SEK | 스웨덴 | SEK | 118.82 | 121.73 | 115.91 | 120.00 | 117.64 | 0.091 |
11 | 호주 AUD | 호주 | AUD | 867.58 | 884.67 | 850.49 | 876.25 | 858.91 | 0.667 |
12 | 뉴질랜드 NZD | 뉴질랜드 | NZD | 805.24 | 821.10 | 789.38 | 813.29 | 797.19 | 0.619 |
13 | 체코 CZK | 체코 | CZK | 59.44 | 64.49 | 54.10 | 60.09 | 58.79 | 0.046 |
14 | 칠레 CLP | 칠레 | CLP | 1.63 | 1.79 | 1.47 | NaN | NaN | 0.001 |
15 | 튀르키예 TRY | 튀르키예 | TRY | 50.05 | NaN | NaN | 50.60 | 49.50 | 0.039 |
16 | 몽골 MNT | 몽골 | MNT | 0.38 | NaN | NaN | NaN | NaN | 0.000 |
17 | 이스라엘 ILS | 이스라엘 | ILS | 351.78 | 386.95 | 323.64 | NaN | NaN | 0.270 |
18 | 덴마크 DKK | 덴마크 | DKK | 189.60 | 194.24 | 184.96 | 191.49 | 187.71 | 0.146 |
19 | 노르웨이 NOK | 노르웨이 | NOK | 121.95 | 124.93 | 118.97 | 123.16 | 120.74 | 0.094 |
20 | 사우디아라비아 SAR | 사우디아라비아 | SAR | 346.96 | 368.81 | 323.02 | 350.42 | 343.50 | 0.267 |
21 | 쿠웨이트 KWD | 쿠웨이트 | KWD | 4234.95 | 4510.22 | 3896.16 | 4277.29 | 4192.61 | 3.254 |
22 | 바레인 BHD | 바레인 | BHD | 3452.08 | 3673.01 | 3175.92 | 3486.60 | 3417.56 | 2.653 |
23 | 아랍에미리트 AED | 아랍에미리트 | AED | 354.33 | 373.81 | 329.89 | 357.87 | 350.79 | 0.272 |
24 | 요르단 JOD | 요르단 | JOD | 1834.64 | 1997.92 | 1687.87 | NaN | NaN | 1.410 |
25 | 이집트 EGP | 이집트 | EGP | 42.12 | NaN | NaN | NaN | NaN | 0.032 |
26 | 태국 THB | 태국 | THB | 37.13 | 38.98 | 34.91 | 37.50 | 36.76 | 0.029 |
27 | 싱가포르 SGD | 싱가포르 | SGD | 962.15 | 981.29 | 943.01 | 971.77 | 952.53 | 0.739 |
28 | 말레이시아 MYR | 말레이시아 | MYR | 278.97 | 299.61 | 258.33 | NaN | 276.19 | 0.214 |
29 | 인도네시아 IDR | 인도네시아 | IDR | 8.66 | 9.52 | 7.80 | 8.74 | 8.58 | 0.007 |
30 | 카타르 QAR | 카타르 | QAR | 357.12 | NaN | NaN | NaN | NaN | 0.274 |
31 | 카자흐스탄 KZT | 카자흐스탄 | KZT | 2.92 | NaN | NaN | NaN | NaN | 0.002 |
32 | 브루나이 BND | 브루나이 | BND | 962.15 | 1000.63 | 904.43 | NaN | NaN | 0.739 |
33 | 인도 INR | 인도 | INR | 15.81 | NaN | NaN | NaN | NaN | 0.012 |
34 | 파키스탄 PKR | 파키스탄 | PKR | 4.69 | NaN | NaN | NaN | NaN | 0.004 |
35 | 방글라데시 BDT | 방글라데시 | BDT | 12.00 | NaN | NaN | NaN | NaN | 0.009 |
36 | 필리핀 PHP | 필리핀 | PHP | 23.42 | 25.76 | 21.50 | 23.65 | 23.19 | 0.018 |
37 | 멕시코 MXN | 멕시코 | MXN | 76.54 | 84.57 | 68.51 | 77.30 | 75.78 | 0.059 |
38 | 브라질 BRL | 브라질 | BRL | 268.40 | 295.77 | 241.56 | NaN | 265.18 | 0.206 |
39 | 베트남 VND | 베트남 | VND | 5.48 | 6.12 | 4.84 | 5.53 | 5.43 | 0.004 |
40 | 남아프리카 공화국 ZAR | 남아프리카 공화국 | ZAR | 69.33 | 74.87 | 63.79 | 70.16 | 68.50 | 0.053 |
41 | 러시아 RUB | 러시아 | RUB | 14.34 | 15.70 | 11.84 | 14.84 | 13.84 | 0.011 |
42 | 헝가리 HUF | 헝가리 | HUF | 3.70 | 4.04 | 3.41 | 3.74 | 3.66 | 0.003 |
43 | 폴란드 PLN | 폴란드 | PLN | 316.35 | 341.65 | 291.05 | 319.82 | 312.88 | 0.243 |
44 | 스리랑카 LKR | 스리랑카 | LKR | 4.24 | NaN | NaN | NaN | NaN | 0.003 |
45 | 알제리 DZD | 알제리 | DZD | 9.57 | NaN | NaN | NaN | NaN | 0.007 |
46 | 케냐 KES | 케냐 | KES | 9.24 | NaN | NaN | NaN | NaN | 0.007 |
47 | 콜롬비아 COP | 콜롬비아 | COP | 0.32 | NaN | NaN | NaN | NaN | 0.000 |
48 | 탄자니아 TZS | 탄자니아 | TZS | 0.54 | NaN | NaN | NaN | NaN | 0.000 |
49 | 네팔 NPR | 네팔 | NPR | 9.89 | NaN | NaN | NaN | NaN | 0.008 |
50 | 루마니아 RON | 루마니아 | RON | 285.29 | NaN | NaN | NaN | NaN | 0.219 |
51 | 리비아 LYD | 리비아 | LYD | 270.20 | NaN | NaN | 272.90 | 267.50 | 0.208 |
52 | 마카오 MOP | 마카오 | MOP | 161.16 | NaN | NaN | NaN | NaN | 0.124 |
53 | 미얀마 MMK | 미얀마 | MMK | 0.62 | NaN | NaN | NaN | NaN | 0.001 |
54 | 에티오피아 ETB | 에티오피아 | ETB | 23.65 | NaN | NaN | NaN | NaN | 0.018 |
55 | 우즈베키스탄 UZS | 우즈베키스탄 | UZS | 0.11 | NaN | NaN | NaN | NaN | 0.000 |
56 | 캄보디아 KHR | 캄보디아 | KHR | 0.32 | NaN | NaN | NaN | NaN | 0.000 |
57 | 피지 FJD | 피지 | FJD | 584.91 | NaN | NaN | NaN | NaN | 0.449 |
최종업데이트 시간정보 조회
# main 화면으로 돌아갑니다.
driver.switch_to.default_content()
# 최근 업데이트 정보를 받아옵니다.
last_update = driver.find_element(By.XPATH, '//*[@id="section_ex1"]/div/span[1]').text
last_update
'2023.07.06 11:15'
# Timestamp 로 변환
update_time = pd.Timestamp(last_update)
update_time
Timestamp('2023-07-06 11:15:00')
# 업데이트 시간 출력
update_time.strftime('%Y년 %m월 %d일 %H시 %M분')
'2023년 07월 06일 11시 15분'
파일로 저장
timestring = update_time.strftime('%Y-%m-%d %H-%M-%S')
filename = f'{timestring}-Naver-환율.csv'
print(f'파일명: {filename}')
파일명: 2023-07-06 11-15-00-Naver-환율.csv
# CSV 로 저장
df.to_csv(filename, index=False)
Class 인스턴스
import pandas as pd
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
import re
class NaverCurrency():
def __init__(self):
# 크롤링 드라이버 생성
driver = self.create_driver()
# NAVER 환율 조회 페이지 URL
url = 'https://finance.naver.com/marketindex/?tabSel=exchange#tab_section'
# 필요 정보 조회
self.crawl(driver, url)
# 드라이버 종료
driver.close()
# 데이터프레임 생성
self.create_dataframe()
def crawl(self, driver, url):
# 네이버 환율 정보 URL 접속
driver.get(url)
# 파일이름 저장을 위한 정보 조회(최종 업데이트 시간)
self.create_filename(driver)
# iframe 객체는 반드시 스위칭 후에 UI Element 접근 가능
driver.switch_to.frame('frame_ex1')
# 환율 테이블 정보 취득
currency_body = driver.find_element(By.XPATH, '/html/body/div/table/tbody')
# 환율 딕셔너리 생성
currency_dict = dict()
for tr in currency_body.find_elements(By.TAG_NAME, 'tr'):
# 나라별 환율 정보 행, (100엔) 제거 처리, IDR 100 -> IDR 로 변경 처리
row = self.clean_currency_title(tr.text)
# 구분 인덱스
idx = self.find_number(row)
# 분할
name = row[:idx].strip()
data = row[idx:]
# 정보 업데이트
currency_dict[name] = data.split()
self.currency = currency_dict
# 데이터프레임 생성
def create_dataframe(self):
df = pd.DataFrame(self.currency).T.reset_index()
df.columns = ['통화명', '환율', '현찰_buy', '현찰_sell', '송금_send', '송금_receive', '미화환산율']
for col in df.loc[:, '환율':].columns:
# 숫자는 숫자로 변환, 나머지는 결측치로 치환
df[col] = pd.to_numeric(df[col], errors='coerce')
df.insert(1, '통화', df['통화명'].apply(self.split_title).str[0])
df.insert(2, '단위', df['통화명'].apply(self.split_title).str[1])
self.currency_df = df
# 최근 업데이트 정보 조회
def lastupdate(self):
return self.last_update.strftime('%Y년 %m월 %d일 %H시 %M분')
def to_csv(self):
self.currency_df.to_csv(f'{self.filename}-Naver-환율.csv', index=False)
print(f'{self.filename}-Naver-환율.csv', '파일을 저장하였습니다.')
def to_excel(self):
self.currency_df.to_excel(f'{self.filename}-Naver-환율.xlsx', index=False)
print(f'{self.filename}-Naver-환율.xlsx', '파일을 저장하였습니다.')
def create_driver(self):
options = webdriver.ChromeOptions()
# 가상 브라우저 옵션
options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36")
# headless 옵션은 별도의 창을 띄우지 않음
options.add_argument("--headless=new")
# 드라이버 생성
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()), options=options)
return driver
# 확장성을 위하여 함수로 만들었습니다. (유지보수에 용이)
def clean_currency_title(self, text):
cleaned_text = text.replace(r'(100엔)', '') # 일본 엔화
cleaned_text = cleaned_text.replace(r'IDR 100', 'IDR') # 인도네시아
cleaned_text = cleaned_text.replace(r'VND 100', 'VND') # 베트남
cleaned_text = cleaned_text.replace(r',', '') # 통화 1,000 단위 콤마 제거
return cleaned_text
def find_number(self, text):
pattern = r'\d'
match = re.search(pattern, text)
if match:
# 숫자가 처음 등장하는 인덱스
return match.start()
else:
# No Numbers Found
return 0
# 통화 단위 분리를 위한 함수
def split_title(self, title):
# 통화 단위
unit = title.split()[-1]
name = title.split()[:-1]
name = ' '.join(name)
return name, unit
def create_filename(self, driver):
# 최근 업데이트 정보를 받아옵니다.
last_update = driver.find_element(By.XPATH, '//*[@id="section_ex1"]/div/span[1]').text
last_update = last_update.replace('.', '-')
last_update += ':00'
# 최종 업데이트 시간정보 저장
last_update = pd.Timestamp(last_update)
timestring = last_update.strftime('%Y-%m-%d %H-%M-%S')
self.last_update = last_update
# 파일명 저장
self.filename = timestring
# 크롤링 봇 생성
crawl_bot = NaverCurrency()
# 조회한 정보 출력
crawl_bot.currency_df
통화명 | 통화 | 단위 | 환율 | 현찰_buy | 현찰_sell | 송금_send | 송금_receive | 미화환산율 | |
---|---|---|---|---|---|---|---|---|---|
0 | 미국 USD | 미국 | USD | 1300.50 | 1323.25 | 1277.75 | 1313.20 | 1287.80 | 1.000 |
1 | 유럽연합 EUR | 유럽연합 | EUR | 1411.30 | 1439.38 | 1383.22 | 1425.41 | 1397.19 | 1.085 |
2 | 일본 JPY | 일본 | JPY | 900.97 | 916.73 | 885.21 | 909.79 | 892.15 | 0.693 |
3 | 중국 CNY | 중국 | CNY | 179.25 | 188.21 | 170.29 | 181.04 | 177.46 | 0.138 |
4 | 홍콩 HKD | 홍콩 | HKD | 166.28 | 169.55 | 163.01 | 167.94 | 164.62 | 0.128 |
5 | 대만 TWD | 대만 | TWD | 41.66 | 47.11 | 37.50 | NaN | NaN | 0.032 |
6 | 영국 GBP | 영국 | GBP | 1652.48 | 1685.03 | 1619.93 | 1669.00 | 1635.96 | 1.271 |
7 | 오만 OMR | 오만 | OMR | 3378.01 | 3614.47 | 3141.55 | NaN | NaN | 2.598 |
8 | 캐나다 CAD | 캐나다 | CAD | 979.11 | 998.39 | 959.83 | 988.90 | 969.32 | 0.753 |
9 | 스위스 CHF | 스위스 | CHF | 1447.73 | 1476.25 | 1419.21 | 1462.20 | 1433.26 | 1.113 |
10 | 스웨덴 SEK | 스웨덴 | SEK | 118.82 | 121.73 | 115.91 | 120.00 | 117.64 | 0.091 |
11 | 호주 AUD | 호주 | AUD | 867.11 | 884.19 | 850.03 | 875.78 | 858.44 | 0.667 |
12 | 뉴질랜드 NZD | 뉴질랜드 | NZD | 804.75 | 820.60 | 788.90 | 812.79 | 796.71 | 0.619 |
13 | 체코 CZK | 체코 | CZK | 59.39 | 64.43 | 54.05 | 60.04 | 58.74 | 0.046 |
14 | 칠레 CLP | 칠레 | CLP | 1.63 | 1.79 | 1.47 | NaN | NaN | 0.001 |
15 | 튀르키예 TRY | 튀르키예 | TRY | 50.12 | NaN | NaN | 50.67 | 49.57 | 0.039 |
16 | 몽골 MNT | 몽골 | MNT | 0.38 | NaN | NaN | NaN | NaN | 0.000 |
17 | 이스라엘 ILS | 이스라엘 | ILS | 351.51 | 386.66 | 323.39 | NaN | NaN | 0.270 |
18 | 덴마크 DKK | 덴마크 | DKK | 189.47 | 194.11 | 184.83 | 191.36 | 187.58 | 0.146 |
19 | 노르웨이 NOK | 노르웨이 | NOK | 121.86 | 124.84 | 118.88 | 123.07 | 120.65 | 0.094 |
20 | 사우디아라비아 SAR | 사우디아라비아 | SAR | 346.72 | 368.56 | 322.80 | 350.18 | 343.26 | 0.267 |
21 | 쿠웨이트 KWD | 쿠웨이트 | KWD | 4232.16 | 4507.25 | 3893.59 | 4274.48 | 4189.84 | 3.254 |
22 | 바레인 BHD | 바레인 | BHD | 3449.69 | 3670.47 | 3173.72 | 3484.18 | 3415.20 | 2.653 |
23 | 아랍에미리트 AED | 아랍에미리트 | AED | 354.09 | 373.56 | 329.66 | 357.63 | 350.55 | 0.272 |
24 | 요르단 JOD | 요르단 | JOD | 1833.37 | 1996.53 | 1686.71 | NaN | NaN | 1.410 |
25 | 이집트 EGP | 이집트 | EGP | 42.09 | NaN | NaN | NaN | NaN | 0.032 |
26 | 태국 THB | 태국 | THB | 37.10 | 38.95 | 34.88 | 37.47 | 36.73 | 0.029 |
27 | 싱가포르 SGD | 싱가포르 | SGD | 961.59 | 980.72 | 942.46 | 971.20 | 951.98 | 0.739 |
28 | 말레이시아 MYR | 말레이시아 | MYR | 278.93 | 299.57 | 258.29 | NaN | 276.15 | 0.215 |
29 | 인도네시아 IDR | 인도네시아 | IDR | 8.66 | 9.52 | 7.80 | 8.74 | 8.58 | 0.007 |
30 | 카타르 QAR | 카타르 | QAR | 356.87 | NaN | NaN | NaN | NaN | 0.274 |
31 | 카자흐스탄 KZT | 카자흐스탄 | KZT | 2.92 | NaN | NaN | NaN | NaN | 0.002 |
32 | 브루나이 BND | 브루나이 | BND | 961.59 | 1000.05 | 903.90 | NaN | NaN | 0.739 |
33 | 인도 INR | 인도 | INR | 15.80 | NaN | NaN | NaN | NaN | 0.012 |
34 | 파키스탄 PKR | 파키스탄 | PKR | 4.69 | NaN | NaN | NaN | NaN | 0.004 |
35 | 방글라데시 BDT | 방글라데시 | BDT | 11.99 | NaN | NaN | NaN | NaN | 0.009 |
36 | 필리핀 PHP | 필리핀 | PHP | 23.41 | 25.75 | 21.50 | 23.64 | 23.18 | 0.018 |
37 | 멕시코 MXN | 멕시코 | MXN | 76.49 | 84.52 | 68.46 | 77.25 | 75.73 | 0.059 |
38 | 브라질 BRL | 브라질 | BRL | 268.21 | 295.56 | 241.39 | NaN | 265.00 | 0.206 |
39 | 베트남 VND | 베트남 | VND | 5.47 | 6.11 | 4.83 | 5.52 | 5.42 | 0.004 |
40 | 남아프리카 공화국 ZAR | 남아프리카 공화국 | ZAR | 69.29 | 74.83 | 63.75 | 70.12 | 68.46 | 0.053 |
41 | 러시아 RUB | 러시아 | RUB | 14.33 | 15.69 | 11.83 | 14.83 | 13.83 | 0.011 |
42 | 헝가리 HUF | 헝가리 | HUF | 3.70 | 4.04 | 3.41 | 3.74 | 3.66 | 0.003 |
43 | 폴란드 PLN | 폴란드 | PLN | 316.04 | 341.32 | 290.76 | 319.51 | 312.57 | 0.243 |
44 | 스리랑카 LKR | 스리랑카 | LKR | 4.24 | NaN | NaN | NaN | NaN | 0.003 |
45 | 알제리 DZD | 알제리 | DZD | 9.57 | NaN | NaN | NaN | NaN | 0.007 |
46 | 케냐 KES | 케냐 | KES | 9.24 | NaN | NaN | NaN | NaN | 0.007 |
47 | 콜롬비아 COP | 콜롬비아 | COP | 0.32 | NaN | NaN | NaN | NaN | 0.000 |
48 | 탄자니아 TZS | 탄자니아 | TZS | 0.54 | NaN | NaN | NaN | NaN | 0.000 |
49 | 네팔 NPR | 네팔 | NPR | 9.88 | NaN | NaN | NaN | NaN | 0.008 |
50 | 루마니아 RON | 루마니아 | RON | 285.15 | NaN | NaN | NaN | NaN | 0.219 |
51 | 리비아 LYD | 리비아 | LYD | 270.01 | NaN | NaN | 272.71 | 267.31 | 0.208 |
52 | 마카오 MOP | 마카오 | MOP | 161.05 | NaN | NaN | NaN | NaN | 0.124 |
53 | 미얀마 MMK | 미얀마 | MMK | 0.62 | NaN | NaN | NaN | NaN | 0.001 |
54 | 에티오피아 ETB | 에티오피아 | ETB | 23.64 | NaN | NaN | NaN | NaN | 0.018 |
55 | 우즈베키스탄 UZS | 우즈베키스탄 | UZS | 0.11 | NaN | NaN | NaN | NaN | 0.000 |
56 | 캄보디아 KHR | 캄보디아 | KHR | 0.31 | NaN | NaN | NaN | NaN | 0.000 |
57 | 피지 FJD | 피지 | FJD | 578.46 | NaN | NaN | NaN | NaN | 0.445 |
# 최종 업데이트 시간 확인
crawl_bot.lastupdate()
'2023년 07월 06일 11시 19분'
# CSV로 저장
crawl_bot.to_csv()
2023-07-06 11-19-00-Naver-환율.csv 파일을 저장하였습니다.
# Excel로 저장
crawl_bot.to_excel()
2023-07-06 11-19-00-Naver-환율.xlsx 파일을 저장하였습니다.
댓글남기기