[Python] 실시간 환율 정보 크롤링

2

크롤링에 필요한 모듈

모듈설명
requestsHTML 코드를 파이썬에 불러오는 역할
pandasDataFrame을 만들어 정리
BeautifulSoupHTML 코드의 원하는 정보를 크롤링하는 역할

위 3가지 모듈만 있으면 크롤링이 가능합니다.

코드를 보면,

import requests
import pandas as pd
from bs4 import BeautifulSoup

우선 3개의 모듈을 불러옵니다. 그 뒤 원하는 사이트 주소를 받아옵니다.

#다음 환율 HTML 코드
get_page = requests.get("https://search.daum.net/search?w=tot&DA=YZR&t__nil_searchbox=btn&sug=&sugo=&q=%ED%99%98%EC%9C%A8")
#텍스트 파일로 저장
exchange_rate = get_page.text

BeautifulSoup의 html.parser에 적용시킵니다.

soup = BeautifulSoup(exchange_rate, 'html.parser')

원하는 정보 획득

[Python] 실시간 환율 정보 크롤링
출처 : 다음(Daum)

다음 사이트에서 환율을 입력하면 다음과 같이 실시간 자료가 뜹니다. 크롤링 할 자료는 아래쪽 빨간 박스 안의 내용을 추출하려 합니다!

F12 (Chrome에서만 가능)를 눌러 HTML 코드를 확인합니다.

[Python] 실시간 환율 정보 크롤링
[Python] 실시간 환율 정보 크롤링
확대

각각의 정보를 확인해 보면 환율 내용은 wrap_rate class에 tr / td / span의 주소에 들어있습니다. 코드로 정리해 보면

ex_rate = soup.select('.wrap_rate tr td span')
ex_index = soup.select('.wrap_rate tr td a')

로 정리가 가능하며, 출력을 해보면

ex_rate
[Python] 실시간 환율 정보 크롤링
ex_index
[Python] 실시간 환율 정보 크롤링

로 조금 복잡합니다. 보기 쉽게 정리를 하면,

#주요 내용
main_rate = []
for ex in ex_rate:
    main_rate.append(ex.text)

#index 정보
main_index = []
for ex in ex_index:
    main_index.append(ex.text)

main_rate

['1,193.50', '상승', '9.50', '0.80%', '1,087.17', '상승', '8.89', '0.82%', '1,307.06', '상승', '4.19', '0.32%', '170.50', '상승', '0.65', '0.38%', '797.02', '하락', '1.53', '-0.19%']

main_index

['미국 USD', '일본 JPY', '유로 EUR', '중국 CNY', '호주 AUD']

로 각각 리스트에 정리가 가능합니다.


리스트 나누기 (List comprehension 활용)

main_rate를 출력해 보면

['1,193.50', '상승', '9.50', '0.80%', '1,087.17', '상승', '8.89', '0.82%', '1,307.06', '상승', '4.19', '0.32%', '170.50', '상승', '0.65', '0.38%', '797.02', '하락', '1.53', '-0.19%']

로써 한 개의 리스트 안에 모든 값이 들어있습니다. 이를 4개씩 나누면 정리가 깔끔하게 됩니다. 이를 위해 리스트 캄프리헨션 기법을 사용하겠습니다.

n = 4
result = [main_rate[i * n:(i + 1) * n] for i in range((len(main_rate) + n - 1) // n )]

출력하면 아래와 같은 결괏값을 얻을 수 있습니다.

[['1,193.50', '상승', '9.50', '0.80%'],
 ['1,087.17', '상승', '8.89', '0.82%'],
 ['1,307.06', '상승', '4.19', '0.32%'],
 ['170.50', '상승', '0.65', '0.38%'],
 ['797.02', '하락', '1.53', '-0.19%']]

판다스(Pandas)를 통하여 데이터 프레임(DataFrame) 만들기

지금까지 받은 자료를 DataFrame에 넣어주면 완성됩니다.

df = pd.DataFrame(data = result, index = main_index)
df
0123
미국 USD1,193.50상승9.500.80%
일본 JPY1,087.17상승8.890.82%
유로 EUR1,307.06상승4.190.32%
중국 CNY170.50상승0.650.38%
호주 AUD797.02하락1.53-0.19%

코드 정리

import requests
import pandas as pd
from bs4 import BeautifulSoup
get_page = requests.get("https://search.daum.net/search?w=tot&DA=YZR&t__nil_searchbox=btn&sug=&sugo=&q=%ED%99%98%EC%9C%A8")
exchange_rate = get_page.text
soup = BeautifulSoup(exchange_rate, 'html.parser')
ex_rate = soup.select('.wrap_rate tr td span')
ex_index = soup.select('.wrap_rate tr td a')
main_rate = []
for ex in ex_rate:
    main_rate.append(ex.text)
main_index = []
for ex in ex_index:
    main_index.append(ex.text)

n = 4
result = [main_rate[i * n:(i + 1) * n] for i in range((len(main_rate) + n - 1) // n )]

df = pd.DataFrame(data = result, index = main_index)
df

2 코멘트

  1. 포스팅 글 잘 보았습니다( https://datazzang.com/2020/02/08/python-crawling/)
    마침 찾던 내용인데 가장 좋은 글이었어요. 감사합니다.

    헌데 궁금한 점이 하나 있습니다. 이 방식을 이용하면 현재 환율을 1번 긁어올 수는 있는데
    약 20분 정도마다 업데이트 되는 환율 정보를 계속 가져오려면 어떻게 해야하는건가요?
    프로그래밍 초보이다 보니 잘 모르겠더군요.
    API를 활용하면 실시간 업데이트 정보를 받아올 수 있는것인지
    아니면 정기적으로 프로그램을 실행해야하는지 잘 모르겠네요. ㅜㅜ
    조언 주시면 많은 도움이 될 것 같습니다. 부탁드려요. ㅠㅠ

  2. 참고 :: https://datazzang.com/2020/02/11/interesting-python-1/
    파이썬으로 타이머 만들기 입니다. 여기서 사용한 함수는 time()입니다. time.sleep(1200)을 이용하면 20분마다 크롤링이 가능합니다. 관련 내용은 추후 업데이트 하겠습니다.

회신을 남겨주세요

귀하의 의견을 입력하십시오!
여기에 이름을 입력하십시오.