본문 바로가기
AI/자연어처리

[생활속의 IT] 자연어 처리#3 - 직방의 지리정보 Geohash 이해하기

by 생활속의 IT램프 2020. 3. 23.

[이전 글 보기]

2020/03/22 - [AI/자연어처리] - [생활속의 IT] 자연어 처리#1 - 아나콘다 설치하기

2020/03/22 - [AI/자연어처리] - [생활속의 IT] 자연어 처리 - 참고) Jupyter의 개념

2020/03/23 - [AI/자연어처리] - [생활속의 IT] 자연어 처리#2 - 크롤러 만들기

 

우리는 지금 파이썬 크롤러를 이용하여 직방의 아파트 평가 Text를 수집하려고 합니다.

그러려면 직방에서 관리하는 아파트 ID값을 가져와야 하는데

직방은 위치 정보에 따라 아파트 ID 값을 리턴하는 구조를 취하고 있습니다.

 

정확히는Geohash 라는 지리정보 인덱스를 입력받아

그 위치에 해당하는 주택 ID 값을 리턴하는 구조로 되어있습니다.

 

그래서 본 포스트에서는 본격 크롤러 작성 전 Geohash에 대해 알아보도록 하겠습니다.

 

1. Geohash란?

 

2. 직방의 Geohash 파라미터

 

------------------------------------------------------------------------------------------------------------------------------

 

1. Geohash란?

GeoHash란 사각형의 격자구조를 이용하여 지구상의 위치를 고유하게 식별할 수 있는 고유 지리 ID입니다.

즉 임의의 장소에 대해 그 장소를 나타내는 고유의 ID가 있다는 뜻입니다.

그런데 GeoHash는 중요한 몇 가지 특징이 있습니다.

 

(1) 계층구조를 가진다.

  아래 그림을 보면Level1의 2 구역을 좀 더 상세히 나누면 Level 2의 20, 21, 22, 23이 됩니다.

  Level2의 13을 좀 더 상세히 나누면 130, 131, 132, 133이 됩니다.

  상위 레벨은 하위 레벨 몇 개로 나뉘는 걸까요?

 

  사진에 보듯 4개로 나뉘지는 않습니다.

  정확히는 32개로 쪼개지게 됩니다. 

  즉 1레벨은 2레벨 32개로 구성되며 2레벨은 3레벨 32개로 구성되는 형식입니다.

  

  

  이렇듯 임의의 구역에 대해 확대가 가능한데, geohash는 12레벨까지 가능합니다. 

  7레벨 정도만 되어도 150m 정도 구분이 가능해집니다.

  아래는 7레벨로 확대했을 때 홍대역 인근의 Geohash 영역을 표시한 것입니다.

    12단계까지면 밀리미터 단위로 구분이 가능해진다고 합니다. 쓸일은 없겠지만...

    아래 표를 보시면 각 레벨 별 분해능 확인이 가능하니 참고만 하세요.

 

(2) 하위 레벨은 상위레벨의 문자열을 포함한다.

 

아래 그림 하나만 더 보겠습니다.

하위 레벨은 상위레벨 32개로 나뉘어진다고 했습니다. 

아래를 잘 보면 레벨5의 앞 네 글자는 9q8y 인데 이는 4레벨의 값이기도 합니다. 

 

이건 중요한 특징은 아니고 그냥 그렇다고만 이해하면 될듯합니다. 

이 정도면 Geohash에 대해 이해가 잘 되었을거라 봅니다.

그러면 다시 직방으로 돌아가서 왜 직방에서 크롤링을 할 때 Geohash가 중요한지 보도록 하겠습니다.

 

 

2. 직방의 Geohash 파라미터

직방은 특정 지역의 주택 ID를 반환할 때 Geohash 값을 인수로 전달하도록 되어 있습니다.

직방에서 아파트를 선택한 후 "강남구"를 한번 검색해보겠습니다.

 

크롬 개발자모드(F12) 들어가서 보면 아래와 같이 나옵니다.

wydm6vy 와 같이 geohash 7레벨로 세분화해서 해당 지역의 아파트 목록을 건네주는 듯 합니다.

