[python-크롤링] 직방에서 특정 조건의 부동산 매물 크롤링하기

·

·

,

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

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

아래는 코드 전문입니다.

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

전체코드

# -*- 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 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, headers=header)

data = json.loads(resp.text)
json_data = json_normalize(data)
clusters = json_data.loc[0, "clusters"]
list_all = pd.DataFrame(json_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[df["매물소개"].str.contains("100|중기청|중소기업|인천", 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 = "{}{}{}".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,
)

Code language: PHP (php)

댓글 남기기