바쁜 개발자가 집 알아보는 방법 🐌 방 정보 크롤링 및 필터링 하기

  • crawling
  • map
  • geohash
  • 부동산
  • 직방 크롤링

바쁜 개발자가 집 알아보는 방법 🐌 - 방 정보 크롤링 및 필터링 하기

http://drive.google.com/uc?export=view&id=1djAUK5HM58mLzcza344_ZE4OmLsUsed8

시각화 한 지도 바로보기

올해 취업을 하고 집에서 독립을 해보고 싶어져서 방을 알아보기 시작했었다.
처음에는 월세를 살아야 하나 하다가 전세자금을 엄청 좋은 조건에 대출 받을수 있는 중소기업 청년 전세자금 대출 이있다는 걸 알게 되고 이거 완전 🍯이잔아 하고 찾기 시작했다.

역시나 남의 돈을 그렇게 쉽게 얻을 수는 없었다. 직방, 다방등 전세로 올라온 물건은 많았지만 전세자금 대출이 가능한 물건은 정말 정~~말 적기도 하고 같은 가격대에 대비해 방 크기도 안좋은 편이였다. 더 놀라운점은 전세 대출이 가능한 물건들은 올라온지 1 주일정도 됐다면 없을 확률이 99.99%였다… 그럼에도 불구하고 좋은 방을 구하고야 말지 하고 이를 악물기 시작하고 찾아보기를 30분 뒤 내가 뭘 봤는지도 모르겠고 슬슬 정신이 혼미해지기 시작했다.

먼저 어플에서는 내가 원하는 조건의 필터링이 힘들었다. 대출이 가능한 물건인지 아니면 특정 텍스트가 들어가 있는지 구별할 수도 없었고 광고 물건이 먼저올라오기도 했다. 또 내가 어떤 물건을 봤는지 어떤 부동산걸 봤는지 일일히 기억하기도 힘들었다. 일단 부동산에 연락을 여러군데 넣어둬도 어떤데가 어떤 물건을 가지고 있는지도 기억이 안나 먼저 엑셀로 정리를 해야겠다는 생각을 했다. 근데 또 이것도 손으로 하려니 너~~무 귀찮다. 그래서 방 정보를 크롤링 하고 내가 원하는 집들만 필터링 해서 보고 정리하는 프로젝트를 시작했다.

먼저 구현할 기능은 간단하게 3 개로 시작 하기로 했다.

  1. 원하는 지역의 방정보를 가져오기
  2. 특정 문구가 들어간, 내가 원하는 가격의 방 정보를 필터링 하기
  3. 부동산 별로 볼 수 있게 하기

방🏠 정보 가져오기

크롤링할 플랫폼은 api가 제일 깔끔해 보이는 직방으로 선택했다. 직방에서는 총 두 단계로 방 정보를 가져올 수 있었다.

1. 파라미터를 이용해서 방 정보 ID 들을 가져오기.

직방에서는 방 정보를 가져오기 위해 여러가지 파라미터를 제공한다. 지상층인지, 보증금의 범위 등등. 그 중에서 제일 눈에 띈건 geohash라는 파라미터였다. 위치정보를 이용한 개발은 한 번도 안 해봐서 구역별 정보를 어떻게 가져오는지 궁금했었는데 직방에서는 geohash를 이용해 지역 구분을 했다. geohash는 지구의 위치 정보를 사각형으로 나눠 표현하는 방식을 의미한다.

http://drive.google.com/uc?export=view&id=1bXqE2D63osXNQoEIsaU19kNLyvardA6S

출저 https://en.wikipedia.org/wiki/Geohash

