[PYTHON] 네이버 부동산 상가 매물 크롤링하기(2/4)
앞선 포스팅에서 파이선을 이용하여 네이버 부동산 상가 매물 크롤링을 하기 위한 첫 단계로 개발자도구를 활용하여 PC 웹 페이지에 접근하여 과정 별 데이터를 확인하였다. 원하는 데이터가 json 형태로 보이는 것은 확인하였으나 원하는 위치(지역)에 대해 요청을 적절히 하기 위한 데이터 구성 파악의 과정이 다소 어려운 것을 확인 할 수 있었다.
https://cocoabba.tistory.com/56
[PYTHON] 네이버 부동산 상가 매물 크롤링하기(1/6)
앞선 포스팅에 이어 약 1년이 지난 시점에 관련 질문이 있는 듯 하여 각 과정을 아래와 같은 단계로 포스팅하려고 합니다. https://cocoabba.tistory.com/42 [PYTHON] 네이버 부동산 상가 매물 크롤링하기 개
cocoabba.tistory.com
1. 개발자 도구를 활용한 웹페이지에 대한 분석 -> PC 웹 페이지에 대한 분석 2. 개발자 도구를 활용한 웹페이지에 대한 분석 -> 모바일 페이지에 대한 분석 3. 분석한 데이터를 활용한 페이지 요청 : 그룹(단지) 정보 / 물건정보 추출 4. Tkinter 를 활용한 GUI 프로그램 제작 |
이에 이번 포스팅에서는 동일한 작업을 모바일에서 해 봄으로써 데이터 분석을 조금 더 쉽게 할 수 있는지 확인해보려고 한다.
첫번째 화면은 아래와 같다.
PC에서 검색했을 때에는 분명 151건의 물건이였으나 모바일에서는 134건으로 물건의 개수부터 차이가 발생했다. 첫번째 화면부터 막히는 것인가? 하지만, 각각의 원 그룹을 눌러보며 확인한 결과 모바일 버전이 이미 최적화되어 있음을 확인했다. 그 최적화란 "동일매물 묶기"가 이미 적용되어 있는 것이였다. PC 버전에서 동일매물 묶기를 적용했더니 동일한 결과가 나오는 것을 확인 할 수 있었다.
자 이제 처음의 계획처럼 모바일 버전의 트래픽을 살펴보기로 하자.
우선 모든 검색이 끝났을 때 보이는 트래픽은 거의 반으로 줄었다. (PC : 250 -> 모바일 130)
모바일 페이지의 요청메시지는 요청한 지역명을 가지고 좌표정보로 변경하여 리다이렉트 요청을 하였고, 해당 메시지의 응답메시지에 다음 요청 메시지 구성을 위한 정보를 제공하고 있었다.
응답 메시지 내에서는 filter 라는 값에 아래와 같은 정보를 담고 있었다.
filter: {
lat: '37.46801',
lon: '126.82423',
z: '14',
cortarNo: '4119011500',
cortarNm: '옥길동',
rletTpCds: '*',
tradTpCds: 'A1:B1:B2'
},
이번에도 마지막 매물의 정보는 JSON 형태로 응답을 하였고, 해당 요청을 위해서는 몇가지 정보가 필요하였다.
PC에서 요청한 정보와 유사해 보이지만, 필요한 정보의 개수가 훨씬 적었으며 특히 위 [그림 4]에서 제공한 정보들을 활용하여 재구성할 수 있었다.
https://m.land.naver.com/cluster/clusterList?view=atcl&
cortarNo=4119011500&
rletTpCd=SG&
tradTpCd=A1&
z=14&
lat=37.46801&
lon=126.82423&
btm=37.4349629&
lft=126.7418325&
top=37.5010425&
rgt=126.9066275&
pCortarNo=&
addon=COMPLEX&
isOnlyIsale=false
조금 자세히 살펴보면 데이터를 아래와 같이 구성할 수 있었다.
1. cortarNo, z, lat, lon 정보는 [그림 4] 에서 응답받은 데이터로 구성할 수 있었다.
2. rletTpCd, tradTpCd 정보는 [그림 4] 에서 응답받는 메시지 내에서 html 로 정보를 아래와 같이 제공해주고 있었다. 이에 따라 우리가 원하는 상가 구분과 거래 유형을 지정하면 되는 것이다.
_tradTpCd = [{tagCd: 'A1', uiTagNm: '매매'},
{tagCd: 'B1', uiTagNm: '전세'},
{tagCd: 'B2', uiTagNm: '월세'},
{tagCd: 'B3', uiTagNm: '단기임대'}];
_rletTpCd = [{tagCd: 'APT', uiTagNm: '아파트'}, {tagCd: 'OPST', uiTagNm: '오피스텔'}, {tagCd: 'VL', uiTagNm: '빌라'},
{tagCd: 'ABYG', uiTagNm: '아파트분양권'}, {tagCd: 'OBYG', uiTagNm: '오피스텔분양권'}, {tagCd: 'JGC', uiTagNm: '재건축'},
{tagCd: 'JWJT', uiTagNm: '전원주택'}, {tagCd: 'DDDGG', uiTagNm: '단독/다가구'}, {tagCd: 'SGJT', uiTagNm: '상가주택'},
{tagCd: 'HOJT', uiTagNm: '한옥주택'}, {tagCd: 'JGB', uiTagNm: '재개발'}, {tagCd: 'OR', uiTagNm: '원룸'},
{tagCd: 'GSW', uiTagNm: '고시원'}, {tagCd: 'SG', uiTagNm: '상가'}, {tagCd: 'SMS', uiTagNm: '사무실'},
{tagCd: 'GJCG', uiTagNm: '공장/창고'}, {tagCd: 'GM', uiTagNm: '건물'}, {tagCd: 'TJ', uiTagNm: '토지'},
{tagCd: 'APTHGJ', uiTagNm: '지식산업센터'}];
# 최초 요청 시 디폴트 값으로 설정되어 있으나, 원하는 값으로 구성
rletTpCds="SG" #상가
tradTpCds="A1:B1:B2" #매매/전세/월세 매물 확인
그 이외의 btm(bottom), lft(left), top, rgt(right) 의 값은 위도(lat), 경도(lon) 정보를 활용하여 정상적인 요청 메시지를 참고하여 아래와 같이 구성할 수 있었다.
[정상 요청 데이터]
# lat=37.550985&
# lon=126.849534&
# btm=37.4331698&
# lft=126.7389841&
# top=37.6686142&
# rgt=126.9600839&
[필요 데이터 재구성]
# lat - btm : 37.550985 - 37.4331698 = 0.1178152
# top - lat : 37.6686142 - 37.550985 = 0.1176292
lat_margin = 0.118
# lon - lft : 126.849534 - 126.7389841 = 0.1105499
# rgt - lon : 126.9600839 - 126.849534 = 0.1105499
lon_margin = 0.111
btm=float(lat)-lat_margin
lft=float(lon)-lon_margin
top=float(lat)+lat_margin
rgt=float(lon)+lon_margin
이와 같은 과정을 통해서 최종적으로 우리가 원하는 물건의 정보를 가지고 있는 JSON 값을 요청하는 메시지를 구성할 수 있었다. 이어서 3/6에서는 실제 python 코드를 통해서 구성한 값을 적용하는 내용을 다뤄보겠다.
https://cocoabba.tistory.com/58
[PYTHON] 네이버 부동산 상가 매물 크롤링하기(3/4)
앞선 포스팅에서 python을 이용하여 네이버 부동산 상가 매물 크롤링을 하기 위한 두번째 단계로 개발자도구를 활용하여 PC가 아닌 모바일 웹 페이지에 접근하여 PC에서 요청 시 발생하는 정보보
cocoabba.tistory.com