직방에서 지역과 조건을 설정했을 때, 목록에 뜨는 각 매물들의 세부정보를 불러오는 코드입니다. 부동산 서비스들이 전부 매물의 세부정보(세부설명)에 대한 검색이나 손쉬운 열람을 허용하지 않아서 만들었습니다.

자세한 설명은 추후 시간이 날 때 하도록 하겠습니다.

아래는 코드 전문입니다.

불필요한 코드들이 중간에 섞여 있습니다.

전체코드

# -*- coding: utf-8 -*-
import requests
import json
import pandas as pd
from pandas.io.json import json_normalize
from urllib.request import Request, urlopen
from bs4 import BeautifulSoup
import numpy as np
import time
from datetime import datetime
 
# %% 원하는 지역에서 부동산 추출 자동화
header =
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.220 Whale/1.3.51.7 Safari/537.36',
    'Referer': '<https://m.land.naver.com/>'

 
url = '<https://apis.zigbang.com/v2/items?domain=zigbang&zoom=14&sales_type_in=%EC%A0%84%EC%84%B8&deposit_lteq=10000&rent_lteq=5&new_villa=true&geohash=wyd>'
 
resp = requests.get(url)
data = json.loads(resp.text)
json_normalize(data)
json_normalize(data).loc[0, 'clusters']
list_all = pd.DataFrame(json_normalize(data).loc[0, 'items'])
df_want = pd.DataFrame()
for item in list_all['item_id'].values.tolist():
    item_id = str(item)
    url_item = '<https://apis.zigbang.com/v1/items/>' + item_id + '/read?domain=zigbang&uuid=b68e3880-c6cd-11e9-ba12-9ba7629b771c'
    req = Request(url_item, headers=header)
    res = urlopen(req)
    html = res.read()
    bs = BeautifulSoup(html, 'html.parser')
    df_want = df_want.append(pd.DataFrame(data='item_id':[item], '매물소개':[bs]}))
df = pd.merge(df_want, list_all, on='item_id', how='left')
 
# %% 원하는 조건만 남기기
df['매물소개'] = df['매물소개'].astype('str')
df_want = df['매물소개'].apply(lambda d: d.contains('100' or '중기청' or '중소기업' or '인천', na=False))
df_want = df[df.매물소개.str.contains('중기청' or '중소기업', na=False)]
df_want['매물주소'] = df_want['item_id'].astype('int').astype('str').apply(lambda d: '<https://zigbang.com/home/villa/items/>' + d)
 
# %% 저장하기
now = datetime.now()
now_str = str('{}{}{}').format(now.year, now.month, now.day)
df_want.to_excel('S:/내 드라이브/09_git/Py-Projects/0004/data/estate_zigbang(' + now_str + ').xlsx', sheet_name='Sheet1', header=True, index=False)