정확히는 이진 탐색을 하듯이 위도와 경도의 범위를 점점 좁혀가며 이 과정을 비트를 표현한다. 이런 과정은 -90 ~ 90도부터 시작하며 중간 값 보다 클경우 1 작을 경우 0으로 표시하고 5자리를 모아 base32 대응표에 대입하면 아래 사진과 같이 지역을 해쉬화 해서 표현할 수 있다. 인접한 지역끼리는 해쉬가 유사하니 얼마나 인근 지역인지도 알 수 있고 탐색도 빠를 테니 괜찮은 방법 같다. 좀 더 자세한 내용은 Wikipedia Geohash문서 혹은 scvgeo 님의 블로그통해서 알아보는걸 추천한다.

http://drive.google.com/uc?export=view&id=1XCtQhss86KuplI5C1BnYyJAkCbQvCxDn

회사가 사당에 있음으로 그와 인근 지역인 관악구와 동작구 위주로 알아봤다. 직접 geohash를 구해줘도 되지만 http://geohash.gofreerange.com/ 이 사이트에서 지도 상 geohash에 따른 지역을 표시해준다. 내가 방 정보를 알아와야하는 지역은 wydm0~wydm3에 있는 지역이 된다. 이렇게 파라미터를 맞춰서 넣어주게 되면 해당 지역안에 있는 방 item 들의 id를 가져올 수 있다.

2. 구체적인 방 정보 가져오기

위 작업을 통해 방 정보에 대한 id 를 가져왔다면 이제 해당 id에 대한 정보를 가져오면 된다. 처음에는 id 갯수가 꽤 돼서 이걸 한번 씩 다 보내야 했는데 다행이 벌크로 보낼 수 있었다. 추가로 이렇게 api를 이용해서 항상 적당한 갯수 조절과 타임아웃은 필수다. 내 실수로 서버가 아플수도 있으니 말이다.

http://drive.google.com/uc?export=view&id=1ugt3MmtKNXRR_1-DGcpmp3kzRl64Qa4Q

출저 : ㅍㅍㅅㅅ

왜 인지는 모르겠지만 방 정보를 가져올 때 꼭 id 갯수 대비 몇 개 씩은 줄어들어서 왔는데 일단 그냥 넘어갔다

방🏠 정보 필터링 하기


이제 모든 방 정보를 들고 왔으니 내가 원하는 조건에 해당하는 방을 걸러내면 된다.
방정보가 200개가 넘어가서 처음에는 행복회로🔥를 돌렸지만 이 과정에서 전세 매물 중5분의 1만 살아 남게 된다.

1. 대출 가능한 방 찾기

대부분 전세자금 대출이 가능 한 방들은 제목이나 설명에 전세 자금 대출이 가능한 물건이라고 명시를 해놓는다. 명시를 해놓지 않는 경우 99.99% 대출이 안되는 생활근린시설 이거나 융자가 많아서 대출이 안된다. 그래서 제목이랑 본문 중 대출 이라는 단어가 들어간 집 들을 긁어왔다. 하지만 나중에 이 로직을 수정하게 된다. 본문 중에 전세자금대출 불가 라고 써놓은 곳도 있었기 때문이다…

    wish = '대출'
    sad_words = [ '대출x', '대출불가', '전세 안됩' ]
    if wish in item['title'] or wish in item['description']:
        plz_flag = True
        for word in sad_words:
            if word in item['description']:
                plz_flag = False
                break

출저 : 내 코드중 발최… 대출이 안되면 슬픕니다

그리고 위에 써놓은 것 처럼 올린지 1주일이 넘은 매물같은 경우에는 이미 나갔을 확률이 매우 높기도 하고 관리가 잘 안되고 있는 물건 일 수도 있어서 최근 4일 이내에 업데이트가 있는 게시글만 가져오도록 했다.

2. 주소 겹치는 곳 제거