아까 7레벨이면 분해능이 몇 미터였죠? 153미터 가량입니다.

 

 

그리고 가격정보인 price는 4레벨 지역중 일부에서 값을 건네주는 것 같습니다.

4레벨이면 39km x 19km 가량의 크기입니다. 

 

엄청 크군요. 4레벨이면 여의도에서부터 구리시를 넘어가는 크기입니다.

 

어쨌든 직방을 잘 살펴보면 주변 학교정보, 가격정보등 건네줄 때는 geohash를 검색하여 

그 영역 내의 정보를 건네주는 식으로 동작하는 걸로 보입니다.

 

이제 우리의 목적인 특정 지역에 대한 아파트 ID값을 가져와 보도록 하겠습니다.

우선 강남구의 아파트 ID 값을 가져오는 과정을 보겠습니다.

 

 

지금부터 중요하니 집중에서 잘 봐주세요.

 

직방에서 강남구를 딱 입력만 하고 목록은 선택하지 마세요.

그러면 개발자모드에 search API 하나가 뜰겁니다.

search?q=%EA.... 로 나오는건 UTF-8을 제대로 표현하지 못해서 그런데 "강남구"를 표현한 것입니다.

일단 이슈는 아니므로 넘어가겠습니다. 

 

이제 목록에서 서울시 강남구를 클릭해서 선택해보겠습니다.

그럼 아래와 같이 polygon (격자)를 가져오고 몇 차례에 걸쳐 aparts/items를 가져오는데

인수로 뭘 주고 있습니까?

그렇습니다. geohash 값을 인수로 주고 있습니다. 이를 통해 아파트 item 값을 가져오는 겁니다.

그래서 직방에서 데이터를 수집하려면 geohash를 잘 알아야 합니다.

 

 

다시 복기하면서 무슨 데이터를 받는건지 주피터에서 크롤러를 이용하여 확인해보겠습니다.

먼저 검색에서 "강남구" 입력만 하고 목록을 선택하지 않았을 때 입니다. 

그 때는 search API로 들어갑니다.

 

음... 결과가 보기 힘드므로 json 정리해주는 사이트에서 정리한 후 보겠습니다.

items 키에 values 들이 쭉 달려있는 모양이네요.

 

즉 강남구라는 키에는

 - 주소ID 8192에 "서울시 강남구"

 - 지하철ID 270에 "서울특별시 강남구 논현동"

   등등 ....이 달려서 나옵니다.

 

그리고 각 정보에 해당하는 위도(latitude, lat), 경도(longitude ,lng) 값이 있군요.

"서울시 강남구" item의 위도, 경도는 각각 'lat':37.5174064636231, 'lng':127.047309875488 입니다.

geohash 한번 검색해볼까요?

 

geohash 값은 6레벨로는 wydm7j 이고 위치는 청담역 부근이네요.

"강남구" 목록 중 "서울시 강남구"를 선택했을 때 item을 찾는 몇 가지 요청 중 하나에 wydm7이 있네요.

 

정리해보면 직방은

 

(1) Search할 때 결과 목록들이 위도와 경도 정보를 갖고있다.

(2) 목록 중 하나를 선택하면 해당 위도와 경도가 갖는 geohash 값을 인수로 주어 결과를 추출한다.

(3) 이는 아파트 ID를 추출할 때도 마찬가지이다.

 

그렇습니다. 이제 아파트 ID를 추출하기 위해 Geohash값을 줘야겠네요.

 

참고로 테스트해본 결과 인접한 구(가령 강남구 & 서초구)를 검색할 경우 같은 geohash를 리턴할 수 있습니다.

그러면 같은 아파트 ID값을 주게 되니 이 값으로 크롤링하면 중복된 값을 크롤링할 위험이 있습니다.

그래서 Geohash를 원하는 지역만큼 나열해보고 Geohash를 직접 인수로 주는게 좋아 보입니다.

 

다음 포스트에서는 Geohash를 직접 나열해보고 이걸로 아파트 분석글을 크롤링 해보겠습니다.

 

댓글