부동산웹에서 위도 경도를 활용해 geohash를 구하고 이를 활용해 매물id, 매물 정보를 가져와보자.
Z부동산 웹 > 원룸을 선택 > F12 개발자도구 > Network > Fetch/XHR > 클리어 해주기 > 망원동 입력 > 망원동 클릭
위에 방식이 이해가 가지 않는다면 Web과 Web Scarping / Crawling1과 2를 보고오길 추천한다.
다음과 같이 검색 결과 Preview에서 lat, lng(위도, 경도)값을 확인하였다.
다음 Preview 에서 itemID, lat, lng를 확인할 수 있다.
list에서는 POST방식으로 데이터를 response한 것을 확인하였다. 그리고 itemId가 저장되어있다.
Preview를 확인해보니 원룸에 대한 정보가 나와있는 것을 확인하였다.
마지막으로 geohash값을 확인해주고 데이터를 수집할 준비를 마쳤다.
geohach는 위도 경도값(점)에서 어느정도까지 떨어져있는지 나타내는 값이다.
위도, 경도값 > geohash값 > itemId, lat, lng > list안에 itemId 조회 > 데이터 수집
다음가 같은 과정을 통해 데이터를 수집해보자.
동이름으로 위도, 경도 구하기
다음 검색기록을 확인하여 request URL을 확인한다.
다음 url은 한글데이터를 숫자와 특수기호를 통해 전달하기 편한 형태로 되어있다.
url을 구하기 위해서는 아래 디코딩 사이트의 디코딩을 활용하여 사용가능한 url로 변환해주자.
- https://apis.zigbang.com/v2/search?leaseYn=N&q=%EB%A7%9D%EC%9B%90%EB%8F%99&serviceType=%EC%9B%90%EB%A3%B8
- https://meyerweb.com/eric/tools/dencoder/
URL Decoder/Encoder
meyerweb.com
Request Method가 GET방식임으로 requests.get()을 활용한다.
import requests
import pandas as pd
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
(37.556785583496094, 126.9013442993164)
위도 경도로 geohash알아내기
얻은 url을 활용해 다음과 같이 lat과 lng을 구했다면 geohash2를 활용해 geohash를 구해보자
!pip install geohash2
우선 geohash2를 install해주자. 시간이 좀 걸릴 수 있다.
다음 코드를 활용해 geohash를 구해준다.
import geohash2
geohash = geohash2.encode(lat, lng, precision = 5)
geohash
- wydjx
geohash로 매물 아이디 가져오기
마찬가지로 request URL을 확인하고 이를 디코딩해준다.
GET방식으로 response해야된다는 것을 확인하였다.
코드를 쓰면서 response를 찍어보고 데이터 구조를 파악하길 바란다. 그리고 왜 item_ids를 리스트 컴프리헨션을
사용해 짜게 되었는지 이해하길 바란다.
url = f'https://apis.zigbang.com/v2/items/oneroom?geohash={geohash}&depositMin=0&rentMin=0&salesTypes[0]=전세&salesTypes[1]=월세&domain=zigbang&checkAnyItemWithoutFilter=true'
response = requests.get(url)
item_ids = [data['itemId'] for data in response.json()['items']]
len(item_ids), item_ids[:5]
(372, [42196796, 42078100, 42149571, 42184803, 42204685])
매물 아이디로 매물 정보 가져오기
마지막은 POST방식으로 진행되었다.
url = 'https://apis.zigbang.com/v2/items/list'
params = {'domain': "zigbang", 'item_ids': item_ids}
response = requests.post(url, params)
response
<Response [200]>
data = response.json()['items']
df = pd.DataFrame(data)
df = df[df['address1'].str.contains(addr)].reset_index(drop=True)
df = df[['item_id','sales_title', 'deposit', 'rent', 'size_m2', 'floor', 'building_floor', 'title', 'address1']]
df.tail(2)
하나의 함수로 만들기
#5. functjon
def oneroom(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']
geohash = geohash2.encode(lat, lng, precision = 5)
url = f'https://apis.zigbang.com/v2/items/oneroom?geohash={geohash}&depositMin=0&rentMin=0&salesTypes[0]=전세&salesTypes[1]=월세&domain=zigbang&checkAnyItemWithoutFilter=true'
response = requests.get(url)
item_ids = [data['itemId'] for data in response.json()['items']]
url = 'https://apis.zigbang.com/v2/items/list'
params = {'domain': "zigbang", 'item_ids': item_ids}
response = requests.post(url, params)
data = response.json()['items']
df = pd.DataFrame(data)
df = df[df['address1'].str.contains(addr)].reset_index(drop=True)
return df[['item_id','sales_title', 'deposit', 'rent', 'size_m2', 'floor', 'building_floor', 'title', 'address1']]
df = oneroom('망원동')
df.tail(2)
'<프로그래밍> > [python-WebCrawling]' 카테고리의 다른 글
Web Crawling5 (0) | 2024.09.23 |
---|---|
Web과 Web Scarping / Crawling 2(NAVER API) (1) | 2024.09.21 |
Web과 Web Scraping / Crawling 1 (1) | 2024.09.19 |