본문 바로가기
개발일지/selenium, BeautifulSoup, requests

BeaurifulSoup - 쿼리스트링으로 환율정보 가져오기

by 다니엘의 개발 이야기 2022. 9. 23.
320x100

아..... 다시금 하면서 두가지 생각이 들었다.

진짜 나한텐 중요한 내용인데, 그리고 나에게만이 아니라 저 원리적인건 정말 중요한건데

왜이렇게 설명을 깨작해주시지 딥하게좀 해주시지.. 약간은 지겨울때가 될 정도로

 

한편으로는 이 부분을 재탕하는 것에 대해서 스킵할까도 생각했으나,

하려면 할수있겠다. 하지만 완벽히는 못하겠다. 더욱이 시스템화를 하려면 완벽히 소화를 해야할텐데, 그런부분들이 아쉬워서

다시 하려고 한다.

 

어떤 데이터 사이언티스트 분에게 질문했을때 beautifulsoup를 써본적도 없고 파싱도 해본적이 없다는 답변을 받았다.

때문에 나는 이게 필요없는 스킬인가? 라는 생각이 들기도 했지만 본능적으로 이게 정말 중요한 스킬임을 알았기에 그 부분은 무시했다.

시간이 몇달 지나고, 데이터 엔지니어의 길로 가겠다는 결심을 하고 보니 데이터 사이언티스트에게는 필요없는 스킬일지 몰라도

백엔드 엔지니어나 데이터 엔지니어는 필요한 스킬일 가능성이 보통이상은 된다. 라는게 본능적인 직감이다.

그래서 약간 촉박하기도 하지만, 다시해보려고한다.

왜냐하면 중요한데 명확히모르는 부분이 있으니깐.


# 쿼리스트링
# 웹 요청시에 보내는 추가 인자 값

from bs4 import BeautifulSoup as BS
import requests as req

# iframe의 주소이며, 보통 복잡도가 큰 페이지는 가시적으로 보일때는 1개의 페이지로 보이지만
# 그것은 여러가지 페이지들이 모여있는 것이다.
# 따라서, iframe의 src 주소를 기본주소뒤에 붙여주면, 내가 파싱하고자 하는 주소를 가져올 수 있다.
# 여기서의 iframe src주소는 /marketindex/exchangeList.naver 였다.
url = 'https://finance.naver.com//marketindex/exchangeList.naver'
res = req.get(url)
soup = BS(res.text, 'html.parser')

tds = soup.find_all('td')

names = []
# 통화 이름만 따오는 반복문
for td in tds:
    # a태그에 값이 없다. 라는 의미
    if len(td.find_all('a')) == 0:
        # 다음 for문으로 가는 것
        continue
    # 공백을 제거한다는 옵션값으로써 strip =True로 넣자.
    names.append(td.get_text(strip=True))

prices = []
for td in tds:
    if 'class' in td.attrs:
        if 'sale' in td.attrs['class']:
            prices.append(td.get_text(strip=True))

print(names)
print(prices)

'''
미국 USD
유럽연합 EUR
일본 JPY (100엔)
중국 CNY
홍콩 HKD
대만 TWD
영국 GBP
오만 OMR
캐나다 CAD
스위스 CHF
스웨덴 SEK
호주 AUD
뉴질랜드 NZD
체코 CZK
칠레 CLP
터키 TRY
몽골 MNT
이스라엘 ILS
덴마크 DKK
노르웨이 NOK
사우디아라비아 SAR
쿠웨이트 KWD
바레인 BHD
아랍에미리트 AED
요르단 JOD
이집트 EGP
태국 THB
싱가포르 SGD
말레이시아 MYR
인도네시아 IDR 100
카타르 QAR
카자흐스탄 KZT
브루나이 BND
인도 INR
파키스탄 PKR
방글라데시 BDT
필리핀 PHP
멕시코 MXN
브라질 BRL
베트남 VND 100
남아프리카 공화국 ZAR
러시아 RUB
헝가리 HUF
폴란드 PLN
스리랑카 LKR
알제리 DZD
케냐 KES
콜롬비아 COP
탄자니아 TZS
네팔 NPR
루마니아 RON
리비아 LYD
마카오 MOP
미얀마 MMK
에티오피아 ETB
우즈베키스탄 UZS
캄보디아 KHR
피지 FJD
'''
300x250