앱에 올라온 물건들을 보게 되면 같은 집인데 다른 부동산에서 중계를 하기 때문에 겹치는 물건들이 있다. 이런 데이터는 크게 필요하지 않음으로 제거를 해주면 좋다. api를 통해서 들어오는 데이터의 경우 address1 ~ address3 이런식으로 나뉘어서 온다. 시랑 동같은 정보들을 나눠서 저장해주기 때문인데 주소를 다 이어 준 다음 dictionary의 key 값으로 사용하면 손쉽게 중복된 집들을 묶어줄 수 있다. 이 글을 보면서 생각이 든 건데 같은 주소의 다른 물건의 경우 보증금이 제일 저렴한 집으로 보여줬으면 조금 더 좋았을 것 같다.

3. csv로 뽑고 구글 스프레드 시트에 업로드 하기

정말 이제 몇 안되는 물건들만 남았다. 그래도 약 40개 가량 되기 때문에 그냥 txt 파일로 관리하기에는 무리가 있을 것 같아 csv파일 형태로 만들고 구글 스프레드 시트에 올렸다. 구글 스프레드 시트에 올리게 되면 각 column 별로 필터링을 쉽게 걸 수 있다는 장점이 생기고 모바일이든 랩탑이든 어디서든 볼 수 있다. 집을 보러 다니게 되면 스프레드시트 앱을 통해 쉽게 볼 수 있었다.

http://drive.google.com/uc?export=view&id=1PGfML6VlZvjwriXB61hixEOfh7DSqBL-

4. 구글 지도를 통해 위치 표시하기

스프레드시트 만으로도 꽤 괜찮았지만 그냥 주소만 봐서는 위치를 모르겠어서 어떻게 하면 지도에서 보면 좋겠다는 생각을 했다. 찾아보니 구글 지도에 스프레드시트를 불러와서 볼 수 있는 기능이 있었다. 각 점을 누르면 설명도 나오고 위치도 볼 수 있기 때문에 집 보러다닐 때 꽤 편했다.

google spreadsheet 기능설명

http://drive.google.com/uc?export=view&id=1TmthuYODoFuLoxiox5SKHXRX0wcUVpcl


더 자세한 내용과 실제 구현은 소스코드를 참고 하면 된다. 사실 개인적인 용도로 쓰는 거기 때문에 코드가 깔끔하지 않은점은… (변명)

후기

이렇게 만반의 준비를 하고 여러 부동산에 연락을 돌린 다음 💎귀중한 연차💎를 내고 집을 보러 다녔다. 그래도 저렇게 필터링 한 물건은 실제로 꽤 있었지만 부동산에서 직방 같은 플랫폼에다 안올려놓은 경우도 많았고 내가 이집 이집 보여주세요 라고 얘기를 할 수 없기 때문에 거의 부동산의 주도로 보는 일이 더 많았다. 그래도 부동산 몇군데 정도 들리고나니 본 물건을 또 보러 가려는 경우가 생기기도 했다. 갔던데를 또 안가기 위해 만들어둔 지도를 활용하는 일이 몇번 있었고 부동산 구분이나 메모도 할 수 있었기 때문에 의미가 완전 없지는 않았다. 그래도 집은 발품 팔으러 다니세요 여러분

그래서 집을 구했냐고 물어보신다면 못구했다. 왜이렇게 비쌉니까… 그냥 본가에 더 붙어있기로 했다.

사실 Github Action을 이용해서 batch job으로 돌면서 집 정보를 업데이트 해주고 리스트에 없는 내가 본 집들도 좀 더 쉽게 추가 할 수 있는 방법을 고민하다가 집 구하는걸 포기했다. 집 구할 정도로 돈이 많은 사람 중 이 글을 보는 분이 있다면 누군가가 내 코드를 수정해서 만들어 주시기를…

정말 오래간만에 내 생활 중 필요에 의해 코딩을 했다. 나는 정리를 정말 못하는 성격이기 때문에 만약 이걸 내가 손으로 했더라면 아마 집을 보러가기도 전에 포기했을거다. 어떻게 보면 귀차니즘의 승리 아닐까. 앞으로도 종종 내 삶을 위한 프로젝트를 해봐야겠다.