🔥알림🔥
① 테디노트 유튜브 - 구경하러 가기!
② LangChain 한국어 튜토리얼 바로가기 👀
③ 랭체인 노트 무료 전자책(wikidocs) 바로가기 🙌
④ RAG 비법노트 LangChain 강의오픈 바로가기 🙌
⑤ 서울대 PyTorch 딥러닝 강의 바로가기 🙌

29 분 소요

이번 튜토리얼에서는 네이버의 환율 정보를 크롤링하는 방법에 대해 알아보겠습니다. 이 과정에서 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 파일을 저장하였습니다.

댓글남기기