연쇄 할인마 사이트에서 크롤링 해오는 정보중에 원가, 할인가, 할인율 항목이 있다. 그런데 이 할인율을 구하는 방법이 만약 사이트마다 다르다면 같은 할인가임에도 불구하고 할인율이 차이가 나서 내 사이트에서 할인율기준 정렬시 문제가 발생할 수 있다. 할인율이 좀더 낮은곳을 찾아왔는데 정작 판매하는 할인가가 같다면 서비스의 신뢰에 문제가 생길 수 있음을 말하는 것이다. 이때문에 오늘은 각 사이트의 할인율을 계산하는 식을 만들어 비교해보고 차이점이 있는지, 그렇다면 어떻게 적용되는지를 살폈던 것이다.
할인율을 구하는 식은 매우 간단했다.
할인율 = 100-(할인가/원가*100)
하지만 으레 그렇듯이 오류는 발생했다. 오류의 코드를 찾아보니 자료형의 문제였었다. 크롤링 해오던 할인가는 대게 ₩20,000 이런식으로 얻어졌기때문이다. 이러한 것들은 죄다 문자형이라 계산식에서 오류가 빈번하게 발생했던것이다. 문자형을 정수형, 혹은 실수형으로 바꾸는 것은 간단했다.
original_price = ₩20,000
int(original_price)
float(original_price)
문자형의 자료를 int의 경우에는 정수형, float의 경우에는 실수형으로 변환시켜준다. 대게 가격란에는 $로 표시된 가격도 많아 19.99같은 실수형으로 변환해야할 문자형자료도 있었기에 float를 사용하기로 했다.
def get_rate():
discount_rate = 100 - (float(game_discount_price) / float(game_original_price) * 100)
return float(discount_rate)
할인율을 구하는데 사용했던 간단한 함수이다. 하지만 이에도 실패했다. 문자형이 실수형으로 바뀌기 위해선 불순물도 쳐내야 한다는 간단한 사실을 알아낸 후에 크롤링해와 변수로 넣어주는 과정을 다음과 같이 수정했다.
game_original_price = game.select_one('div > div > div > span > strike').text.replace('₩', '',1).strip().replace(',','').stirp()
game_discount_rate = game.select_one('div > div > div > span').text.translate({ord('-'): '', ord('%'): ''})
변수선언코드이다. replace로 불필요한 부분을 공백으로 대체할수 있었지만 그런 부분이 복수의 경우에는 translate를 사용하고 앞뒤의 공백은 strip으로 제거해 오류가 나지 않게 실수형으로 변환할수 있도록 했다.
문제없이 코드는 실행되었고 여러 사이트를 토대로 조사해 공통되는 할인율계산식을 얻을 수 있었다.
사실 굉장히 간단한 문제이지만, 나같은 주니어개발자에게 자료형의 변환같은 경우는 자칫하면 놓치기 쉬운 함정이 많다. 20,000 같은 경우에도 쉼표 하나로 변환에 오류가 생기기도 하더라. 코딩을 할땐 당연히 여겼던 일상생활에서의 지표는 내려 놓을 필요가 있어보인다. 날이 선 코딩을 목표로 해야겠다.