•
직방 홈페이지
단계
•
동이름으로 위도 경도 구하기(request)
•
위도 경도로 geohash 알아내기
•
geohash로 매물 아이디 가져오기(request)
•
매물 아이디로 매물 정보 가져오기(request)
1. 동이름으로 위도 경도 데이터 구하기
import pandas as pd
import requests
addr = '서현동'
url = f'https://apis.zigbang.com/v2/search?leaseYn=N&q={addr}&serviceType=원룸'
response = requests.get(url)
data = response.json()['items'][0]
lat, lng = data['lat'], data['lng']
lat, lng
Python
복사
(37.382808685302734, 127.12608337402344)
2. 위도 경도로 geohash 알아내기
# geohash 사용하기 위해 패키지 다운로드 필요
!pip install geohash2
import geohash2
Python
복사
geohash = geohash2.encode(lat, lng, precision=5) # precision 의 값이 커질수록 영역이 좁아진다.
geohash
Python
복사
'wydks'
3. geohash로 매물 아이디 가져오기
url = 'https://apis.zigbang.com/v2/items/oneroom?geohash=wydks&depositMin=0&rentMin=0&salesTypes[0]=전세&salesTypes[1]=월세&&domain=zigbang&checkAnyItemWithoutFilter=true'
response = requests.get(url)
ids = [item['itemId'] for item response.json()['items']] # 매물 정보
len(ids), ids[:5] # 매물 개수 확인
Python
복사
(197, [42336668, 42210019, 42206782, 42331725, 42294062])
page_block = 15
dfs = []
for start in range(0, len(ids), 15):
end = start + page_block
url = 'https://apis.zigbang.com/v2/items/list'
params = {
'domain' : 'zigbang',
'item_ids' : ids[start:end], # 한번에 가져오는 매물 개수 15개로 설정
}
response = requests.pose(url, data=params)
data = response.json()['items']
df = pd.DataFrame(data)[['item_id','deposit','rent','size_m2','address1']]
dfs.append(df)
Python
복사
len(dfs) # 14
result = pd.concat(dfs, ignore_index=True)
result.tail(2)
Python
복사
item_id | deposit | rent | size_m2 | address1 | |
195 | 42361607 | 1000 | 110 | 72.41 | 경기도 성남시 분당구 삼평동 |
196 | 42299025 | 28000 | 10 | 69.07 | 경기도 성남시 분당구 삼평동 |
‘서현동’을 검색했는데 크롤링해온 데이터에 ‘삼평동’이 포함되는 이유는 geohash 의 precision 파라미터 값을 5로 설정해 기존보다 지역 범위가 넓어졌기 때문이다.
‘서현동’ 만을 검색하고 싶다면 address1 의 값에서 필터링해주면 된다.
result[result['address1'].str.contains('서현동')].reset_index(drop=True).tail(2)
Python
복사
item_id | deposit | rent | size_m2 | address1 | |
42 | 42369145 | 24000 | 0 | 75.0900 | 경기도 성남시 분당구 서현동 |
43 | 42373351 | 21500 | 15 | 72.7273 | 경기도 성남시 분당구 서현동 |
→ ‘서현동’으로 필터링해주니 총 44개의 매물로 줄어든 것을 확인할 수 있다.