본문 바로가기
데이터 분석/데이터 분석

직방에서 상가 크롤링하기 (B급 코딩)

by thomasito 2021. 10. 12.
반응형

조건에 맞는 상가를 찾고 싶다!

 최근에 상가 물건을 좀 알아보고 있는데 매매 목적은 아니고 임차인으로 들어가려고 알아보고 있다. 직방에서 내가 원하는 조건을 필터링으로 넣으면 참 좋은데 UX 구성 자체가 지도를 중심으로 되어있다. 나같은 경우는 관악구에서 권리금이 0원이고 월세가 100만원 이하인 물건들을 찾고 싶은데 UX 에서 이 조건을 필터링 할 수가 없어서 크롤링을 해보기 로 했다!

 

 크롬에서 네트워크를 뒤지다 보니까 "https://apis.zigbang.com/v2/store/article/stores/상가번호" 형식으로 웹에다가 Request 를 던져주면 Json 형식으로 원하는 값을 던져주는 것을 알 수 있다. 

 

requests 모듈로 json 파일형식 크롤링 하기

 뷰티풀 수프에서 크롤링 해보면 데이터 형식은 딕셔너리, 딕셔너리 안에 agent, item 이라는 2개의 딕셔너리subways 라는 1개의 리스트를 뿌려주고 있다. 이 물건의 상가번호는 '574037' 이다.

import requests
import json

req = requests.get("https://apis.zigbang.com/v2/store/article/stores/574037")
data= json.loads(req.text )

 subways 를 눌러보면 직방은 기본적으로 지하철 역을 기준으로 데이터가 검색될 수 있도록 되어있다는 것을 추측할 수 있다.

 하지만 중요한 권리금, 보증금액, 월세정보는 item 딕셔너리 내부에 있다.

 필요한 정보들을 변수에 넣어준다. 보기 좋도록 시리즈를 만들어서 s 라는 변수에 넣어주면

item = data['item']
agent = data['agent']

deposit = item['보증금액']
rent = item['월세금액']
premium = item['권리금액']

city1 = item['local1']
city2 = item['local2']
city3 = item['local3']

images = item['images']
phone = agent['agent_phone']

import pandas as pd

s = pd.Series([deposit, rent, premium, city1, city2, city3,phone,images])

 요렇게 내가 원하는 정보를 이쁘게 잘 가져오는 것을 알 수 있다.

 

무식한 for 문 크롤링

 사실 이렇게 무식하게 크롤링을 하면 안 되긴 하는데 상가번호가 400,000 ~ 600,000 으로 부여되어 있어서 아주 무식하게 200,000개를 for문으로 크롤링을 돌렸다. 만약에 400,111번에 상가가 매칭되어 있지 않으면 except pass 예외처리로 튕겨나가도록 했다. 또한 관악구와 노원구에 있는 월세 100만원, 권리금 0원인 물건들만 크롤링하기 때문에 이 조건에 안 맞는 물건들도 다 pass로 튕겨나가도록 했다.

import pandas as pd

df = pd.DataFrame()

for i in range(400000, 600000):  
    
    print(i)      
        
    # 일단 400,000 번부터 600,000 번까지 물건이 있으면 크롤링을 하고  
    try:

        url = "https://apis.zigbang.com/v2/store/article/stores/" + str(i)
        # print(url)
        req = requests.get(url)
        data= json.loads(req.text )

        item = data['item']
        agent = data['agent']
        
        deposit = item['보증금액']
        rent = item['월세금액']
        premium = item['권리금액']
        
        city1 = item['local1']
        city2 = item['local2']
        city3 = item['local3']
        
        images = item['images']
        phone = agent['agent_phone']
            
        # 관악구, 노원구 월세 100만원 이하, 권리금 0원 물건만 데이터 프레임에 쌓고
        if item['local2'] == '관악구' and rent < 100 and premium ==0: 
            
            # print(deposit, rent, premium, city1, city2, city3,phone,images)
            
            s = pd.Series([deposit, rent, premium, city1, city2, city3, phone, images])
            
            df = df.append(s, ignore_index=True)
            
            
        elif item['local2'] == '노원구' and rent < 100 and premium ==0: 
            
            # print(deposit, rent, premium, city1, city2, city3,phone,images)
            
            s = pd.Series([deposit, rent, premium, city1, city2, city3, phone, images])
            
            df = df.append(s, ignore_index=True)
        
        # 나머지는 패스
        else:
            
            pass
            
    # 400,000 번부터 600,000 번까지 물건이 없으면 예외처리 패스                      
    except:
        
        pass

 이렇게 df 데이터프레임 변수에 데이터를 다 쌓고 컬럼명을 부여해준 뒤 엑셀파일로 보내기를 해준다.

df.columns = ['보증금액','월세금액','권리금','시','구','동','부동산번호','이미지']
            
df.to_excel('C:/Users/OneDrive/store_analysis.xlsx')

 

 이렇게 크롤링을 마무리 해서 조건에 맞는 약 400개의 물건을 확보했다. 다만 문제점은 저 이미지들이 url 주소로 되어있어서 어떻게 직관적으로 볼 수 있을지는 아직 모르겠다. ㅠ 오늘도 B급 코딩이었지만 재미있었다. 혹시 저 이미지를 잘 정리할만한 아이디어가 있으신 분은 좀 알려주세요 ^^

반응형

댓글