티스토리 뷰

반응형

앞선 포스팅에서 파이선을 이용하여 네이버 부동산 상가 매물 크롤링을 하기 위한 첫 단계로 개발자도구를 활용하여 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 프로그램 제작

 

이에 이번 포스팅에서는 동일한 작업을 모바일에서 해 봄으로써 데이터 분석을 조금 더 쉽게 할 수 있는지 확인해보려고 한다.

첫번째 화면은 아래와 같다.

[그림 1] 모바일버전의 네이버 부동산에서 "부천시 옥길동" 검색 결과

PC에서 검색했을 때에는 분명 151건의 물건이였으나 모바일에서는 134건으로 물건의 개수부터 차이가 발생했다. 첫번째 화면부터 막히는 것인가? 하지만, 각각의 원 그룹을 눌러보며 확인한 결과 모바일 버전이 이미 최적화되어 있음을 확인했다. 그 최적화란 "동일매물 묶기"가 이미 적용되어 있는 것이였다. PC 버전에서 동일매물 묶기를 적용했더니 동일한 결과가 나오는 것을 확인 할 수 있었다. 

 

[그림 2] 동일매물 묶기로 인한 물건 수 차이 확인

자 이제 처음의 계획처럼 모바일 버전의 트래픽을 살펴보기로 하자.

 

우선 모든 검색이 끝났을 때 보이는 트래픽은 거의 반으로 줄었다. (PC : 250 -> 모바일 130)

[그림 3] 모바일 네이버부동산 페이지에서 "부천시 옥길동" 검색 시 요청 메시지

모바일 페이지의 요청메시지는 요청한 지역명을 가지고 좌표정보로 변경하여 리다이렉트 요청을 하였고, 해당 메시지의 응답메시지에 다음 요청 메시지 구성을 위한 정보를 제공하고 있었다.  

[그림 4] 리다이렉트된 요청의 응답에서 다음 요청을 구성할 수 있는 정보 제공

응답 메시지 내에서는 filter 라는 값에 아래와 같은 정보를 담고 있었다. 

 filter: {
            lat: '37.46801',
            lon: '126.82423',
            z: '14',
            cortarNo: '4119011500',
            cortarNm: '옥길동',
            rletTpCds: '*',
            tradTpCds: 'A1:B1:B2'
        },

이번에도 마지막 매물의 정보는 JSON 형태로 응답을 하였고, 해당 요청을 위해서는 몇가지 정보가 필요하였다.

[그림 5] clusterList 요청을 통해 물건 정보 요청
[그림 6] 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

 

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함