<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:media="http://search.yahoo.com/mrss/"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>파이썬 &#8211; 투데이즈.kr</title>
	<atom:link href="https://2days.kr/tag/%ed%8c%8c%ec%9d%b4%ec%8d%ac/feed/" rel="self" type="application/rss+xml" />
	<link>https://2days.kr</link>
	<description>투데이즈</description>
	<lastBuildDate>Sun, 16 Nov 2025 13:12:20 +0000</lastBuildDate>
	<language>ko-KR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8</generator>

<image>
	<url>https://2days.kr/wp-content/uploads/2025/10/cropped-simbol-1-32x32.png</url>
	<title>파이썬 &#8211; 투데이즈.kr</title>
	<link>https://2days.kr</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>검색어 분석 트렌드 파이썬 코드 만들기 with Streamlit 1편</title>
		<link>https://2days.kr/30/09/14/59326/it/program/</link>
		
		<dc:creator><![CDATA[urjent]]></dc:creator>
		<pubDate>Mon, 30 Sep 2024 05:33:27 +0000</pubDate>
				<category><![CDATA[program]]></category>
		<category><![CDATA[검색어분석]]></category>
		<category><![CDATA[코드]]></category>
		<category><![CDATA[트렌드]]></category>
		<category><![CDATA[파이썬]]></category>
		<category><![CDATA[파이썬코드]]></category>
		<guid isPermaLink="false">https://2days.kr/?p=59326</guid>

					<description><![CDATA[검색어 분석 트렌드를 알아보기 위해서 파이썬으로 코드를 만들어봅니다. 검색어 분석을 위해 다양한 프로그램이나 웹사이트를 이용하지만 나에게 맞게 커스터마이징을 할 수 없어서 쉽게 볼 수 있는 페이지를 하나 만들려고 합니다. 검색어 분석 트렌드 파이썬 코드 만들기 with Streamlit 1차로 만들 페이지는 아래와 같습니다. 검색어 분석 트렌드 파이썬 코드 만들기 with Streamlit &#160; 네이버 검색 키워드를 가져온 후 월간검색 및 월 클릭 수 작성된 페이지 수를 네이버에서 받아서 정보를 뿌려줍니다. 검색어 [&#8230;]]]></description>
										<content:encoded><![CDATA[<p data-ke-size="size16">검색어 분석 트렌드를 알아보기 위해서 파이썬으로 코드를 만들어봅니다. 검색어 분석을 위해 다양한 프로그램이나 웹사이트를 이용하지만 나에게 맞게 커스터마이징을 할 수 없어서 쉽게 볼 수 있는 페이지를 하나 만들려고 합니다.</p>
<h3 data-ke-size="size23">검색어 분석 트렌드 파이썬 코드 만들기 with Streamlit</h3>
<p>1차로 만들 페이지는 아래와 같습니다.</p>
<figure data-ke-type="image" data-ke-mobilestyle="widthOrigin" data-ke-style="alignCenter">
<p><figure style="width: 1720px" class="wp-caption alignnone"><img post-id="59326" fifu-featured="1" decoding="async" src="https://blog.kakaocdn.net/dn/OtNLX/btsJQKe6n6b/0D4VuKJPi0EJR3mjk9JUkK/img.png" alt="검색어 분석 트렌드 파이썬 코드 만들기 with Streamlit 1편" title="검색어 분석 트렌드 파이썬 코드 만들기 with Streamlit 1편" width="1720" height="1236" data-is-animation="false" data-origin-width="1720" data-origin-height="1236" data-filename="스크린샷 2024-09-30 오후 2.24.50.png" loading="lazy" data-origin- title="검색어 분석 트렌드 파이썬 코드 만들기 with Streamlit 1편 1"><figcaption class="wp-caption-text">검색어 분석 트렌드 파이썬 코드 만들기 with Streamlit 1편</figcaption></figure><figcaption>검색어 분석 트렌드 파이썬 코드 만들기 with Streamlit</figcaption></figure><div class='code-block code-block-2' style='margin: 8px auto; text-align: center; display: block; clear: both;'>
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8940400388075870"
     crossorigin="anonymous"></script>
<!-- 중간 -->
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-8940400388075870"
     data-ad-slot="8794586137"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></div>

<p>&nbsp;</p>
<p>네이버 검색 키워드를 가져온 후 월간검색 및 월 클릭 수 작성된 페이지 수를 네이버에서 받아서 정보를 뿌려줍니다.</p>
<figure data-ke-type="image" data-ke-mobilestyle="widthOrigin" data-ke-style="alignCenter">
<p><figure style="width: 2718px" class="wp-caption alignnone"><img decoding="async" src="https://blog.kakaocdn.net/dn/mZ2Hh/btsJRXLk4fx/QeIw3B6LwslySR4cQtF8D1/img.png" alt="검색어 분석 트렌드 파이썬 코드 만들기 with Streamlit 1편" width="2718" height="1286" data-is-animation="false" data-origin-width="2718" data-origin-height="1286" data-filename="스크린샷 2024-09-30 오후 2.24.58.png" loading="lazy" data-origin- title="검색어 분석 트렌드 파이썬 코드 만들기 with Streamlit 1편 2"><figcaption class="wp-caption-text">검색어 분석 트렌드 파이썬 코드 만들기 with Streamlit 1편</figcaption></figure><figcaption>검색어 분석 트렌드 파이썬 코드 만들기 with Streamlit</figcaption></figure>
<figure data-ke-type="image" data-ke-mobilestyle="widthOrigin" data-ke-style="alignCenter">
<p><figure style="width: 1740px" class="wp-caption alignnone"><img decoding="async" src="https://blog.kakaocdn.net/dn/c10byD/btsJQE69MwD/0m9VQhqOwSvty1dnCaeVtK/img.png" alt="검색어 분석 트렌드 파이썬 코드 만들기 with Streamlit 1편" width="1740" height="1068" data-is-animation="false" data-origin-width="1740" data-origin-height="1068" data-filename="스크린샷 2024-09-30 오후 2.25.07.png" loading="lazy" data-origin- title="검색어 분석 트렌드 파이썬 코드 만들기 with Streamlit 1편 3"><figcaption class="wp-caption-text">검색어 분석 트렌드 파이썬 코드 만들기 with Streamlit 1편</figcaption></figure><figcaption>검색어 분석 트렌드 파이썬 코드 만들기 with Streamlit</figcaption></figure>
<p>이렇게 한 후 모바일(모바일이 대세라)검색 수는 많지만 경쟁정도가 낮은 키워드를 추천하도록 먼저 설계를 해보겠습니다. 전체 코드는 아래와 같습니다.</p>
<pre id="code_1727674058483" class="bash hljs" contenteditable="false" data-ke-language="bash" data-ke-type="codeblock">import streamlit as st
import urllib.request
import json
import pandas as pd
import requests
import time
import hashlib
import hmac
import base64
import concurrent.futures

<span class="hljs-comment"># 사용자 입력 부분을 Streamlit으로 변경</span>
st.title(<span class="hljs-string">'Naver Keyword Analysis Tool'</span>)

<span class="hljs-comment"># st.secrets에서 API 키를 불러옴</span>
CUSTOMER_ID = st.secrets[<span class="hljs-string">"general"</span>][<span class="hljs-string">"CUSTOMER_ID"</span>]
API_KEY = st.secrets[<span class="hljs-string">"general"</span>][<span class="hljs-string">"API_KEY"</span>]
SECRET_KEY = st.secrets[<span class="hljs-string">"general"</span>][<span class="hljs-string">"SECRET_KEY"</span>]
client_id = st.secrets[<span class="hljs-string">"general"</span>][<span class="hljs-string">"client_id"</span>]
client_secret = st.secrets[<span class="hljs-string">"general"</span>][<span class="hljs-string">"client_secret"</span>]

<span class="hljs-comment"># 키워드 입력</span>
keywords = st.text_area(<span class="hljs-string">'분석할 키워드를 입력하세요 (쉼표로 구분)'</span>, <span class="hljs-string">'chatgpt'</span>).split(<span class="hljs-string">','</span>)

BASE_URL = <span class="hljs-string">'https://api.naver.com'</span>

class Signature:
    @staticmethod
    def generate(timestamp, method, uri, secret_key):
        message = <span class="hljs-string">"{}.{}.{}"</span>.format(timestamp, method, uri)
        <span class="hljs-built_in">hash</span> = hmac.new(bytes(secret_key, <span class="hljs-string">"utf-8"</span>), bytes(message, <span class="hljs-string">"utf-8"</span>), hashlib.sha256)
        <span class="hljs-built_in">return</span> base64.b64encode(hash.digest())

def get_request_header(method, uri):
    timestamp = str(round(time.time() * 1000))
    signature = Signature.generate(timestamp, method, uri, SECRET_KEY)
    <span class="hljs-built_in">return</span> {
        <span class="hljs-string">'Content-Type'</span>: <span class="hljs-string">'application/json; charset=UTF-8'</span>,
        <span class="hljs-string">'X-Timestamp'</span>: timestamp,
        <span class="hljs-string">'X-API-KEY'</span>: API_KEY,
        <span class="hljs-string">'X-Customer'</span>: str(CUSTOMER_ID),
        <span class="hljs-string">'X-Signature'</span>: signature
    }

@st.cache_data
def get_keyword_analysis(keyword):
    uri = <span class="hljs-string">'/keywordstool'</span>
    method = <span class="hljs-string">'GET'</span>
    r = requests.get(
        BASE_URL + uri,
        params={<span class="hljs-string">'hintKeywords'</span>: keyword, <span class="hljs-string">'showDetail'</span>: 1},
        headers=get_request_header(method, uri)
    )
    df = pd.DataFrame(r.json()[<span class="hljs-string">'keywordList'</span>])
    df[<span class="hljs-string">'monthlyMobileQcCnt'</span>] = df[<span class="hljs-string">'monthlyMobileQcCnt'</span>].apply(lambda x: int(str(x).replace(<span class="hljs-string">'&lt;'</span>, <span class="hljs-string">''</span>).strip()))
    df[<span class="hljs-string">'monthlyPcQcCnt'</span>] = df[<span class="hljs-string">'monthlyPcQcCnt'</span>].apply(lambda x: int(str(x).replace(<span class="hljs-string">'&lt;'</span>, <span class="hljs-string">''</span>).strip()))
    df = df[(df[<span class="hljs-string">'monthlyMobileQcCnt'</span>] &gt;= 50) &amp; (df[<span class="hljs-string">'monthlyPcQcCnt'</span>] &gt;= 50)]
    df.rename(
        {<span class="hljs-string">'compIdx'</span>: <span class="hljs-string">'경쟁정도'</span>,
        <span class="hljs-string">'monthlyMobileQcCnt'</span>: <span class="hljs-string">'월간검색수_모바일'</span>,
        <span class="hljs-string">'monthlyPcQcCnt'</span>: <span class="hljs-string">'월간검색수_PC'</span>,
        <span class="hljs-string">'relKeyword'</span>: <span class="hljs-string">'연관키워드'</span>},
        axis=1,
        inplace=True
    )
    df[<span class="hljs-string">'총검색수'</span>] = df[<span class="hljs-string">'월간검색수_PC'</span>] + df[<span class="hljs-string">'월간검색수_모바일'</span>]
    df = df.sort_values(<span class="hljs-string">'총검색수'</span>, ascending=False)
    <span class="hljs-built_in">return</span> df

<span class="hljs-comment"># 문서 수 검색 함수</span>
def get_total_docs(keyword):
    try:
        encText = urllib.parse.quote(keyword)
        url = f<span class="hljs-string">"https://openapi.naver.com/v1/search/webkr.json?query={encText}"</span>
        request = urllib.request.Request(url)
        request.add_header(<span class="hljs-string">"X-Naver-Client-Id"</span>, client_id)
        request.add_header(<span class="hljs-string">"X-Naver-Client-Secret"</span>, client_secret)

        <span class="hljs-comment"># 타임아웃 설정</span>
        with urllib.request.urlopen(request, timeout=10) as response:
            rescode = response.getcode()

            <span class="hljs-keyword">if</span> rescode == 200:
                response_body = response.read()
                text = response_body.decode(<span class="hljs-string">'utf-8'</span>)
                <span class="hljs-built_in">return</span> json.loads(text)[<span class="hljs-string">'total'</span>]
            <span class="hljs-keyword">else</span>:
                st.error(f<span class="hljs-string">"Error Code {rescode} for keyword: {keyword}"</span>)
                <span class="hljs-built_in">return</span> 0
    except urllib.error.HTTPError as e:
        st.error(f<span class="hljs-string">"HTTPError: {e.code} for keyword: {keyword}"</span>)
        <span class="hljs-built_in">return</span> 0
    except urllib.error.URLError as e:
        st.error(f<span class="hljs-string">"URLError: {e.reason} for keyword: {keyword}"</span>)
        <span class="hljs-built_in">return</span> 0
    except Exception as e:
        st.error(f<span class="hljs-string">"Exception: {str(e)} for keyword: {keyword}"</span>)
        <span class="hljs-built_in">return</span> 0

<span class="hljs-comment"># Streamlit button for running analysis</span>
<span class="hljs-keyword">if</span> st.button(<span class="hljs-string">'분석 실행'</span>):
    tmp_df = pd.DataFrame()

    with st.spinner(<span class="hljs-string">'키워드 분석 중...'</span>):
        <span class="hljs-keyword">for</span> keyword <span class="hljs-keyword">in</span> keywords:
            keyword = keyword.strip()  <span class="hljs-comment"># Trim whitespace</span>
            df = get_keyword_analysis(keyword)
            tmp_df = pd.concat([tmp_df, df], axis=0)

    <span class="hljs-keyword">if</span> not tmp_df.empty:
        <span class="hljs-comment"># '연관키워드' 개수 출력</span>
        st.write(f<span class="hljs-string">"연관키워드 개수: {len(tmp_df['연관키워드'])}"</span>)

        <span class="hljs-comment"># Progress bar for document search</span>
        progress_bar = st.progress(0)
        progress_text = st.empty()

        <span class="hljs-comment"># 병렬 처리로 문서 검색 수행</span>
        with concurrent.futures.ThreadPoolExecutor() as executor:
            total_docs = list(executor.map(get_total_docs, tmp_df[<span class="hljs-string">'연관키워드'</span>]))

        tmp_df[<span class="hljs-string">'총문서수'</span>] = total_docs
        tmp_df[<span class="hljs-string">'경쟁정도_ratio'</span>] = tmp_df[<span class="hljs-string">'총문서수'</span>] / tmp_df[<span class="hljs-string">'총검색수'</span>]

        <span class="hljs-comment"># Progress 업데이트</span>
        <span class="hljs-keyword">for</span> i, word <span class="hljs-keyword">in</span> enumerate(tmp_df[<span class="hljs-string">'연관키워드'</span>]):
            progress_bar.progress((i + 1) / len(tmp_df[<span class="hljs-string">'연관키워드'</span>]))
            progress_text.text(f<span class="hljs-string">"문서 검색 진행 중... ({i + 1}/{len(tmp_df['연관키워드'])})"</span>)

        <span class="hljs-comment"># Display final dataframe</span>
        st.write(tmp_df)

        <span class="hljs-comment"># 경쟁정도가 작고, 모바일 검색이 높은 순으로 정렬</span>
        recommended_df = tmp_df.sort_values(by=[<span class="hljs-string">'경쟁정도'</span>, <span class="hljs-string">'월간검색수_모바일'</span>], ascending=[True, False])

        <span class="hljs-comment"># 추천 목록을 표로 표시</span>
        st.subheader(<span class="hljs-string">'추천 키워드 (경쟁정도가 낮고 모바일 검색이 높은 순서)'</span>)
        st.write(recommended_df[[<span class="hljs-string">'연관키워드'</span>, <span class="hljs-string">'경쟁정도'</span>, <span class="hljs-string">'월간검색수_모바일'</span>]].head(10))  <span class="hljs-comment"># 상위 10개의 추천 키워드</span>

        <span class="hljs-comment"># Provide a download link for the resulting dataframe</span>
        csv = tmp_df.to_csv(index=False).encode(<span class="hljs-string">'utf-8'</span>)
        st.download_button(<span class="hljs-string">"CSV 다운로드"</span>, data=csv, file_name=<span class="hljs-string">'keyword_analysis.csv'</span>, mime=<span class="hljs-string">'text/csv'</span>)</pre>
<p>이렇게 작성한 후 다음편에서 조금 다듬어 보겠습니다.</p>
<!-- CONTENT END 2 -->
]]></content:encoded>
					
		
		
		<media:content url="https://blog.kakaocdn.net/dn/OtNLX/btsJQKe6n6b/0D4VuKJPi0EJR3mjk9JUkK/img.png" medium="image"></media:content>
            	</item>
		<item>
		<title>업체 정보 파이썬 :  대표자, 주소, 매출을 한눈에 살펴보기 with python</title>
		<link>https://2days.kr/19/09/17/56562/it/program/</link>
		
		<dc:creator><![CDATA[urjent]]></dc:creator>
		<pubDate>Thu, 19 Sep 2024 08:01:31 +0000</pubDate>
				<category><![CDATA[program]]></category>
		<category><![CDATA[업체 매출 크롤링]]></category>
		<category><![CDATA[업체 정보]]></category>
		<category><![CDATA[업체 정보 파이싼]]></category>
		<category><![CDATA[파이썬]]></category>
		<category><![CDATA[파이썬 크롤링]]></category>
		<guid isPermaLink="false">https://2days.kr/?p=56562</guid>

					<description><![CDATA[업체 정보 파이썬 : 대표자, 주소, 매출을 한눈에 살펴보기 with python l 가끔 업체 조사를 할 때면 각 업체의 대표자, 주소, 설립일, 매출 등을 살펴봅니다. 네이버에서 보면 나이스 신용평가에서 제공하는 서비스가 링크가 걸려있는데 이 링크를 클릭하면 그 회사의 정보를 얻을 수 있습니다. 하지만 여러 업체를 조사하려면 꽤 시간이 많이 걸리죠. 그래서 이 노가다 작업을 쉽게 [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>업체 정보 파이썬 : 대표자, 주소, 매출을 한눈에 살펴보기 with python l 가끔 업체 조사를 할 때면 각 업체의 대표자, 주소, 설립일, 매출 등을 살펴봅니다. 네이버에서 보면 나이스 신용평가에서 제공하는 서비스가 링크가 걸려있는데 이 링크를 클릭하면 그 회사의 정보를 얻을 수 있습니다. 하지만 여러 업체를 조사하려면 꽤 시간이 많이 걸리죠. 그래서 이 노가다 작업을 쉽게 하기 위해서 코드를 하나 만들어 보려고합니다.</p>
<h3 data-ke-size="size23">업체 정보 파이썬 : 대표자, 주소, 매출을 한눈에 살펴보기 with python</h3>
<p>먼저 네이버에서 해당 정보를 얻기 위해서 구조를 살펴보면 업체를 검색한 뒤, 주소가 바뀌는 패던을 보면 kiscode 값이 바뀌는 것을 볼 수 있습니다. 업체의 고유 번호 같은 것인데, 이 코드를 받은 후 나이스 평가 사이트에서 이 값을 다시 넣어서 업체를 조회하는 패턴으로 코드를 작성해주려고 합니다.</p>
<figure data-ke-type="image" data-ke-mobilestyle="widthOrigin" data-ke-style="alignCenter"><figure style="width: 2560px" class="wp-caption alignnone"><img decoding="async" src="https://blog.kakaocdn.net/dn/exyHRW/btsJEEsRR4y/uL8u1h25seB6NekPP34Lw0/img.png" alt="업체 정보 파이썬 :  대표자, 주소, 매출을 한눈에 살펴보기 with python" width="2560" height="2560" data-origin-width="2560" data-origin-height="2560" data-is-animation="false" data-filename="[업체 정보] 대표자, 주소, 매출을 한눈에 살펴보기 with python.png" loading="lazy" data-origin- title="업체 정보 파이썬 : 대표자, 주소, 매출을 한눈에 살펴보기 with python 7"><figcaption class="wp-caption-text">업체 정보 파이썬 : 대표자, 주소, 매출을 한눈에 살펴보기 with python</figcaption></figure><figcaption>[업체 정보] 대표자, 주소, 매출을 한눈에 살펴보기 with python</figcaption></figure><div class='code-block code-block-2' style='margin: 8px auto; text-align: center; display: block; clear: both;'>
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8940400388075870"
     crossorigin="anonymous"></script>
<!-- 중간 -->
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-8940400388075870"
     data-ad-slot="8794586137"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></div>

<p><span style="color: #ee2323;">[나이스 평가 사이트에서는 무단 크롤링을 엄격히 금지하고 있으니 공부 목적으로만 사용하시기 바랍니다. 고유 지적 재산에 해당 할 수 있으니 이 코드를 유료로도 판매하지 마시고, 또 공부 외의 목적으로는 절대 남용하지 마십시오]</span></p>
<p>아래 보면 (주)삼성전자 의 KISCODE 를 확인할 수 있습니다.</p>
<figure data-ke-type="image" data-ke-mobilestyle="widthOrigin" data-ke-style="alignCenter"><img decoding="async" src="https://blog.kakaocdn.net/dn/BVI6h/btsJF9FelNb/yQ0gDabOKexZ6x31IKs0t1/img.png" data-is-animation="false" data-origin-width="1606" data-origin-height="1446" data-filename="스크린샷 2024-09-19 오후 3.07.00.png" loading="lazy" alt="img" title="업체 정보 파이썬 : 대표자, 주소, 매출을 한눈에 살펴보기 with python 8"><figcaption>[업체 정보] 대표자, 주소, 매출을 한눈에 살펴보기 with python</figcaption></figure>
<figure data-ke-type="image" data-ke-mobilestyle="widthOrigin" data-ke-style="alignCenter"><img decoding="async" src="https://blog.kakaocdn.net/dn/bGtTt3/btsJEQGCHLR/86SXs3s9tSqSyeqWQNM2Ik/img.png" data-is-animation="false" data-origin-width="2358" data-origin-height="1076" data-filename="스크린샷 2024-09-19 오후 3.27.03.png" loading="lazy" alt="img" title="업체 정보 파이썬 : 대표자, 주소, 매출을 한눈에 살펴보기 with python 9"><figcaption>[업체 정보] 대표자, 주소, 매출을 한눈에 살펴보기 with python</figcaption></figure>
<p>이렇게 조회한 정보에서 대표자 ~ 상장일자 정보까지 추출해 보겠습니다.</p>
<pre id="code_1726715543453" class="bash hljs" contenteditable="false" data-ke-language="bash" data-ke-type="codeblock">import streamlit as st
import pandas as pd
import requests
from bs4 import BeautifulSoup
import ssl
from requests.adapters import HTTPAdapter
from urllib3.poolmanager import PoolManager
import re
import time

<span class="hljs-comment"># SSL/TLS 설정을 위한 어댑터 클래스</span>
class TLSAdapter(HTTPAdapter):
    def init_poolmanager(self, *args, **kwargs):
        context = ssl.create_default_context()
        context.set_ciphers(<span class="hljs-string">'DEFAULT:@SECLEVEL=1'</span>)
        kwargs[<span class="hljs-string">'ssl_context'</span>] = context
        <span class="hljs-built_in">return</span> super().init_poolmanager(*args, **kwargs)

<span class="hljs-comment"># 세션 생성 및 어댑터 설정</span>
session = requests.Session()
session.mount(<span class="hljs-string">'https://'</span>, TLSAdapter())

<span class="hljs-comment"># 네이버 검색 결과에서 kiscode 추출 함수</span>
def find_kiscode_from_naver_search(query):
    search_url = <span class="hljs-string">'https://search.naver.com/search.naver'</span>
    headers = {
        <span class="hljs-string">'User-Agent'</span>: <span class="hljs-string">'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'</span>
    }
    params = {
        <span class="hljs-string">'where'</span>: <span class="hljs-string">'nexearch'</span>,
        <span class="hljs-string">'sm'</span>: <span class="hljs-string">'top_hty'</span>,
        <span class="hljs-string">'fbm'</span>: <span class="hljs-string">'0'</span>,
        <span class="hljs-string">'ie'</span>: <span class="hljs-string">'utf8'</span>,
        <span class="hljs-string">'query'</span>: query
    }

    try:
        response = session.get(search_url, headers=headers, params=params)
        response.raise_for_status()
        soup = BeautifulSoup(response.content, <span class="hljs-string">'html.parser'</span>)
        
        more_info_link = soup.find(<span class="hljs-string">'a'</span>, class_=<span class="hljs-string">'info_more'</span>, href=True)
        <span class="hljs-keyword">if</span> more_info_link and <span class="hljs-string">'kiscode='</span> <span class="hljs-keyword">in</span> more_info_link[<span class="hljs-string">'href'</span>]:
            kiscode = re.search(r<span class="hljs-string">'kiscode=([A-Za-z0-9]+)'</span>, more_info_link[<span class="hljs-string">'href'</span>])
            <span class="hljs-keyword">if</span> kiscode:
                <span class="hljs-built_in">return</span> kiscode.group(1), more_info_link[<span class="hljs-string">'href'</span>]
        <span class="hljs-built_in">return</span> None, None
    except requests.RequestException as e:
        st.error(f<span class="hljs-string">"Request failed: {e}"</span>)
        <span class="hljs-built_in">return</span> None, None

<span class="hljs-comment"># 나이스 사이트에서 업체 정보를 가져오는 함수</span>
def get_company_info(kiscode):
    url = f<span class="hljs-string">'https://www.nicebizinfo.com/ep/EP0100M002GE.nice?kiscode={kiscode}'</span>
    headers = {
        <span class="hljs-string">'User-Agent'</span>: <span class="hljs-string">'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'</span>
    }
    
    try:
        response = session.get(url, headers=headers)
        response.raise_for_status()
        soup = BeautifulSoup(response.content, <span class="hljs-string">'html.parser'</span>)
        
        company_info = {
            <span class="hljs-string">'대표자'</span>: soup.find(<span class="hljs-string">'p'</span>, string=<span class="hljs-string">'대표자'</span>).find_next_sibling(<span class="hljs-string">'strong'</span>).get_text(strip=True) <span class="hljs-keyword">if</span> soup.find(<span class="hljs-string">'p'</span>, string=<span class="hljs-string">'대표자'</span>) <span class="hljs-keyword">else</span> <span class="hljs-string">''</span>,
            <span class="hljs-string">'본사주소'</span>: soup.find(<span class="hljs-string">'p'</span>, string=<span class="hljs-string">'본사주소'</span>).find_next_sibling(<span class="hljs-string">'strong'</span>).get_text(strip=True) <span class="hljs-keyword">if</span> soup.find(<span class="hljs-string">'p'</span>, string=<span class="hljs-string">'본사주소'</span>) <span class="hljs-keyword">else</span> <span class="hljs-string">''</span>,
            <span class="hljs-string">'그룹명'</span>: soup.find(<span class="hljs-string">'p'</span>, string=<span class="hljs-string">'그룹명'</span>).find_next_sibling(<span class="hljs-string">'strong'</span>).get_text(strip=True) <span class="hljs-keyword">if</span> soup.find(<span class="hljs-string">'p'</span>, string=<span class="hljs-string">'그룹명'</span>) <span class="hljs-keyword">else</span> <span class="hljs-string">''</span>,
            <span class="hljs-string">'사업자번호'</span>: soup.find(<span class="hljs-string">'p'</span>, string=<span class="hljs-string">'사업자번호'</span>).find_next_sibling(<span class="hljs-string">'strong'</span>).get_text(strip=True) <span class="hljs-keyword">if</span> soup.find(<span class="hljs-string">'p'</span>, string=<span class="hljs-string">'사업자번호'</span>) <span class="hljs-keyword">else</span> <span class="hljs-string">''</span>,
            <span class="hljs-string">'기업형태'</span>: soup.find(<span class="hljs-string">'p'</span>, string=<span class="hljs-string">'기업형태'</span>).find_next_sibling(<span class="hljs-string">'strong'</span>).get_text(strip=True) <span class="hljs-keyword">if</span> soup.find(<span class="hljs-string">'p'</span>, string=<span class="hljs-string">'기업형태'</span>) <span class="hljs-keyword">else</span> <span class="hljs-string">''</span>,
            <span class="hljs-string">'산업'</span>: soup.find(<span class="hljs-string">'p'</span>, string=<span class="hljs-string">'산업'</span>).find_next_sibling(<span class="hljs-string">'strong'</span>).get_text(strip=True) <span class="hljs-keyword">if</span> soup.find(<span class="hljs-string">'p'</span>, string=<span class="hljs-string">'산업'</span>) <span class="hljs-keyword">else</span> <span class="hljs-string">''</span>,
            <span class="hljs-string">'설립일자'</span>: soup.find(<span class="hljs-string">'p'</span>, string=<span class="hljs-string">'설립일자'</span>).find_next_sibling(<span class="hljs-string">'strong'</span>).get_text(strip=True) <span class="hljs-keyword">if</span> soup.find(<span class="hljs-string">'p'</span>, string=<span class="hljs-string">'설립일자'</span>) <span class="hljs-keyword">else</span> <span class="hljs-string">''</span>,
            <span class="hljs-string">'상장일자'</span>: soup.find(<span class="hljs-string">'p'</span>, string=<span class="hljs-string">'상장일자'</span>).find_next_sibling(<span class="hljs-string">'strong'</span>).get_text(strip=True) <span class="hljs-keyword">if</span> soup.find(<span class="hljs-string">'p'</span>, string=<span class="hljs-string">'상장일자'</span>) <span class="hljs-keyword">else</span> <span class="hljs-string">''</span>
        }
        
        revenue_row = soup.find(<span class="hljs-string">'tr'</span>, class_=<span class="hljs-string">'bdBck fwb'</span>)
        <span class="hljs-keyword">if</span> revenue_row:
            revenues = revenue_row.find_all(<span class="hljs-string">'td'</span>, class_=<span class="hljs-string">'tar'</span>)
            revenue_data = []
            <span class="hljs-keyword">for</span> td <span class="hljs-keyword">in</span> revenues:
                text = td.get_text(strip=True).replace(<span class="hljs-string">','</span>, <span class="hljs-string">''</span>).replace(<span class="hljs-string">' '</span>, <span class="hljs-string">''</span>)
                <span class="hljs-keyword">if</span> text.isdigit():
                    revenue_data.append(f<span class="hljs-string">"{int(text):,} 원"</span>)
                <span class="hljs-keyword">else</span>:
                    revenue_data.append(text)
        <span class="hljs-keyword">else</span>:
            revenue_data = [<span class="hljs-string">''</span>, <span class="hljs-string">''</span>, <span class="hljs-string">''</span>]
        
        <span class="hljs-built_in">return</span> company_info, revenue_data
    except requests.RequestException as e:
        st.error(f<span class="hljs-string">"Request failed: {e}"</span>)
        <span class="hljs-built_in">return</span> {}, [<span class="hljs-string">''</span>, <span class="hljs-string">''</span>, <span class="hljs-string">''</span>]

<span class="hljs-comment"># 스트림릿 웹 앱 구성</span>
def main():
    st.title(<span class="hljs-string">"업체 정보 조회기"</span>)
    
    <span class="hljs-comment"># 옵션 선택: 직접 입력 vs 엑셀 업로드</span>
    option = st.radio(<span class="hljs-string">"업체명을 직접 입력하시겠습니까, 아니면 엑셀 파일을 업로드하시겠습니까?"</span>, (<span class="hljs-string">"직접 입력"</span>, <span class="hljs-string">"엑셀 업로드"</span>))

    <span class="hljs-keyword">if</span> option == <span class="hljs-string">"직접 입력"</span>:
        company_name = st.text_input(<span class="hljs-string">"업체명을 입력하세요:"</span>)
        <span class="hljs-keyword">if</span> st.button(<span class="hljs-string">"조회"</span>):
            kiscode, nice_info_url = find_kiscode_from_naver_search(company_name)
            <span class="hljs-keyword">if</span> kiscode:
                company_info, revenue_data = get_company_info(kiscode)
                result = {
                    <span class="hljs-string">'업체명'</span>: company_name,
                    <span class="hljs-string">'kiscode'</span>: kiscode,
                    <span class="hljs-string">'대표자'</span>: company_info.get(<span class="hljs-string">'대표자'</span>, <span class="hljs-string">''</span>),
                    <span class="hljs-string">'본사주소'</span>: company_info.get(<span class="hljs-string">'본사주소'</span>, <span class="hljs-string">''</span>),
                    <span class="hljs-string">'그룹명'</span>: company_info.get(<span class="hljs-string">'그룹명'</span>, <span class="hljs-string">''</span>),
                    <span class="hljs-string">'사업자번호'</span>: company_info.get(<span class="hljs-string">'사업자번호'</span>, <span class="hljs-string">''</span>),
                    <span class="hljs-string">'기업형태'</span>: company_info.get(<span class="hljs-string">'기업형태'</span>, <span class="hljs-string">''</span>),
                    <span class="hljs-string">'산업'</span>: company_info.get(<span class="hljs-string">'산업'</span>, <span class="hljs-string">''</span>),
                    <span class="hljs-string">'설립일자'</span>: company_info.get(<span class="hljs-string">'설립일자'</span>, <span class="hljs-string">''</span>),
                    <span class="hljs-string">'상장일자'</span>: company_info.get(<span class="hljs-string">'상장일자'</span>, <span class="hljs-string">''</span>),
                    <span class="hljs-string">'2023년 매출'</span>: revenue_data[0],
                    <span class="hljs-string">'2022년 매출'</span>: revenue_data[1],
                    <span class="hljs-string">'2021년 매출'</span>: revenue_data[2]
                }
                st.write(result)
            <span class="hljs-keyword">else</span>:
                st.write(f<span class="hljs-string">"업체 '{company_name}'를 찾을 수 없습니다."</span>)
    
    <span class="hljs-keyword">elif</span> option == <span class="hljs-string">"엑셀 업로드"</span>:
        uploaded_file = st.file_uploader(<span class="hljs-string">"업로드할 엑셀 파일을 선택하세요."</span>, <span class="hljs-built_in">type</span>=[<span class="hljs-string">"xlsx"</span>])
        
        <span class="hljs-keyword">if</span> uploaded_file is not None:
            df = pd.read_excel(uploaded_file)
            <span class="hljs-keyword">if</span> <span class="hljs-string">'업체명'</span> not <span class="hljs-keyword">in</span> df.columns:
                st.error(<span class="hljs-string">"엑셀 파일에 '업체명' 열이 존재하지 않습니다."</span>)
                <span class="hljs-built_in">return</span>
            
            results = []
            total_companies = len(df)
            completed_count = 0
            failed_count = 0
            progress_placeholder = st.empty()
            
            <span class="hljs-keyword">for</span> idx, company_name <span class="hljs-keyword">in</span> enumerate(df[<span class="hljs-string">'업체명'</span>]):
                kiscode, nice_info_url = find_kiscode_from_naver_search(company_name)
                company_info, revenue_data = ({<span class="hljs-string">'대표자'</span>: <span class="hljs-string">''</span>, <span class="hljs-string">'본사주소'</span>: <span class="hljs-string">''</span>, <span class="hljs-string">'그룹명'</span>: <span class="hljs-string">''</span>, <span class="hljs-string">'사업자번호'</span>: <span class="hljs-string">''</span>, <span class="hljs-string">'기업형태'</span>: <span class="hljs-string">''</span>, <span class="hljs-string">'산업'</span>: <span class="hljs-string">''</span>, <span class="hljs-string">'설립일자'</span>: <span class="hljs-string">''</span>, <span class="hljs-string">'상장일자'</span>: <span class="hljs-string">''</span>}, [<span class="hljs-string">''</span>, <span class="hljs-string">''</span>, <span class="hljs-string">''</span>]) <span class="hljs-keyword">if</span> not kiscode <span class="hljs-keyword">else</span> get_company_info(kiscode)
                
                result = {
                    <span class="hljs-string">'업체명'</span>: company_name,
                    <span class="hljs-string">'kiscode'</span>: kiscode <span class="hljs-keyword">if</span> kiscode <span class="hljs-keyword">else</span> <span class="hljs-string">''</span>,
                    <span class="hljs-string">'대표자'</span>: company_info.get(<span class="hljs-string">'대표자'</span>, <span class="hljs-string">''</span>),
                    <span class="hljs-string">'본사주소'</span>: company_info.get(<span class="hljs-string">'본사주소'</span>, <span class="hljs-string">''</span>),
                    <span class="hljs-string">'그룹명'</span>: company_info.get(<span class="hljs-string">'그룹명'</span>, <span class="hljs-string">''</span>),
                    <span class="hljs-string">'사업자번호'</span>: company_info.get(<span class="hljs-string">'사업자번호'</span>, <span class="hljs-string">''</span>),
                    <span class="hljs-string">'기업형태'</span>: company_info.get(<span class="hljs-string">'기업형태'</span>, <span class="hljs-string">''</span>),
                    <span class="hljs-string">'산업'</span>: company_info.get(<span class="hljs-string">'산업'</span>, <span class="hljs-string">''</span>),
                    <span class="hljs-string">'설립일자'</span>: company_info.get(<span class="hljs-string">'설립일자'</span>, <span class="hljs-string">''</span>),
                    <span class="hljs-string">'상장일자'</span>: company_info.get(<span class="hljs-string">'상장일자'</span>, <span class="hljs-string">''</span>),
                    <span class="hljs-string">'2023년 매출'</span>: revenue_data[0],
                    <span class="hljs-string">'2022년 매출'</span>: revenue_data[1],
                    <span class="hljs-string">'2021년 매출'</span>: revenue_data[2]
                }
                results.append(result)
                
                <span class="hljs-keyword">if</span> kiscode:
                    completed_count += 1
                <span class="hljs-keyword">else</span>:
                    failed_count += 1
                
                remaining_count = total_companies - (idx + 1)
                progress = (idx + 1) / total_companies * 100
                progress_placeholder.write(f<span class="hljs-string">"진척율: {progress:.2f}% | 완료: {completed_count}개 | 실패: {failed_count}개 | 남은 작업 수: {remaining_count}개"</span>)
                
                <span class="hljs-comment"># 각 요청 사이에 3초 딜레이 추가</span>
                time.sleep(1.5)
            
            <span class="hljs-comment"># 결과 출력</span>
            results_df = pd.DataFrame(results)
            <span class="hljs-keyword">if</span> not results_df.empty:
                st.write(results_df)
            
            <span class="hljs-keyword">if</span> failed_count &gt; 0:
                st.write(<span class="hljs-string">"다음 업체들은 정보를 찾을 수 없었습니다:"</span>)
                st.write([res[<span class="hljs-string">'업체명'</span>] <span class="hljs-keyword">for</span> res <span class="hljs-keyword">in</span> results <span class="hljs-keyword">if</span> not res[<span class="hljs-string">'kiscode'</span>]])
    
<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">"__main__"</span>:
    main()</pre>
<p>이렇게 추출한 코드는 streamlit에서 돌리면 아름다운 코드로 바뀌는 것을 볼 수 있습니다.</p>
<figure data-ke-type="image" data-ke-mobilestyle="widthOrigin" data-ke-style="alignCenter"><img decoding="async" src="https://blog.kakaocdn.net/dn/byo7ES/btsJDYkZd0i/u3VxguhrTTgnmFPHESYJhk/img.png" data-is-animation="false" data-origin-width="2366" data-origin-height="1066" data-filename="스크린샷 2024-09-19 오후 4.19.20.png" loading="lazy" alt="img" title="업체 정보 파이썬 : 대표자, 주소, 매출을 한눈에 살펴보기 with python 10"><figcaption><a href="https://2days.kr/14/09/14/56529/coding/data/">파이썬 부동산 매매가 조회 프로그램 만들기 4편 (전국 데이터)</a></figcaption></figure>
<!-- CONTENT END 4 -->
]]></content:encoded>
					
		
		
		<media:content url="https://2days.kr/wp-content/uploads/2024/09/업체-정보-대표자-주소-매출을-한눈에-살펴보기-with-python.png" medium="image"></media:content>
            	</item>
		<item>
		<title>[심화] streamlit 부동산 호가 수집 정보 서비스 하기</title>
		<link>https://2days.kr/18/09/23/56558/it/program/</link>
		
		<dc:creator><![CDATA[urjent]]></dc:creator>
		<pubDate>Wed, 18 Sep 2024 14:10:59 +0000</pubDate>
				<category><![CDATA[program]]></category>
		<category><![CDATA[부동산 정보]]></category>
		<category><![CDATA[부동산 크롤링]]></category>
		<category><![CDATA[부동산 호가]]></category>
		<category><![CDATA[파이썬]]></category>
		<category><![CDATA[파이썬 부동산]]></category>
		<guid isPermaLink="false">https://2days.kr/?p=56558</guid>

					<description><![CDATA[[심화] streamlit 부동산 호가 수집 정보 서비스 하기 편은 앞서 만든 코드를 이제 streamlit에서 서비스를 하기 위한 강의 입니다. 이 서비스를 통해 각 사용자가 입력하는 값에 따라 정보를 추출해서 보여줄 수 있기 때문에 매우 유용한 정보가 되리라 생각합니다. [심화] streamlit 부동산 호가 수집 정보 서비스 하기 이 편을 보기 전에 전 포스팅을 참고 하시면 이해가 [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>[심화] streamlit 부동산 호가 수집 정보 서비스 하기 편은 앞서 만든 코드를 이제 streamlit에서 서비스를 하기 위한 강의 입니다. 이 서비스를 통해 각 사용자가 입력하는 값에 따라 정보를 추출해서 보여줄 수 있기 때문에 매우 유용한 정보가 되리라 생각합니다.</p>
<h3 data-ke-size="size23">[심화] streamlit 부동산 호가 수집 정보 서비스 하기</h3>
<figure data-ke-type="image" data-ke-mobilestyle="widthOrigin" data-ke-style="alignCenter"><figure style="width: 2560px" class="wp-caption alignnone"><img decoding="async" src="https://blog.kakaocdn.net/dn/cwTDfk/btsJEO9eXUo/SnOyebR9pUL7V4Hyv6LFT1/img.png" alt="[심화] streamlit 부동산 호가 수집 정보 서비스 하기" width="2560" height="2560" data-origin-width="2560" data-origin-height="2560" data-is-animation="false" data-filename="[심화] streamlit 에 부동산 호가 수집 정보 서비스 하기.png" loading="lazy" data-origin- title="[심화] streamlit 부동산 호가 수집 정보 서비스 하기 13"><figcaption class="wp-caption-text">[심화] streamlit 부동산 호가 수집 정보 서비스 하기</figcaption></figure></figure><div class='code-block code-block-2' style='margin: 8px auto; text-align: center; display: block; clear: both;'>
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8940400388075870"
     crossorigin="anonymous"></script>
<!-- 중간 -->
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-8940400388075870"
     data-ad-slot="8794586137"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></div>

<p>이 편을 보기 전에 전 포스팅을 참고 하시면 이해가 더욱 되시리라 생각을 합니다.</p>
<p><a href="https://aboda.kr/entry/%EB%B6%80%EB%8F%99%EC%82%B0-%EB%A7%A4%EB%AC%BC-%EC%A0%95%EB%B3%B4-%EC%88%98%EC%A7%91%ED%95%98%EA%B8%B0-%EB%B6%80%EB%8F%99%EC%82%B0-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%84%A4%EC%9D%B4%EB%B2%84-%EB%B6%80%EB%8F%99%EC%82%B0-%ED%81%AC%EB%A1%A4%EB%A7%81-%EB%B0%8F-%EA%B0%80%EA%B3%B5-1" target="_blank" rel="noopener">2024.09.15 &#8211; [부동산/자동화 프로젝트] &#8211; 부동산 매물 정보 수집하기 &#8211; 부동산 데이터 네이버 부동산 크롤링 및 가공 #1</a></p>
<p><a href="https://aboda.kr/entry/%EB%B6%80%EB%8F%99%EC%82%B0-%EB%A7%A4%EB%AC%BC-%EC%A0%95%EB%B3%B4-%EC%88%98%EC%A7%91%ED%95%98%EA%B8%B0-%EB%B6%80%EB%8F%99%EC%82%B0-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%84%A4%EC%9D%B4%EB%B2%84-%EB%B6%80%EB%8F%99%EC%82%B0-%ED%81%AC%EB%A1%A4%EB%A7%81-%EB%B0%8F-%EA%B0%80%EA%B3%B5-2" target="_blank" rel="noopener">2024.09.15 &#8211; [부동산/자동화 프로젝트] &#8211; 부동산 매물 정보 수집하기 &#8211; 부동산 데이터 네이버 부동산 크롤링 및 가공 #2</a></p>
<p><a href="https://aboda.kr/entry/%EB%B6%80%EB%8F%99%EC%82%B0-%EB%A7%A4%EB%AC%BC-%EC%A0%95%EB%B3%B4-%EC%88%98%EC%A7%91%ED%95%98%EA%B8%B0-%EB%B6%80%EB%8F%99%EC%82%B0-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%84%A4%EC%9D%B4%EB%B2%84-%EB%B6%80%EB%8F%99%EC%82%B0-%ED%81%AC%EB%A1%A4%EB%A7%81-%EB%B0%8F-%EA%B0%80%EA%B3%B5-3" target="_blank" rel="noopener">2024.09.15 &#8211; [부동산/자동화 프로젝트] &#8211; 부동산 매물 정보 수집하기 &#8211; 부동산 데이터 네이버 부동산 크롤링 및 가공 #3</a></p>
<p><a href="https://aboda.kr/entry/%EA%B3%A0%EA%B8%89-%EB%B6%80%EB%8F%99%EC%82%B0-%EC%A0%95%EB%B3%B4-%ED%95%84%ED%84%B0-%EA%B3%A0%EB%8F%84%ED%99%94-%EB%84%A4%EC%9D%B4%EB%B2%84-%EB%A7%A4%EB%AC%BC-%EC%A0%95%EB%A6%AC%ED%95%98%EA%B8%B0" target="_blank" rel="noopener">2024.09.17 &#8211; [부동산/자동화 프로젝트] &#8211; [고급] 부동산 정보 필터 고도화 &#8211; 네이버 매물 정리하기</a></p>
<p><a href="https://aboda.kr/entry/%EA%B3%A0%EA%B8%89-%EB%B6%80%EB%8F%99%EC%82%B0-%EC%A0%95%EB%B3%B4-%ED%95%84%ED%84%B0-%EA%B3%A0%EB%8F%84%ED%99%94-%EB%84%A4%EC%9D%B4%EB%B2%84-%EB%A7%A4%EB%AC%BC-%EC%A0%95%EB%A6%AC%ED%95%98%EA%B8%B0-2" target="_blank" rel="noopener">2024.09.18 &#8211; [부동산/자동화 프로젝트] &#8211; [고급] 부동산 정보 필터 고도화 &#8211; 네이버 매물 정리하기 2</a></p>
<p>이제 우리가 할 것은 스트림릿에 코드를 올려서 코드를 실행하기만 하면 됩니다. 먼저 streamlit 스트림릿에 가입을 합니다.</p>
<p><a href="https://streamlit.io/" target="_blank" rel="noopener noreferrer noopener">https://streamlit.io/</a></p>
<figure id="og_1726667422533" contenteditable="false" data-ke-type="opengraph" data-ke-align="alignCenter" data-og-type="website" data-og-title="Streamlit • A faster way to build and share data apps" data-og-description="Streamlit is an open-source Python framework for data scientists and AI/ML engineers to deliver interactive data apps – in only a few lines of code." data-og-host="streamlit.io" data-og-source-url="https://streamlit.io/" data-og-url="https://streamlit.io/" data-og-image="https://scrap.kakaocdn.net/dn/o4UxG/hyW2Rekb3a/geKZPpVvbg35ryKVWsWRq0/img.jpg?width=1200&amp;height=630&amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/TNMNX/hyW20h1mM3/uXf4grFoSmlFKDHgmQKzk0/img.jpg?width=1200&amp;height=630&amp;face=0_0_1200_630">
<div class="og-image"></div>
<div class="og-text">
<p class="og-title">Streamlit • A faster way to build and share data apps</p>
<p class="og-desc">Streamlit is an open-source Python framework for data scientists and AI/ML engineers to deliver interactive data apps – in only a few lines of code.</p>
<p class="og-host">streamlit.io</p>
</div>
</figure>
<p>가입을 한 후 아래 코드를 넣어 줍니다. 저는 코드를 직접 넣었습니다.</p>
<pre id="code_1726667476308" class="bash hljs" contenteditable="false" data-ke-language="bash" data-ke-type="codeblock">import streamlit as st
import pandas as pd
from io import BytesIO
import requests
import json
from bs4 import BeautifulSoup

<span class="hljs-comment"># JSON 파일에서 법정동 코드 가져오기</span>
def get_dong_codes_for_city(city_name, sigungu_name=None, json_path=<span class="hljs-string">'district.json'</span>):
    try:
        with open(json_path, <span class="hljs-string">'r'</span>, encoding=<span class="hljs-string">'utf-8'</span>) as file:
            data = json.load(file)
    except FileNotFoundError:
        st.error(f<span class="hljs-string">"Error: The file at {json_path} was not found."</span>)
        <span class="hljs-built_in">return</span> None, None

    <span class="hljs-keyword">for</span> si_do <span class="hljs-keyword">in</span> data:
        <span class="hljs-keyword">if</span> si_do[<span class="hljs-string">'si_do_name'</span>] == city_name:
            <span class="hljs-keyword">if</span> sigungu_name and sigungu_name != <span class="hljs-string">'전체'</span>:
                <span class="hljs-keyword">for</span> sigungu <span class="hljs-keyword">in</span> si_do[<span class="hljs-string">'sigungu'</span>]:
                    <span class="hljs-keyword">if</span> sigungu[<span class="hljs-string">'sigungu_name'</span>] == sigungu_name:
                        <span class="hljs-built_in">return</span> [sigungu[<span class="hljs-string">'sigungu_code'</span>]], [
                            {<span class="hljs-string">'code'</span>: dong[<span class="hljs-string">'code'</span>], <span class="hljs-string">'name'</span>: dong[<span class="hljs-string">'name'</span>]} <span class="hljs-keyword">for</span> dong <span class="hljs-keyword">in</span> sigungu[<span class="hljs-string">'eup_myeon_dong'</span>]
                        ]
            <span class="hljs-keyword">else</span>:
                sigungu_codes = [sigungu[<span class="hljs-string">'sigungu_code'</span>] <span class="hljs-keyword">for</span> sigungu <span class="hljs-keyword">in</span> si_do[<span class="hljs-string">'sigungu'</span>]]
                dong_codes = [
                    {<span class="hljs-string">'code'</span>: dong[<span class="hljs-string">'code'</span>], <span class="hljs-string">'name'</span>: dong[<span class="hljs-string">'name'</span>]}
                    <span class="hljs-keyword">for</span> sigungu <span class="hljs-keyword">in</span> si_do[<span class="hljs-string">'sigungu'</span>]
                    <span class="hljs-keyword">for</span> dong <span class="hljs-keyword">in</span> sigungu[<span class="hljs-string">'eup_myeon_dong'</span>]
                ]
                <span class="hljs-built_in">return</span> sigungu_codes, dong_codes
    <span class="hljs-built_in">return</span> None, None

<span class="hljs-comment"># 아파트 코드 리스트 가져오기</span>
def get_apt_list(dong_code):
    down_url = f<span class="hljs-string">'https://new.land.naver.com/api/regions/complexes?cortarNo={dong_code}&amp;realEstateType=APT&amp;order='</span>
    header = {
        <span class="hljs-string">"Accept-Encoding"</span>: <span class="hljs-string">"gzip"</span>,
        <span class="hljs-string">"Host"</span>: <span class="hljs-string">"new.land.naver.com"</span>,
        <span class="hljs-string">"Referer"</span>: <span class="hljs-string">"https://new.land.naver.com/complexes/102378"</span>,
        <span class="hljs-string">"Sec-Fetch-Dest"</span>: <span class="hljs-string">"empty"</span>,
        <span class="hljs-string">"Sec-Fetch-Mode"</span>: <span class="hljs-string">"cors"</span>,
        <span class="hljs-string">"Sec-Fetch-Site"</span>: <span class="hljs-string">"same-origin"</span>,
        <span class="hljs-string">"User-Agent"</span>: <span class="hljs-string">"Mozilla/5.0"</span>
    }

    try:
        r = requests.get(down_url, headers=header)
        r.encoding = <span class="hljs-string">"utf-8-sig"</span>
        data = r.json()

        <span class="hljs-keyword">if</span> <span class="hljs-string">'complexList'</span> <span class="hljs-keyword">in</span> data and isinstance(data[<span class="hljs-string">'complexList'</span>], list):
            df = pd.DataFrame(data[<span class="hljs-string">'complexList'</span>])
            required_columns = [<span class="hljs-string">'complexNo'</span>, <span class="hljs-string">'complexName'</span>, <span class="hljs-string">'buildYear'</span>, <span class="hljs-string">'totalHouseholdCount'</span>, <span class="hljs-string">'areaSize'</span>, <span class="hljs-string">'price'</span>, <span class="hljs-string">'address'</span>, <span class="hljs-string">'floor'</span>]

            <span class="hljs-keyword">for</span> col <span class="hljs-keyword">in</span> required_columns:
                <span class="hljs-keyword">if</span> col not <span class="hljs-keyword">in</span> df.columns:
                    df[col] = None

            <span class="hljs-built_in">return</span> df[required_columns]
        <span class="hljs-keyword">else</span>:
            st.warning(f<span class="hljs-string">"No data found for {dong_code}."</span>)
            <span class="hljs-built_in">return</span> pd.DataFrame(columns=required_columns)

    except Exception as e:
        st.error(f<span class="hljs-string">"Error fetching data for {dong_code}: {e}"</span>)
        <span class="hljs-built_in">return</span> pd.DataFrame(columns=required_columns)

<span class="hljs-comment"># 아파트 코드로 상세 정보 가져오기</span>
def get_apt_details(apt_code):
    details_url = f<span class="hljs-string">'https://fin.land.naver.com/complexes/{apt_code}?tab=complex-info'</span>
    article_url = f<span class="hljs-string">'https://fin.land.naver.com/complexes/{apt_code}?tab=article&amp;tradeTypes=A1'</span>
    
    header = {
        <span class="hljs-string">"Accept-Encoding"</span>: <span class="hljs-string">"gzip"</span>,
        <span class="hljs-string">"Host"</span>: <span class="hljs-string">"fin.land.naver.com"</span>,
        <span class="hljs-string">"Referer"</span>: <span class="hljs-string">"https://fin.land.naver.com/"</span>,
        <span class="hljs-string">"Sec-Fetch-Dest"</span>: <span class="hljs-string">"empty"</span>,
        <span class="hljs-string">"Sec-Fetch-Mode"</span>: <span class="hljs-string">"cors"</span>,
        <span class="hljs-string">"Sec-Fetch-Site"</span>: <span class="hljs-string">"same-origin"</span>,
        <span class="hljs-string">"User-Agent"</span>: <span class="hljs-string">"Mozilla/5.0"</span>
    }
    
    try:
        <span class="hljs-comment"># 기본 정보 가져오기</span>
        r_details = requests.get(details_url, headers=header)
        r_details.encoding = <span class="hljs-string">"utf-8-sig"</span>
        soup_details = BeautifulSoup(r_details.content, <span class="hljs-string">'html.parser'</span>)
        
        apt_name_tag = soup_details.find(<span class="hljs-string">'span'</span>, class_=<span class="hljs-string">'ComplexSummary_name__vX3IN'</span>)
        apt_name = apt_name_tag.text.strip() <span class="hljs-keyword">if</span> apt_name_tag <span class="hljs-keyword">else</span> <span class="hljs-string">'Unknown'</span>
        detail_dict = {<span class="hljs-string">'complexNo'</span>: apt_code, <span class="hljs-string">'complexName'</span>: apt_name}
        
        detail_items = soup_details.find_all(<span class="hljs-string">'li'</span>, class_=<span class="hljs-string">'DataList_item__T1hMR'</span>)
        <span class="hljs-keyword">for</span> item <span class="hljs-keyword">in</span> detail_items:
            term = item.find(<span class="hljs-string">'div'</span>, class_=<span class="hljs-string">'DataList_term__Tks7l'</span>).text.strip()
            definition = item.find(<span class="hljs-string">'div'</span>, class_=<span class="hljs-string">'DataList_definition__d9KY1'</span>).text.strip()
            <span class="hljs-keyword">if</span> term <span class="hljs-keyword">in</span> [<span class="hljs-string">'공급면적'</span>, <span class="hljs-string">'전용면적'</span>, <span class="hljs-string">'해당면적 세대수'</span>, <span class="hljs-string">'현관구조'</span>, <span class="hljs-string">'방/욕실'</span>, <span class="hljs-string">'위치'</span>, <span class="hljs-string">'사용승인일'</span>, <span class="hljs-string">'세대수'</span>, <span class="hljs-string">'난방'</span>, <span class="hljs-string">'주차'</span>, <span class="hljs-string">'전기차 충전시설'</span>, <span class="hljs-string">'용적률/건폐율'</span>, <span class="hljs-string">'관리사무소 전화'</span>, <span class="hljs-string">'건설사'</span>]:
                detail_dict[term] = definition

        <span class="hljs-comment"># 매물 정보 가져오기</span>
        r_article = requests.get(article_url, headers=header)
        r_article.encoding = <span class="hljs-string">"utf-8-sig"</span>
        soup_article = BeautifulSoup(r_article.content, <span class="hljs-string">'html.parser'</span>)
        
        listings = []
        <span class="hljs-keyword">for</span> item <span class="hljs-keyword">in</span> soup_article.find_all(<span class="hljs-string">'li'</span>, class_=<span class="hljs-string">'ComplexArticleItem_item__L5o7k'</span>):
            listing = {}
            name_tag = item.find(<span class="hljs-string">'span'</span>, class_=<span class="hljs-string">'ComplexArticleItem_name__4h3AA'</span>)
            listing[<span class="hljs-string">'매물명'</span>] = name_tag.text.strip() <span class="hljs-keyword">if</span> name_tag <span class="hljs-keyword">else</span> <span class="hljs-string">'Unknown'</span>
            price_tag = item.find(<span class="hljs-string">'span'</span>, class_=<span class="hljs-string">'ComplexArticleItem_price__DFeIb'</span>)
            listing[<span class="hljs-string">'매매가'</span>] = price_tag.text.strip() <span class="hljs-keyword">if</span> price_tag <span class="hljs-keyword">else</span> <span class="hljs-string">'Unknown'</span>
            
            summary_items = item.find_all(<span class="hljs-string">'li'</span>, class_=<span class="hljs-string">'ComplexArticleItem_item-summary__oHSwl'</span>)
            <span class="hljs-keyword">if</span> len(summary_items) &gt;= 4:
                listing[<span class="hljs-string">'면적'</span>] = summary_items[1].text.strip() <span class="hljs-keyword">if</span> len(summary_items) &gt; 1 <span class="hljs-keyword">else</span> <span class="hljs-string">'Unknown'</span>
                listing[<span class="hljs-string">'층수'</span>] = summary_items[2].text.strip() <span class="hljs-keyword">if</span> len(summary_items) &gt; 2 <span class="hljs-keyword">else</span> <span class="hljs-string">'Unknown'</span>
                listing[<span class="hljs-string">'방향'</span>] = summary_items[3].text.strip() <span class="hljs-keyword">if</span> len(summary_items) &gt; 3 <span class="hljs-keyword">else</span> <span class="hljs-string">'Unknown'</span>
            
            image_tag = item.find(<span class="hljs-string">'img'</span>)
            listing[<span class="hljs-string">'이미지'</span>] = image_tag[<span class="hljs-string">'src'</span>] <span class="hljs-keyword">if</span> image_tag <span class="hljs-keyword">else</span> <span class="hljs-string">'No image'</span>
            comment_tag = item.find(<span class="hljs-string">'p'</span>, class_=<span class="hljs-string">'ComplexArticleItem_comment__zN_dK'</span>)
            listing[<span class="hljs-string">'코멘트'</span>] = comment_tag.text.strip() <span class="hljs-keyword">if</span> comment_tag <span class="hljs-keyword">else</span> <span class="hljs-string">'No comment'</span>
            
            combined_listing = {**detail_dict, **listing}
            listings.append(combined_listing)
        
        <span class="hljs-built_in">return</span> listings
    
    except Exception as e:
        st.error(f<span class="hljs-string">"Error fetching details for {apt_code}: {e}"</span>)
        <span class="hljs-built_in">return</span> []

<span class="hljs-comment"># 아파트 정보를 수집하는 함수</span>
def collect_apt_info_for_city(city_name, sigungu_name, dong_name=None, json_path=<span class="hljs-string">'district.json'</span>):
    sigungu_codes, dong_list = get_dong_codes_for_city(city_name, sigungu_name, json_path)

    <span class="hljs-keyword">if</span> dong_list is None:
        st.error(f<span class="hljs-string">"Error: {city_name} not found in JSON."</span>)
        <span class="hljs-built_in">return</span> None

    all_apt_data = []
    dong_code_name_map = {dong[<span class="hljs-string">'code'</span>]: dong[<span class="hljs-string">'name'</span>] <span class="hljs-keyword">for</span> dong <span class="hljs-keyword">in</span> dong_list}
    
    <span class="hljs-comment"># 수집 중 표시를 위한 placeholder</span>
    placeholder = st.empty()

    <span class="hljs-keyword">if</span> dong_name and dong_name != <span class="hljs-string">'전체'</span>:
        dong_code_name_map = {k: v <span class="hljs-keyword">for</span> k, v <span class="hljs-keyword">in</span> dong_code_name_map.items() <span class="hljs-keyword">if</span> v == dong_name}

    <span class="hljs-keyword">for</span> dong_code, dong_name <span class="hljs-keyword">in</span> dong_code_name_map.items():
        placeholder.write(f<span class="hljs-string">"{dong_name} ({dong_code}) - 수집중입니다."</span>)
        apt_codes = get_apt_list(dong_code)

        <span class="hljs-keyword">if</span> not apt_codes.empty:
            <span class="hljs-keyword">for</span> _, apt_info <span class="hljs-keyword">in</span> apt_codes.iterrows():
                apt_code = apt_info[<span class="hljs-string">'complexNo'</span>]
                apt_name = apt_info[<span class="hljs-string">'complexName'</span>]
                placeholder.write(f<span class="hljs-string">"{apt_name} ({apt_code}) - 수집중입니다."</span>)
                listings = get_apt_details(apt_code)
                
                <span class="hljs-keyword">if</span> listings:
                    <span class="hljs-keyword">for</span> listing <span class="hljs-keyword">in</span> listings:
                        listing[<span class="hljs-string">'dong_code'</span>] = dong_code
                        listing[<span class="hljs-string">'dong_name'</span>] = dong_name
                        all_apt_data.append(listing)
        <span class="hljs-keyword">else</span>:
            st.warning(f<span class="hljs-string">"No apartment codes found for {dong_code}"</span>)

    <span class="hljs-comment"># 수집이 완료된 후, 수집 중 메시지를 지우기</span>
    placeholder.empty()

    <span class="hljs-keyword">if</span> all_apt_data:
        final_df = pd.DataFrame(all_apt_data)
        final_df[<span class="hljs-string">'si_do_name'</span>] = city_name
        final_df[<span class="hljs-string">'sigungu_name'</span>] = sigungu_name
        final_df[<span class="hljs-string">'dong_name'</span>] = dong_name <span class="hljs-keyword">if</span> dong_name <span class="hljs-keyword">else</span> <span class="hljs-string">'전체'</span>
        
        <span class="hljs-comment"># 데이터프레임 결과 출력</span>
        st.write(<span class="hljs-string">"아파트 정보 수집 완료:"</span>)
        st.dataframe(final_df)

        <span class="hljs-comment"># 엑셀 파일로 저장</span>
        output = BytesIO()
        with pd.ExcelWriter(output, engine=<span class="hljs-string">'xlsxwriter'</span>) as writer:
            final_df.to_excel(writer, index=False)
        output.seek(0)

        <span class="hljs-comment"># 엑셀 파일 다운로드 버튼</span>
        st.download_button(
            label=<span class="hljs-string">"Download Excel"</span>,
            data=output,
            file_name=f<span class="hljs-string">"{city_name}_{sigungu_name}_apartments.xlsx"</span>,
            mime=<span class="hljs-string">"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"</span>
        )

        <span class="hljs-comment"># CSV 파일 다운로드 버튼</span>
        csv = final_df.to_csv(index=False).encode(<span class="hljs-string">'utf-8'</span>)
        st.download_button(
            label=<span class="hljs-string">"Download CSV"</span>,
            data=csv,
            file_name=f<span class="hljs-string">"{city_name}_{sigungu_name}_apartments.csv"</span>,
            mime=<span class="hljs-string">"text/csv"</span>
        )
    <span class="hljs-keyword">else</span>:
        st.write(<span class="hljs-string">"No data to save."</span>)

<span class="hljs-comment"># Streamlit 앱 실행</span>
st.title(<span class="hljs-string">"아파트 정보 수집기"</span>)

<span class="hljs-comment"># 사용자 입력 받기</span>
city_name = st.text_input(<span class="hljs-string">"시/도 이름 입력"</span>, <span class="hljs-string">"서울특별시"</span>)
sigungu_name = st.text_input(<span class="hljs-string">"구/군/구 이름 입력"</span>, <span class="hljs-string">"강남구"</span>)
dong_name = st.text_input(<span class="hljs-string">"동 이름 입력 (선택사항)"</span>, <span class="hljs-string">"전체"</span>)

<span class="hljs-keyword">if</span> st.button(<span class="hljs-string">"정보 수집 시작"</span>):
    collect_apt_info_for_city(city_name, sigungu_name, dong_name)</pre>
<p>코드를 넣고 스트림릿에서 실행을 해봅니다.</p>
<figure data-ke-type="image" data-ke-mobilestyle="widthOrigin" data-ke-style="alignCenter"><img decoding="async" src="https://blog.kakaocdn.net/dn/IvHwB/btsJDIoGrsF/OsGisWkNIERb9zF4NeL3ak/img.png" data-is-animation="false" data-origin-width="2026" data-origin-height="1126" data-filename="스크린샷 2024-09-18 오후 10.52.00.png" loading="lazy" alt="img" title="[심화] streamlit 부동산 호가 수집 정보 서비스 하기 14"><figcaption>[심화] streamlit 에 부동산 호가 수집 정보 서비스 하기</figcaption></figure>
<p>매우 정보가 잘 나오고 있네요. 이제 아파트 정보를 모두 수집하면 결과가 어떻게 나올까요?</p>
<figure data-ke-type="image" data-ke-mobilestyle="widthOrigin" data-ke-style="alignCenter"><img decoding="async" src="https://blog.kakaocdn.net/dn/oNjcB/btsJDYq0I2n/zpRfOMTYgUyj8kgvjJMkIk/img.png" data-is-animation="false" data-origin-width="1778" data-origin-height="1278" data-filename="스크린샷 2024-09-18 오후 10.53.02.png" loading="lazy" alt="img" title="[심화] streamlit 부동산 호가 수집 정보 서비스 하기 15"></figure>
<p>수집이 완료되면 이렇게 표로도 보여주고 엑셀 또는 CSV 파일 형태로 다운도 받을 수 있도록 코드가 잘 완료 되었습니다.</p>
<p><a href="https://2days.kr/14/09/12/56525/coding/data/">파이썬 부동산 매매가 조회 프로그램 만들기 3편 (서울아파트 컬럼 정리)</a></p>
<p><a href="https://2days.kr/14/09/14/56529/coding/data/">파이썬 부동산 매매가 조회 프로그램 만들기 4편 (전국 데이터)</a></p>
<!-- CONTENT END 6 -->
]]></content:encoded>
					
		
		
		<media:content url="https://2days.kr/wp-content/uploads/2024/09/심화-streamlit-에-부동산-호가-수집-정보-서비스-하기.png" medium="image"></media:content>
            	</item>
		<item>
		<title>[고급] 부동산 정보 필터 고도화 &#8211; 네이버 매물 정리하기 2</title>
		<link>https://2days.kr/18/09/22/56553/it/program/</link>
		
		<dc:creator><![CDATA[urjent]]></dc:creator>
		<pubDate>Wed, 18 Sep 2024 13:35:01 +0000</pubDate>
				<category><![CDATA[program]]></category>
		<category><![CDATA[네이버 부동산]]></category>
		<category><![CDATA[네이버 부동산 크롤링]]></category>
		<category><![CDATA[네이버 크롤링]]></category>
		<category><![CDATA[부동산]]></category>
		<category><![CDATA[부동산 정보 크롤링]]></category>
		<category><![CDATA[파이썬]]></category>
		<category><![CDATA[파이썬 부동산]]></category>
		<category><![CDATA[파이썬 크롤링]]></category>
		<guid isPermaLink="false">https://2days.kr/?p=56553</guid>

					<description><![CDATA[[고급] 부동산 정보 필터 고도화 &#8211; 네이버 매물 정리하기 편에 이어서 추가적으로 결과 값을 조금 더 디테일하게 정리해보려고 합니다. https://fin.land.naver.com/complexes/106861?tab=complex-info 여기에서 보면 우리 데이터와 일부 맞지 않는 부분을 확인 할 수 있습니다. 바로 공급면적, 전용면적이 실제 매물에 나와 있는 면적과 다르다는 것입니다. [고급] 부동산 정보 필터 고도화 &#8211; 네이버 매물 정리하기 2 그 이유는 바로 네이버 [&#8230;]]]></description>
										<content:encoded><![CDATA[<p data-ke-size="size16">[고급] 부동산 정보 필터 고도화 &#8211; 네이버 매물 정리하기 편에 이어서 추가적으로 결과 값을 조금 더 디테일하게 정리해보려고 합니다. <a href="https://fin.land.naver.com/complexes/106861?tab=complex-info" target="_blank" rel="noopener noreferrer noopener">https://fin.land.naver.com/complexes/106861?tab=complex-info</a></p>
<p data-ke-size="size16">여기에서 보면 우리 데이터와 일부 맞지 않는 부분을 확인 할 수 있습니다. 바로 공급면적, 전용면적이 실제 매물에 나와 있는 면적과 다르다는 것입니다.</p>
<figure data-ke-type="image" data-ke-style="alignCenter" data-ke-mobilestyle="widthOrigin"><figure style="width: 2544px" class="wp-caption alignnone"><img decoding="async" src="https://blog.kakaocdn.net/dn/kNe8i/btsJFrFyRi2/gcx17BYOkKkh0eWUVLKSK0/img.png" alt="[고급] 부동산 정보 필터 고도화 - 네이버 매물 정리하기 2" width="2544" height="852" data-origin-width="2544" data-origin-height="852" data-filename="스크린샷 2024-09-18 오전 9.23.47.png" data-is-animation="false" loading="lazy" data-origin- title="[고급] 부동산 정보 필터 고도화 - 네이버 매물 정리하기 2 17"><figcaption class="wp-caption-text">[고급] 부동산 정보 필터 고도화 &#8211; 네이버 매물 정리하기 2</figcaption></figure><figcaption>[고급] 부동산 정보 필터 고도화 &#8211; 네이버 매물 정리하기 2</figcaption></figure><div class='code-block code-block-2' style='margin: 8px auto; text-align: center; display: block; clear: both;'>
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8940400388075870"
     crossorigin="anonymous"></script>
<!-- 중간 -->
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-8940400388075870"
     data-ad-slot="8794586137"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></div>

<p data-ke-size="size16">그 이유는 바로 네이버 면적 정보 부분에서 면적 정보를 각각 클릭해야만 해당 면적에 대한 정보를 가져오게 되는데, 우리가 크롤링했던 공급면적, 전용면적 등의 정보는 가장 처음 나오는 면적에 대한 정보를 끌어 왔기 때문이죠, 따라서 면적이라는 부분의 데이터를 기준으로 맞춰서 해당 공급면적을 찾아내고, 그에 맞는 전용면적 ~ 방/욕실에 대한 정보를 수정해야겠습니다.</p>
<figure data-ke-type="image" data-ke-style="alignCenter" data-ke-mobilestyle="widthOrigin"><img decoding="async" src="https://blog.kakaocdn.net/dn/b6p1RV/btsJDviA0O1/UmxBmwVcZouZlXZ7GdI1zk/img.png" data-origin-width="1488" data-origin-height="1158" data-filename="스크린샷 2024-09-18 오전 9.25.38.png" data-is-animation="false" loading="lazy" alt="img" title="[고급] 부동산 정보 필터 고도화 - 네이버 매물 정리하기 2 18"><figcaption>[고급] 부동산 정보 필터 고도화 &#8211; 네이버 매물 정리하기 2</figcaption></figure>
<h3 data-ke-size="size23"><b>[고급] 부동산 정보 필터 고도화 &#8211; 네이버 매물 정리하기 2</b></h3>
<figure data-ke-type="image" data-ke-style="alignCenter" data-ke-mobilestyle="widthOrigin"><figure style="width: 2560px" class="wp-caption alignnone"><img decoding="async" src="https://blog.kakaocdn.net/dn/sr0e1/btsJDwuPIL5/DERzjgIQ1ykgt3RksCoNp1/img.png" alt="[고급] 부동산 정보 필터 고도화 - 네이버 매물 정리하기 2" width="2560" height="2560" data-origin-width="2560" data-origin-height="2560" data-filename="[고급] 부동산 정보 필터 고도화 - 네이버 매물 정리하기 2.png" data-is-animation="false" loading="lazy" data-origin- title="[고급] 부동산 정보 필터 고도화 - 네이버 매물 정리하기 2 19"><figcaption class="wp-caption-text">[고급] 부동산 정보 필터 고도화 &#8211; 네이버 매물 정리하기 2</figcaption></figure><figcaption>[고급] 부동산 정보 필터 고도화 &#8211; 네이버 매물 정리하기 2</figcaption></figure>
<p data-ke-size="size16">오늘 글은 시리즈로 구성된 기본편을 기본으로 하고 있습니다. 아직 기본편을 못 보신 분들이라면 아래 글을 한번 읽어 주세요!</p>
<p data-ke-size="size16"><a href="https://aboda.kr/entry/%EB%B6%80%EB%8F%99%EC%82%B0-%EB%A7%A4%EB%AC%BC-%EC%A0%95%EB%B3%B4-%EC%88%98%EC%A7%91%ED%95%98%EA%B8%B0-%EB%B6%80%EB%8F%99%EC%82%B0-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%84%A4%EC%9D%B4%EB%B2%84-%EB%B6%80%EB%8F%99%EC%82%B0-%ED%81%AC%EB%A1%A4%EB%A7%81-%EB%B0%8F-%EA%B0%80%EA%B3%B5-1" target="_blank" rel="noopener">2024.09.15 &#8211; [부동산/자동화 프로젝트] &#8211; 부동산 매물 정보 수집하기 &#8211; 부동산 데이터 네이버 부동산 크롤링 및 가공 #1</a></p>
<p data-ke-size="size16"><a href="https://aboda.kr/entry/%EB%B6%80%EB%8F%99%EC%82%B0-%EB%A7%A4%EB%AC%BC-%EC%A0%95%EB%B3%B4-%EC%88%98%EC%A7%91%ED%95%98%EA%B8%B0-%EB%B6%80%EB%8F%99%EC%82%B0-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%84%A4%EC%9D%B4%EB%B2%84-%EB%B6%80%EB%8F%99%EC%82%B0-%ED%81%AC%EB%A1%A4%EB%A7%81-%EB%B0%8F-%EA%B0%80%EA%B3%B5-2" target="_blank" rel="noopener">2024.09.15 &#8211; [부동산/자동화 프로젝트] &#8211; 부동산 매물 정보 수집하기 &#8211; 부동산 데이터 네이버 부동산 크롤링 및 가공 #2</a></p>
<p data-ke-size="size16"><a href="https://aboda.kr/entry/%EB%B6%80%EB%8F%99%EC%82%B0-%EB%A7%A4%EB%AC%BC-%EC%A0%95%EB%B3%B4-%EC%88%98%EC%A7%91%ED%95%98%EA%B8%B0-%EB%B6%80%EB%8F%99%EC%82%B0-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%84%A4%EC%9D%B4%EB%B2%84-%EB%B6%80%EB%8F%99%EC%82%B0-%ED%81%AC%EB%A1%A4%EB%A7%81-%EB%B0%8F-%EA%B0%80%EA%B3%B5-3" target="_blank" rel="noopener">2024.09.15 &#8211; [부동산/자동화 프로젝트] &#8211; 부동산 매물 정보 수집하기 &#8211; 부동산 데이터 네이버 부동산 크롤링 및 가공 #3</a></p>
<p data-ke-size="size16"><a href="https://aboda.kr/entry/%EA%B3%A0%EA%B8%89-%EB%B6%80%EB%8F%99%EC%82%B0-%EC%A0%95%EB%B3%B4-%ED%95%84%ED%84%B0-%EA%B3%A0%EB%8F%84%ED%99%94-%EB%84%A4%EC%9D%B4%EB%B2%84-%EB%A7%A4%EB%AC%BC-%EC%A0%95%EB%A6%AC%ED%95%98%EA%B8%B0" target="_blank" rel="noopener">2024.09.17 &#8211; [부동산/자동화 프로젝트] &#8211; [고급] 부동산 정보 필터 고도화 &#8211; 네이버 매물 정리하기</a></p>
<p data-ke-size="size16">이 부분은 동적 네트워크를 사용해야 해서, 현재 데이터에서만 정리해볼까 합니다. 현재 정리되어 있는 전체코드는 아래와 같습니다.</p>

<pre id="code_1726623550100" class="bash hljs" contenteditable="false" data-ke-language="bash" data-ke-type="codeblock">from google.colab import drive
import requests
import json
import pandas as pd
from datetime import datetime
from bs4 import BeautifulSoup

<span class="hljs-comment"># Google Drive 마운트</span>
drive.mount(<span class="hljs-string">'/content/drive'</span>)

<span class="hljs-comment"># 법정동 코드를 가져오는 함수</span>
def get_dong_codes_for_city(city_name, sigungu_name=None, json_path=<span class="hljs-string">'/content/drive/MyDrive/district.json'</span>):
    try:
        with open(json_path, <span class="hljs-string">'r'</span>, encoding=<span class="hljs-string">'utf-8'</span>) as file:
            data = json.load(file)
    except FileNotFoundError:
        <span class="hljs-built_in">print</span>(f<span class="hljs-string">"Error: The file at {json_path} was not found."</span>)
        <span class="hljs-built_in">return</span> None, None

    <span class="hljs-keyword">for</span> si_do <span class="hljs-keyword">in</span> data:
        <span class="hljs-keyword">if</span> si_do[<span class="hljs-string">'si_do_name'</span>] == city_name:
            <span class="hljs-keyword">if</span> sigungu_name and sigungu_name != <span class="hljs-string">'전체'</span>:
                <span class="hljs-keyword">for</span> sigungu <span class="hljs-keyword">in</span> si_do[<span class="hljs-string">'sigungu'</span>]:
                    <span class="hljs-keyword">if</span> sigungu[<span class="hljs-string">'sigungu_name'</span>] == sigungu_name:
                        <span class="hljs-built_in">return</span> [sigungu[<span class="hljs-string">'sigungu_code'</span>]], [
                            {<span class="hljs-string">'code'</span>: dong[<span class="hljs-string">'code'</span>], <span class="hljs-string">'name'</span>: dong[<span class="hljs-string">'name'</span>]} <span class="hljs-keyword">for</span> dong <span class="hljs-keyword">in</span> sigungu[<span class="hljs-string">'eup_myeon_dong'</span>]
                        ]
            <span class="hljs-keyword">else</span>:  <span class="hljs-comment"># 시군구 '전체'</span>
                sigungu_codes = [sigungu[<span class="hljs-string">'sigungu_code'</span>] <span class="hljs-keyword">for</span> sigungu <span class="hljs-keyword">in</span> si_do[<span class="hljs-string">'sigungu'</span>]]
                dong_codes = [
                    {<span class="hljs-string">'code'</span>: dong[<span class="hljs-string">'code'</span>], <span class="hljs-string">'name'</span>: dong[<span class="hljs-string">'name'</span>]}
                    <span class="hljs-keyword">for</span> sigungu <span class="hljs-keyword">in</span> si_do[<span class="hljs-string">'sigungu'</span>]
                    <span class="hljs-keyword">for</span> dong <span class="hljs-keyword">in</span> sigungu[<span class="hljs-string">'eup_myeon_dong'</span>]
                ]
                <span class="hljs-built_in">return</span> sigungu_codes, dong_codes
    <span class="hljs-built_in">return</span> None, None

<span class="hljs-comment"># 아파트 코드 리스트 가져오기</span>
def get_apt_list(dong_code):
    down_url = f<span class="hljs-string">'https://new.land.naver.com/api/regions/complexes?cortarNo={dong_code}&amp;realEstateType=APT&amp;order='</span>
    header = {
        <span class="hljs-string">"Accept-Encoding"</span>: <span class="hljs-string">"gzip"</span>,
        <span class="hljs-string">"Host"</span>: <span class="hljs-string">"new.land.naver.com"</span>,
        <span class="hljs-string">"Referer"</span>: <span class="hljs-string">"https://new.land.naver.com/complexes/102378"</span>,
        <span class="hljs-string">"Sec-Fetch-Dest"</span>: <span class="hljs-string">"empty"</span>,
        <span class="hljs-string">"Sec-Fetch-Mode"</span>: <span class="hljs-string">"cors"</span>,
        <span class="hljs-string">"Sec-Fetch-Site"</span>: <span class="hljs-string">"same-origin"</span>,
        <span class="hljs-string">"User-Agent"</span>: <span class="hljs-string">"Mozilla/5.0"</span>
    }

    try:
        r = requests.get(down_url, headers=header)
        r.encoding = <span class="hljs-string">"utf-8-sig"</span>
        data = r.json()

        <span class="hljs-keyword">if</span> <span class="hljs-string">'complexList'</span> <span class="hljs-keyword">in</span> data and isinstance(data[<span class="hljs-string">'complexList'</span>], list):
            df = pd.DataFrame(data[<span class="hljs-string">'complexList'</span>])
            required_columns = [<span class="hljs-string">'complexNo'</span>, <span class="hljs-string">'complexName'</span>, <span class="hljs-string">'buildYear'</span>, <span class="hljs-string">'totalHouseholdCount'</span>, <span class="hljs-string">'areaSize'</span>, <span class="hljs-string">'price'</span>, <span class="hljs-string">'address'</span>, <span class="hljs-string">'floor'</span>]

            <span class="hljs-keyword">for</span> col <span class="hljs-keyword">in</span> required_columns:
                <span class="hljs-keyword">if</span> col not <span class="hljs-keyword">in</span> df.columns:
                    df[col] = None

            <span class="hljs-built_in">return</span> df[required_columns]
        <span class="hljs-keyword">else</span>:
            <span class="hljs-built_in">print</span>(f<span class="hljs-string">"No data found for {dong_code}."</span>)
            <span class="hljs-built_in">return</span> pd.DataFrame(columns=required_columns)

    except Exception as e:
        <span class="hljs-built_in">print</span>(f<span class="hljs-string">"Error fetching data for {dong_code}: {e}"</span>)
        <span class="hljs-built_in">return</span> pd.DataFrame(columns=required_columns)

<span class="hljs-comment"># 아파트 코드로 상세 정보를 가져오는 함수 (매매 정보 추가)</span>
def get_apt_details(apt_code):
    details_url = f<span class="hljs-string">'https://fin.land.naver.com/complexes/{apt_code}?tab=complex-info'</span>
    article_url = f<span class="hljs-string">'https://fin.land.naver.com/complexes/{apt_code}?tab=article&amp;tradeTypes=A1'</span>
    
    header = {
        <span class="hljs-string">"Accept-Encoding"</span>: <span class="hljs-string">"gzip"</span>,
        <span class="hljs-string">"Host"</span>: <span class="hljs-string">"fin.land.naver.com"</span>,
        <span class="hljs-string">"Referer"</span>: <span class="hljs-string">"https://fin.land.naver.com/"</span>,
        <span class="hljs-string">"Sec-Fetch-Dest"</span>: <span class="hljs-string">"empty"</span>,
        <span class="hljs-string">"Sec-Fetch-Mode"</span>: <span class="hljs-string">"cors"</span>,
        <span class="hljs-string">"Sec-Fetch-Site"</span>: <span class="hljs-string">"same-origin"</span>,
        <span class="hljs-string">"User-Agent"</span>: <span class="hljs-string">"Mozilla/5.0"</span>
    }
    
    try:
        <span class="hljs-comment"># 기본 정보 가져오기</span>
        r_details = requests.get(details_url, headers=header)
        r_details.encoding = <span class="hljs-string">"utf-8-sig"</span>
        soup_details = BeautifulSoup(r_details.content, <span class="hljs-string">'html.parser'</span>)
        
        <span class="hljs-comment"># 아파트 이름 추출</span>
        apt_name_tag = soup_details.find(<span class="hljs-string">'span'</span>, class_=<span class="hljs-string">'ComplexSummary_name__vX3IN'</span>)
        apt_name = apt_name_tag.text.strip() <span class="hljs-keyword">if</span> apt_name_tag <span class="hljs-keyword">else</span> <span class="hljs-string">'Unknown'</span>

        <span class="hljs-comment"># 기본 정보 딕셔너리</span>
        detail_dict = {<span class="hljs-string">'complexNo'</span>: apt_code, <span class="hljs-string">'complexName'</span>: apt_name}
        
        <span class="hljs-comment"># 기본 상세 정보 추출 (공급면적, 전용면적, 방/욕실 등)</span>
        detail_items = soup_details.find_all(<span class="hljs-string">'li'</span>, class_=<span class="hljs-string">'DataList_item__T1hMR'</span>)
        <span class="hljs-keyword">for</span> item <span class="hljs-keyword">in</span> detail_items:
            term = item.find(<span class="hljs-string">'div'</span>, class_=<span class="hljs-string">'DataList_term__Tks7l'</span>).text.strip()
            definition = item.find(<span class="hljs-string">'div'</span>, class_=<span class="hljs-string">'DataList_definition__d9KY1'</span>).text.strip()
            <span class="hljs-keyword">if</span> term <span class="hljs-keyword">in</span> [<span class="hljs-string">'공급면적'</span>, <span class="hljs-string">'전용면적'</span>, <span class="hljs-string">'해당면적 세대수'</span>, <span class="hljs-string">'현관구조'</span>, <span class="hljs-string">'방/욕실'</span>, <span class="hljs-string">'위치'</span>, <span class="hljs-string">'사용승인일'</span>, <span class="hljs-string">'세대수'</span>, <span class="hljs-string">'난방'</span>, <span class="hljs-string">'주차'</span>, <span class="hljs-string">'전기차 충전시설'</span>, <span class="hljs-string">'용적률/건폐율'</span>, <span class="hljs-string">'관리사무소 전화'</span>, <span class="hljs-string">'건설사'</span>]:
                detail_dict[term] = definition
        
        <span class="hljs-comment"># 매물 정보 가져오기</span>
        r_article = requests.get(article_url, headers=header)
        r_article.encoding = <span class="hljs-string">"utf-8-sig"</span>
        soup_article = BeautifulSoup(r_article.content, <span class="hljs-string">'html.parser'</span>)
        
        <span class="hljs-comment"># 매물 리스트</span>
        listings = []
        <span class="hljs-keyword">for</span> item <span class="hljs-keyword">in</span> soup_article.find_all(<span class="hljs-string">'li'</span>, class_=<span class="hljs-string">'ComplexArticleItem_item__L5o7k'</span>):
            listing = {}
            
            <span class="hljs-comment"># 매물 이름</span>
            name_tag = item.find(<span class="hljs-string">'span'</span>, class_=<span class="hljs-string">'ComplexArticleItem_name__4h3AA'</span>)
            listing[<span class="hljs-string">'매물명'</span>] = name_tag.text.strip() <span class="hljs-keyword">if</span> name_tag <span class="hljs-keyword">else</span> <span class="hljs-string">'Unknown'</span>
            
            <span class="hljs-comment"># 매매 가격</span>
            price_tag = item.find(<span class="hljs-string">'span'</span>, class_=<span class="hljs-string">'ComplexArticleItem_price__DFeIb'</span>)
            listing[<span class="hljs-string">'매매가'</span>] = price_tag.text.strip() <span class="hljs-keyword">if</span> price_tag <span class="hljs-keyword">else</span> <span class="hljs-string">'Unknown'</span>
            
            <span class="hljs-comment"># 면적, 층수, 방향</span>
            summary_items = item.find_all(<span class="hljs-string">'li'</span>, class_=<span class="hljs-string">'ComplexArticleItem_item-summary__oHSwl'</span>)
            <span class="hljs-keyword">if</span> len(summary_items) &gt;= 4:
                listing[<span class="hljs-string">'면적'</span>] = summary_items[1].text.strip() <span class="hljs-keyword">if</span> len(summary_items) &gt; 1 <span class="hljs-keyword">else</span> <span class="hljs-string">'Unknown'</span>
                listing[<span class="hljs-string">'층수'</span>] = summary_items[2].text.strip() <span class="hljs-keyword">if</span> len(summary_items) &gt; 2 <span class="hljs-keyword">else</span> <span class="hljs-string">'Unknown'</span>
                listing[<span class="hljs-string">'방향'</span>] = summary_items[3].text.strip() <span class="hljs-keyword">if</span> len(summary_items) &gt; 3 <span class="hljs-keyword">else</span> <span class="hljs-string">'Unknown'</span>
            
            <span class="hljs-comment"># 이미지</span>
            image_tag = item.find(<span class="hljs-string">'img'</span>)
            listing[<span class="hljs-string">'이미지'</span>] = image_tag[<span class="hljs-string">'src'</span>] <span class="hljs-keyword">if</span> image_tag <span class="hljs-keyword">else</span> <span class="hljs-string">'No image'</span>
            
            <span class="hljs-comment"># 코멘트</span>
            comment_tag = item.find(<span class="hljs-string">'p'</span>, class_=<span class="hljs-string">'ComplexArticleItem_comment__zN_dK'</span>)
            listing[<span class="hljs-string">'코멘트'</span>] = comment_tag.text.strip() <span class="hljs-keyword">if</span> comment_tag <span class="hljs-keyword">else</span> <span class="hljs-string">'No comment'</span>
            
            <span class="hljs-comment"># 각 매물마다 기본 상세 정보(공급면적, 방/욕실 등)를 매물에 추가</span>
            combined_listing = {**detail_dict, **listing}
            listings.append(combined_listing)
        
        <span class="hljs-built_in">return</span> listings
    
    except Exception as e:
        <span class="hljs-built_in">print</span>(f<span class="hljs-string">"Error fetching details for {apt_code}: {e}"</span>)
        <span class="hljs-built_in">return</span> []

<span class="hljs-comment"># 아파트 정보를 수집하는 함수 (법정동 선택 가능)</span>
def collect_apt_info_for_city(city_name, sigungu_name, dong_name=None, json_path=<span class="hljs-string">'/content/drive/MyDrive/district.json'</span>):
    sigungu_codes, dong_list = get_dong_codes_for_city(city_name, sigungu_name, json_path)

    <span class="hljs-keyword">if</span> dong_list is None:
        <span class="hljs-built_in">print</span>(f<span class="hljs-string">"Error: {city_name} not found in JSON."</span>)
        <span class="hljs-built_in">return</span> None

    all_apt_data = []
    dong_code_name_map = {dong[<span class="hljs-string">'code'</span>]: dong[<span class="hljs-string">'name'</span>] <span class="hljs-keyword">for</span> dong <span class="hljs-keyword">in</span> dong_list}

    <span class="hljs-comment"># 법정동 선택</span>
    <span class="hljs-keyword">if</span> dong_name and dong_name != <span class="hljs-string">'전체'</span>:
        dong_code_name_map = {k: v <span class="hljs-keyword">for</span> k, v <span class="hljs-keyword">in</span> dong_code_name_map.items() <span class="hljs-keyword">if</span> v == dong_name}

    <span class="hljs-keyword">for</span> dong_code, dong_name <span class="hljs-keyword">in</span> dong_code_name_map.items():
        <span class="hljs-built_in">print</span>(f<span class="hljs-string">"Collecting apartment codes for {dong_code} ({dong_name})"</span>)
        apt_codes = get_apt_list(dong_code)

        <span class="hljs-keyword">if</span> not apt_codes.empty:
            <span class="hljs-keyword">for</span> _, apt_info <span class="hljs-keyword">in</span> apt_codes.iterrows():
                apt_code = apt_info[<span class="hljs-string">'complexNo'</span>]
                <span class="hljs-built_in">print</span>(f<span class="hljs-string">"Collecting details for {apt_code}"</span>)
                listings = get_apt_details(apt_code)
                
                <span class="hljs-keyword">if</span> listings:
                    <span class="hljs-keyword">for</span> listing <span class="hljs-keyword">in</span> listings:
                        <span class="hljs-comment"># 모든 매물 정보를 결합</span>
                        listing[<span class="hljs-string">'dong_code'</span>] = dong_code
                        listing[<span class="hljs-string">'dong_name'</span>] = dong_name
                        all_apt_data.append(listing)
        <span class="hljs-keyword">else</span>:
            <span class="hljs-built_in">print</span>(f<span class="hljs-string">"No apartment codes found for {dong_code}"</span>)

    <span class="hljs-keyword">if</span> all_apt_data:
        final_df = pd.DataFrame(all_apt_data)
        final_df[<span class="hljs-string">'si_do_name'</span>] = city_name
        final_df[<span class="hljs-string">'sigungu_name'</span>] = sigungu_name
        final_df[<span class="hljs-string">'dong_name'</span>] = dong_name <span class="hljs-keyword">if</span> dong_name <span class="hljs-keyword">else</span> <span class="hljs-string">'전체'</span>
        
        <span class="hljs-comment"># 엑셀 파일로 저장</span>
        file_path = f<span class="hljs-string">'/content/drive/MyDrive/{city_name}_{sigungu_name}_apartments.xlsx'</span>
        final_df.to_excel(file_path, index=False)
        <span class="hljs-built_in">print</span>(f<span class="hljs-string">"Data saved to {file_path}"</span>)
    <span class="hljs-keyword">else</span>:
        <span class="hljs-built_in">print</span>(<span class="hljs-string">"No data to save."</span>)

<span class="hljs-comment"># 함수 호출 예시</span>
collect_apt_info_for_city(<span class="hljs-string">"서울특별시"</span>, <span class="hljs-string">"강남구"</span>, <span class="hljs-string">"개포동"</span>)</pre>
<p>자 다음편에서는 이 서비스를 스트림릿으로 연계해서 실제 사용자가 편하게 웹에서 선택하여 사용할 수 있도록 정리해보겠습니다.</p>
<p>&nbsp;</p>
<!-- CONTENT END 8 -->
]]></content:encoded>
					
		
		
		<media:content url="https://2days.kr/wp-content/uploads/2024/09/고급-부동산-정보-필터-고도화-네이버-매물-정리하기-2.png" medium="image"></media:content>
            	</item>
		<item>
		<title>부동산 매물 정보 수집하기 &#8211; 부동산 데이터 네이버 부동산 크롤링 및 가공 #3</title>
		<link>https://2days.kr/15/09/10/56542/it/program/</link>
		
		<dc:creator><![CDATA[urjent]]></dc:creator>
		<pubDate>Sun, 15 Sep 2024 01:01:12 +0000</pubDate>
				<category><![CDATA[program]]></category>
		<category><![CDATA[네이버]]></category>
		<category><![CDATA[네이버 부동산]]></category>
		<category><![CDATA[네이버 부동산 크롤링]]></category>
		<category><![CDATA[부동산]]></category>
		<category><![CDATA[크롤링]]></category>
		<category><![CDATA[파이썬]]></category>
		<category><![CDATA[파이썬 크롤링]]></category>
		<guid isPermaLink="false">https://2days.kr/?p=56542</guid>

					<description><![CDATA[부동산 매물 정보 수집하기 &#8211; 부동산 데이터 네이버 부동산 크롤링 및 가공 #3 ㅣ 부동산 시장에서 아파트 단지에 대한 정보는 투자자와 구매자에게 매우 중요한 요소입니다. 특히, 특정 지역의 아파트 단지 정보를 효율적으로 수집하는 방법은 데이터 기반의 의사결정을 가능하게 합니다. 이번 포스트에서는 네이버 부동산 API를 활용하여 특정 법정동에 위치한 아파트 단지의 이름과 고유 코드를 조회하는 방법에 [&#8230;]]]></description>
										<content:encoded><![CDATA[<p style="background-color: #ffffff; color: #000000; text-align: start;">부동산 매물 정보 수집하기 &#8211; 부동산 데이터 네이버 부동산 크롤링 및 가공 #3 ㅣ 부동산 시장에서 아파트 단지에 대한 정보는 투자자와 구매자에게 매우 중요한 요소입니다. 특히, 특정 지역의 아파트 단지 정보를 효율적으로 수집하는 방법은 데이터 기반의 의사결정을 가능하게 합니다. 이번 포스트에서는 네이버 부동산 API를 활용하여 특정 법정동에 위치한 아파트 단지의 이름과 고유 코드를 조회하는 방법에 대해 자세히 알아보겠습니다.</p>
<h3 style="background-color: #ffffff; color: #000000; text-align: start;" data-ke-size="size23">부동산 매물 정보 수집하기 &#8211; 부동산 데이터 네이버 부동산 크롤링 및 가공 #3</h3>
<p><a href="https://aboda.kr/entry/%EB%B6%80%EB%8F%99%EC%82%B0-%EB%A7%A4%EB%AC%BC-%EC%A0%95%EB%B3%B4-%EC%88%98%EC%A7%91%ED%95%98%EA%B8%B0-%EB%B6%80%EB%8F%99%EC%82%B0-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%84%A4%EC%9D%B4%EB%B2%84-%EB%B6%80%EB%8F%99%EC%82%B0-%ED%81%AC%EB%A1%A4%EB%A7%81-%EB%B0%8F-%EA%B0%80%EA%B3%B5-1" target="_blank" rel="noopener">2024.09.15 &#8211; [부동산/자동화 프로젝트] &#8211; 부동산 매물 정보 수집하기 &#8211; 부동산 데이터 네이버 부동산 크롤링 및 가공 #1</a></p>
<p><a href="https://aboda.kr/entry/%EB%B6%80%EB%8F%99%EC%82%B0-%EB%A7%A4%EB%AC%BC-%EC%A0%95%EB%B3%B4-%EC%88%98%EC%A7%91%ED%95%98%EA%B8%B0-%EB%B6%80%EB%8F%99%EC%82%B0-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%84%A4%EC%9D%B4%EB%B2%84-%EB%B6%80%EB%8F%99%EC%82%B0-%ED%81%AC%EB%A1%A4%EB%A7%81-%EB%B0%8F-%EA%B0%80%EA%B3%B5-2" target="_blank" rel="noopener">2024.09.15 &#8211; [부동산/자동화 프로젝트] &#8211; 부동산 매물 정보 수집하기 &#8211; 부동산 데이터 네이버 부동산 크롤링 및 가공 #2</a></p>
<figure data-ke-type="image" data-ke-mobilestyle="widthOrigin" data-ke-style="alignCenter">
<p><figure style="width: 2560px" class="wp-caption alignnone"><img decoding="async" src="https://blog.kakaocdn.net/dn/rJJDc/btsJEjVhkPo/2kZUECtqYCLHX9Hz4SCBxK/img.png" alt="부동산 매물 정보 수집하기 - 부동산 데이터 네이버 부동산 크롤링 및 가공 #3" width="2560" height="2560" data-origin-width="2560" data-origin-height="2560" data-is-animation="false" data-filename="부동산 매물 정보 수집하기 - 부동산 데이터 네이버 부동산 크롤링 및 가공 #3.png" loading="lazy" data-origin- title="부동산 매물 정보 수집하기 - 부동산 데이터 네이버 부동산 크롤링 및 가공 #3 20"><figcaption class="wp-caption-text">부동산 매물 정보 수집하기 &#8211; 부동산 데이터 네이버 부동산 크롤링 및 가공 #3</figcaption></figure><figcaption>부동산 매물 정보 수집하기 &#8211; 부동산 데이터 네이버 부동산 크롤링 및 가공 #3</figcaption></figure><div class='code-block code-block-2' style='margin: 8px auto; text-align: center; display: block; clear: both;'>
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8940400388075870"
     crossorigin="anonymous"></script>
<!-- 중간 -->
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-8940400388075870"
     data-ad-slot="8794586137"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></div>

<h2 style="background-color: #ffffff; color: #000000; text-align: start;">1. 법정동과 행정동의 이해</h2>
<p style="background-color: #ffffff; color: #000000; text-align: start;">법정동은 정부에서 정한 공식적인 동의 기준으로, 부동산 관련 데이터에서 주로 사용됩니다. 행정동은 행정 구역을 기준으로 하며, 법정동과 행정동의 코드는 정부에서 사용하는 동일한 체계를 따릅니다. 예를 들어, 마포구 상암동의 법정동 코드는 &#8220;1144012700&#8221;입니다. 이 코드를 사용하여 해당 지역의 아파트 단지 정보를 조회할 수 있습니다.</p>
<h2 style="background-color: #ffffff; color: #000000; text-align: start;">2. 법정동 코드 조회</h2>
<p style="background-color: #ffffff; color: #000000; text-align: start;">법정동 코드는 정부의 행정표준코드관리시스템에서 확인할 수 있습니다. 이 시스템에서는 각 지역의 법정동 코드와 이름을 조회할 수 있으며, 필요한 정보를 쉽게 찾을 수 있습니다. 예를 들어, 마포구 상암동의 법정동 코드는 다음과 같이 확인할 수 있습니다:</p>
<ul style="list-style-type: disc; background-color: #ffffff; color: #000000; text-align: start;" data-ke-list-type="disc">
<li style="color: #000000;"><b>법정동 코드</b>: 1144012700</li>
<li style="color: #000000;"><b>법정동명</b>: 상암동</li>
</ul>
<p style="background-color: #ffffff; color: #000000; text-align: start;">이 정보를 바탕으로 아파트 단지 정보를 조회할 수 있습니다.</p>

<h2 style="background-color: #ffffff; color: #000000; text-align: start;">3. 필요한 라이브러리 설치</h2>
<p style="background-color: #ffffff; color: #000000; text-align: start;">Python을 사용하여 네이버 부동산 API에 접근하기 위해서는 requests, json, pandas 라이브러리를 설치해야 합니다. 아래의 명령어를 사용하여 필요한 라이브러리를 설치할 수 있습니다.</p>
<div>
<pre class="hljs cmake" style="background-color: #1e1e1e; color: #dcdcdc;" contenteditable="false">pip <span class="hljs-keyword">install</span> requests pandas
</pre>
</div>
<h2 style="background-color: #ffffff; color: #000000; text-align: start;">4. 아파트 단지 정보 조회 코드</h2>
<p style="background-color: #ffffff; color: #000000; text-align: start;">이제 법정동 코드를 사용하여 아파트 단지 정보를 조회하는 코드를 작성해 보겠습니다. 아래는 마포구 상암동의 아파트 단지 정보를 조회하는 코드입니다.</p>
<div>
<pre class="hljs python" style="background-color: #1e1e1e; color: #dcdcdc;" contenteditable="false"><span class="hljs-keyword">import</span> requests
<span class="hljs-keyword">import</span> json
<span class="hljs-keyword">import</span> pandas <span class="hljs-keyword">as</span> pd

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">get_apt_list</span><span class="hljs-params">(dong_code)</span>:</span>
    down_url = <span class="hljs-string">'https://new.land.naver.com/api/regions/complexes?cortarNo='</span> + dong_code + <span class="hljs-string">'&amp;realEstateType=APT&amp;order='</span>
    header = {
        <span class="hljs-string">"Accept-Encoding"</span>: <span class="hljs-string">"gzip"</span>,
        <span class="hljs-string">"Host"</span>: <span class="hljs-string">"new.land.naver.com"</span>,
        <span class="hljs-string">"Referer"</span>: <span class="hljs-string">"https://new.land.naver.com/complexes/102378?ms=37.5018495,127.0438028,16&amp;a=APT&amp;b=A1&amp;e=RETAIL"</span>,
        <span class="hljs-string">"Sec-Fetch-Dest"</span>: <span class="hljs-string">"empty"</span>,
        <span class="hljs-string">"Sec-Fetch-Mode"</span>: <span class="hljs-string">"cors"</span>,
        <span class="hljs-string">"Sec-Fetch-Site"</span>: <span class="hljs-string">"same-origin"</span>,
        <span class="hljs-string">"User-Agent"</span>: <span class="hljs-string">"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"</span>
    }
    r = requests.get(down_url, data={<span class="hljs-string">"sameAddressGroup"</span>: <span class="hljs-string">"false"</span>}, headers=header)

    r.encoding = <span class="hljs-string">"utf-8-sig"</span>
    temp = json.loads(r.text)
    <span class="hljs-keyword">try</span>:
        temp = pd.DataFrame(temp[<span class="hljs-string">'complexList'</span>])[[<span class="hljs-string">'complexNo'</span>, <span class="hljs-string">'complexName'</span>]]
    <span class="hljs-keyword">except</span>:
        temp = []
    <span class="hljs-keyword">return</span> temp

apt_list = get_apt_list(<span class="hljs-string">'1144012700'</span>)
print(apt_list)
</pre>
</div>
<h3 style="background-color: #ffffff; color: #000000; text-align: start;">코드 설명</h3>
<ol style="list-style-type: decimal; background-color: #ffffff; color: #000000; text-align: start;" data-ke-list-type="decimal">
<li style="color: #000000;"><b>라이브러리 임포트</b>: requests, json, pandas 라이브러리를 임포트합니다.</li>
<li style="color: #000000;"><b>get_apt_list 함수 정의</b>: 이 함수는 법정동 코드를 입력받아 해당 지역의 아파트 단지 정보를 조회합니다.</li>
<li style="color: #000000;"><b>API 요청 URL 설정</b>: down_url 변수에 API 요청 URL을 설정합니다. 이 URL은 법정동 코드와 아파트 유형을 포함합니다.</li>
<li style="color: #000000;"><b>헤더 설정</b>: API 요청에 필요한 헤더를 설정합니다. 이 헤더는 요청의 출처를 명시하고, 브라우저에서 요청한 것처럼 보이게 합니다.</li>
<li style="color: #000000;"><b>API 요청 및 응답 처리</b>: requests.get 메서드를 사용하여 API에 GET 요청을 보냅니다. 응답을 JSON 형식으로 파싱하고, 아파트 단지 정보를 DataFrame으로 변환합니다.</li>
<li style="color: #000000;"><b>결과 출력</b>: apt_list 변수에 저장된 아파트 단지 정보를 출력합니다.</li>
</ol>
<h2 style="background-color: #ffffff; color: #000000; text-align: start;">5. 실행 결과</h2>
<p style="background-color: #ffffff; color: #000000; text-align: start;">위 코드를 실행하면 마포구 상암동에 위치한 아파트 단지의 이름과 고유 코드가 출력됩니다. 예를 들어, 다음과 같은 결과를 얻을 수 있습니다.</p>
<div>
<pre class="hljs angelscript" style="background-color: #1e1e1e; color: #dcdcdc;" contenteditable="false">   complexNo          complexName
<span class="hljs-number">0</span>   <span class="hljs-number">12345678</span>         상암동 아파트 <span class="hljs-number">1</span>단지
<span class="hljs-number">1</span>   <span class="hljs-number">23456789</span>         상암동 아파트 <span class="hljs-number">2</span>단지
...
</pre>
</div>
<p style="background-color: #ffffff; color: #000000; text-align: start;">이 결과는 상암동에 위치한 아파트 단지의 고유 코드와 이름을 포함하고 있습니다. 이를 통해 사용자는 특정 지역의 아파트 단지 정보를 쉽게 확인할 수 있습니다.</p>
<p><a href="https://2days.kr/15/09/07/56533/coding/data/">부동산 매물 정보 수집하기 &amp;#8211; 부동산 데이터 네이버 부동산 크롤링 및 가공 #1</a></p>
<p><a href="https://2days.kr/15/09/08/56538/coding/data/">부동산 매물 정보 수집하기 &amp;#8211; 부동산 데이터 네이버 부동산 크롤링 및 가공 #2</a></p>
<!-- CONTENT END 10 -->
]]></content:encoded>
					
		
		
		<media:content url="https://2days.kr/wp-content/uploads/2024/09/부동산-매물-정보-수집하기-부동산-데이터-네이버-부동산-크롤링-및-가공-3.png" medium="image"></media:content>
            	</item>
		<item>
		<title>부동산 매물 정보 수집하기 &#8211; 부동산 데이터 네이버 부동산 크롤링 및 가공 #2</title>
		<link>https://2days.kr/15/09/08/56538/it/program/</link>
		
		<dc:creator><![CDATA[urjent]]></dc:creator>
		<pubDate>Sat, 14 Sep 2024 23:09:46 +0000</pubDate>
				<category><![CDATA[program]]></category>
		<category><![CDATA[부동산]]></category>
		<category><![CDATA[부동산 크롤링]]></category>
		<category><![CDATA[크롤링]]></category>
		<category><![CDATA[파이썬]]></category>
		<category><![CDATA[파이썬 크롤링]]></category>
		<guid isPermaLink="false">https://2days.kr/?p=56538</guid>

					<description><![CDATA[부동산 매물 정보 수집하기 &#8211; 부동산 데이터 네이버 부동산 크롤링 및 가공 #2 ㅣ 현대 사회에서 데이터는 매우 중요한 자산입니다. 특히 부동산 시장에서는 아파트 단지에 대한 정보가 투자 결정에 큰 영향을 미치기 때문에, 이를 효율적으로 수집하는 방법이 필요합니다. 이번 포스트에서는 Python을 사용하여 아파트 단지 정보를 크롤링하는 방법에 대해 자세히 알아보겠습니다. 이 과정에서는 Naver의 부동산 API를 [&#8230;]]]></description>
										<content:encoded><![CDATA[<p style="background-color: #ffffff; color: #000000; text-align: start;"><span style="color: #000000;">부동산 매물 정보 수집하기 &#8211; 부동산 데이터 네이버 부동산 크롤링 및 가공 #2 ㅣ 현대 사회에서 데이터는 매우 중요한 자산입니다. 특히 부동산 시장에서는 아파트 단지에 대한 정보가 투자 결정에 큰 영향을 미치기 때문에, 이를 효율적으로 수집하는 방법이 필요합니다. 이번 포스트에서는 Python을 사용하여 아파트 단지 정보를 크롤링하는 방법에 대해 자세히 알아보겠습니다. 이 과정에서는 Naver의 부동산 API를 활용하여 세대수, 사용승인일, 평형별 면적 정보 등을 수집할 것입니다.</span></p>
<h3 style="background-color: #ffffff; color: #000000; text-align: start;" data-ke-size="size23"><span style="color: #000000;"><b>부동산 매물 정보 수집하기 &#8211; 부동산 데이터 네이버 부동산 크롤링 및 가공 #2</b></span></h3>
<figure data-ke-type="image" data-ke-mobilestyle="widthOrigin" data-ke-style="alignCenter">
<p><figure style="width: 2560px" class="wp-caption alignnone"><img decoding="async" src="https://blog.kakaocdn.net/dn/bHLFUO/btsJDRrpjuV/2IEGJMM9ZuuOlAuuSAgdK1/img.png" alt="부동산 매물 정보 수집하기 - 부동산 데이터 네이버 부동산 크롤링 및 가공 #2" width="2560" height="2560" data-origin-width="2560" data-origin-height="2560" data-is-animation="false" data-filename="부동산 매물 정보 수집하기 - 부동산 데이터 네이버 부동산 크롤링 및 가공.png" loading="lazy" data-origin- title="부동산 매물 정보 수집하기 - 부동산 데이터 네이버 부동산 크롤링 및 가공 #2 23"><figcaption class="wp-caption-text">부동산 매물 정보 수집하기 &#8211; 부동산 데이터 네이버 부동산 크롤링 및 가공 #2</figcaption></figure><figcaption>부동산 매물 정보 수집하기 &#8211; 부동산 데이터 네이버 부동산 크롤링 및 가공</figcaption></figure><div class='code-block code-block-2' style='margin: 8px auto; text-align: center; display: block; clear: both;'>
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8940400388075870"
     crossorigin="anonymous"></script>
<!-- 중간 -->
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-8940400388075870"
     data-ad-slot="8794586137"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></div>

<p>&nbsp;</p>
<p><span style="background-color: #ffffff; color: #000000; text-align: start;">오늘 시리즈는 부동산 매물 정보 수집하기 &#8211; 부동산 데이터 네이버 부동산 크롤링 및 가공 편입니다. 아직 1편을 못 보신 분들이라면 1편을 먼저 읽고 오시는게 도움이 되실 수 있습니다.</span></p>
<p><span style="color: #000000;"><a style="color: #000000;" href="https://aboda.kr/entry/%EB%B6%80%EB%8F%99%EC%82%B0-%EB%A7%A4%EB%AC%BC-%EC%A0%95%EB%B3%B4-%EC%88%98%EC%A7%91%ED%95%98%EA%B8%B0-%EB%B6%80%EB%8F%99%EC%82%B0-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%84%A4%EC%9D%B4%EB%B2%84-%EB%B6%80%EB%8F%99%EC%82%B0-%ED%81%AC%EB%A1%A4%EB%A7%81-%EB%B0%8F-%EA%B0%80%EA%B3%B5-1" target="_blank" rel="noopener">2024.09.15 &#8211; [부동산/자동화 프로젝트] &#8211; 부동산 매물 정보 수집하기 &#8211; 부동산 데이터 네이버 부동산 크롤링 및 가공 #1</a></span></p>
<p>&nbsp;</p>
<h2 style="background-color: #ffffff; color: #000000; text-align: start;"><span style="color: #000000;">1. 크롤링의 필요성</span></h2>
<p style="background-color: #ffffff; color: #000000; text-align: start;"><span style="color: #000000;">부동산 시장은 끊임없이 변화하고 있으며, 이에 따라 아파트 단지에 대한 정보도 지속적으로 업데이트됩니다. 투자자, 구매자, 임대인 등 다양한 이해관계자들은 이러한 정보를 신속하게 파악해야 합니다. 하지만 수작업으로 정보를 수집하는 것은 시간과 노력이 많이 소요되므로, 자동화된 방법이 필요합니다. Python은 이러한 작업을 수행하기에 적합한 언어로, 다양한 라이브러리를 통해 웹 크롤링을 쉽게 구현할 수 있습니다.</span></p>
<h2 style="background-color: #ffffff; color: #000000; text-align: start;"><span style="color: #000000;">2. 필요한 라이브러리 설치</span></h2>
<p style="background-color: #ffffff; color: #000000; text-align: start;"><span style="color: #000000;">Python을 사용하여 웹 크롤링을 수행하기 위해서는 몇 가지 라이브러리를 설치해야 합니다. 주로 사용되는 라이브러리는 requests, BeautifulSoup, 그리고 json입니다. 아래의 명령어를 사용하여 필요한 라이브러리를 설치할 수 있습니다.</span></p>
<div>
<pre class="hljs mipsasm" style="background-color: #1e1e1e; color: #dcdcdc;" contenteditable="false">pip <span class="hljs-keyword">install </span>requests <span class="hljs-keyword">beautifulsoup4 </span>pandas
</pre>
</div>
<h2 style="background-color: #ffffff; color: #000000; text-align: start;"><span style="color: #000000;">3. API 요청을 위한 기본 설정</span></h2>
<p style="background-color: #ffffff; color: #000000; text-align: start;"><span style="color: #000000;">Naver의 부동산 API를 사용하여 아파트 단지 정보를 요청하기 위해서는 API의 URL과 요청 헤더를 설정해야 합니다. 아래는 기본적인 설정 코드입니다.</span></p>
<div>
<pre class="hljs pgsql" style="background-color: #1e1e1e; color: #dcdcdc;" contenteditable="false"><span class="hljs-keyword">import</span> requests
<span class="hljs-keyword">import</span> <span class="hljs-type">json</span>
<span class="hljs-keyword">from</span> bs4 <span class="hljs-keyword">import</span> BeautifulSoup

url = "https://new.land.naver.com/api/complexes/overview/"
param = {
    <span class="hljs-string">'complexNo'</span>: <span class="hljs-string">'23620'</span>  # 조회할 아파트 단지 번호
}
<span class="hljs-keyword">header</span> = {
    <span class="hljs-string">'User-Agent'</span>: <span class="hljs-string">'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'</span>,
    <span class="hljs-string">'Referer'</span>: <span class="hljs-string">'https://m.land.naver.com/'</span>
}
</pre>
</div>
<p style="background-color: #ffffff; color: #000000; text-align: start;"><span style="color: #000000;">위 코드에서 complexNo는 조회하고자 하는 아파트 단지의 고유 번호입니다. 이 번호는 Naver 부동산 사이트에서 각 단지의 URL을 통해 확인할 수 있습니다.</span></p>
<h2 style="background-color: #ffffff; color: #000000; text-align: start;"><span style="color: #000000;">4. 아파트 단지 정보 요청</span></h2>
<p style="background-color: #ffffff; color: #000000; text-align: start;"><span style="color: #000000;">이제 설정한 URL과 헤더를 사용하여 API에 GET 요청을 보내고, 응답을 받아 아파트 단지 정보를 추출해 보겠습니다.</span></p>
<p style="background-color: #ffffff; color: #000000; text-align: start;"><span style="color: #000000;">먼저 단지를 추출할 수 있는 request 주소를 한번 살펴 보겠습니다.</span></p>
<p style="background-color: #ffffff; color: #000000; text-align: start;"><span style="color: #000000; text-align: left;">아래 캡쳐 화면은 단지 정보를 보여주는 링크를 Postman으로 Request 문과 호출 결과를 조회한 화면입니다. 화면에서 붉은색 상자는 링크를 입력하는 곳이며, 파란색 상자는 Python Request문을 생성해 줍니다. 그리고 초록색 상자는 해당 Requst 호출의 결과를 보기쉽게 보여줍니다. 주의할 점은 생성된 Request 문의 header 값을 추가해주어야지 Naver 사이트에서 원하는 결과값을 얻을 수 있습니다. 아래 코드에 해당 header 값이 있습니다.</span></p>
<p style="background-color: #ffffff; color: #000000; text-align: start;"><span style="color: #000000; text-align: left;">먼저 Postman을 접속해서 해당 주소를 검색해보겠습니다.</span></p>
<p style="background-color: #ffffff; color: #000000; text-align: start;"><span style="color: #000000; text-align: left;"><a style="color: #000000;" href="https://www.postman.com/" target="_blank" rel="noopener noreferrer noopener">https://www.postman.com/</a></span></p>
<p style="background-color: #ffffff; color: #000000; text-align: start;"><span style="color: #000000;"><a style="color: #000000;" href="https://new.land.naver.com/api/complexes/overview/23620?complexNo=23620" target="_blank" rel="noopener">https://new.land.naver.com/api/complexes/overview/23620?complexNo=23620</a></span></p>
<div id="SE-737c04ad-8844-4600-9ed2-b5c89df5c568" style="background-color: #f7f7f7; color: #777777; text-align: left;">
<div>
<div>
<div>
<figure data-ke-type="image" data-ke-style="alignCenter" data-ke-mobilestyle="widthOrigin"><img decoding="async" src="https://blog.kakaocdn.net/dn/bmdd7n/btsJEo3g7M8/VDP8LBLhLaf3HemQ9k37dk/img.png" data-height="736" data-width="886" data-lazy-src="" data-origin-width="966" data-origin-height="804" data-is-animation="false" loading="lazy" alt="img" title="부동산 매물 정보 수집하기 - 부동산 데이터 네이버 부동산 크롤링 및 가공 #2 24"></figure>
</div>
</div>
</div>
</div>
<p><span style="background-color: #ffffff; color: #000000; text-align: left;">Postman을 통해 보여지는 단지 정보의 key와 value입니다.</span></p>
<figure data-ke-type="image" data-ke-style="alignLeft" data-ke-mobilestyle="widthOrigin"><img decoding="async" src="https://blog.kakaocdn.net/dn/bCQ9LM/btsJDWMPD4W/a0ojq1Eta45UlWpihBsRwK/img.jpg" data-height="640" data-width="298" data-lazy-src="" data-origin-width="298" data-origin-height="640" data-is-animation="false" loading="lazy" alt="img" title="부동산 매물 정보 수집하기 - 부동산 데이터 네이버 부동산 크롤링 및 가공 #2 25"></figure>
<p><span style="color: #000000;">Request 정보를 토대로 아래와 같이 코드를 작성해봅니다.</span></p>
<pre id="code_1726353123879" class="bash hljs" contenteditable="false" data-ke-language="bash" data-ke-type="codeblock">import requests
import json
import pandas as pd
import requests
from bs4 import BeautifulSoup

url = <span class="hljs-string">"https://new.land.naver.com/api/complexes/overview/"</span>

param = {
    <span class="hljs-string">'complexNo'</span>: <span class="hljs-string">'23620'</span>
}
header = {
    <span class="hljs-string">'User-Agent'</span>: <span class="hljs-string">'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'</span>,
    <span class="hljs-string">'Referer'</span>: <span class="hljs-string">'https://m.land.naver.com/'</span>
}
payload = {}

response = requests.request(<span class="hljs-string">"GET"</span>, url+param[<span class="hljs-string">'complexNo'</span>], params=param, headers=header, data=payload)
u = response.url
temp = json.loads(response.text)
<span class="hljs-built_in">print</span>(<span class="hljs-string">"\n\n단지명: %s 사용승인일: %s  세대수: %s \n"</span> \
      %(temp[<span class="hljs-string">'complexName'</span>], temp[<span class="hljs-string">'useApproveYmd'</span>], temp[<span class="hljs-string">'totalHouseHoldCount'</span>]))

<span class="hljs-comment"># 추가 정보 조회</span>
url2 = <span class="hljs-string">"https://m.land.naver.com/complex/info/"</span>+ param[<span class="hljs-string">'complexNo'</span>] + <span class="hljs-string">"?ptpNo=1"</span>
response2 = requests.request(<span class="hljs-string">"GET"</span>, url2, headers=header, data=payload)
doc = BeautifulSoup(response2.text, <span class="hljs-string">'html.parser'</span>)

titles = doc.find_all(<span class="hljs-string">'span'</span>, class_=<span class="hljs-string">'tit'</span>)
datas = doc.find_all(<span class="hljs-string">'span'</span>, class_=<span class="hljs-string">'data'</span>)
tmp = dict()
<span class="hljs-keyword">for</span> title, data <span class="hljs-keyword">in</span> zip(titles, datas):
       tmp.setdefault(title.text, data.text.replace(<span class="hljs-string">"\n"</span>, <span class="hljs-string">""</span>).strip())
<span class="hljs-built_in">print</span>(<span class="hljs-string">"용적률: "</span> + tmp[<span class="hljs-string">'용적률'</span>] + <span class="hljs-string">" 건폐율: "</span> + tmp[<span class="hljs-string">'건폐율'</span>])

<span class="hljs-comment"># 평형 별 정보 조회</span>
temp2 = temp[<span class="hljs-string">'pyeongs'</span>]
<span class="hljs-keyword">for</span> item <span class="hljs-keyword">in</span> temp2:
     <span class="hljs-built_in">print</span>(<span class="hljs-string">"분양: %6s m^2 [ %-5s] 전용: %5s m^2(%5s 평)"</span> \
           %(item[<span class="hljs-string">'supplyArea'</span>], item[<span class="hljs-string">'pyeongName2'</span>], item[<span class="hljs-string">'exclusiveArea'</span>], item[<span class="hljs-string">'exclusivePyeong'</span>]))</pre>
<h3 style="background-color: #ffffff; color: #0d0d0d; text-align: start;"><span style="color: #000000;">필요한 라이브러리 불러오기</span></h3>
<pre id="code_1726353680744" class="bash hljs" contenteditable="false" data-ke-language="bash" data-ke-type="codeblock">import requests
import json
import pandas as pd
from bs4 import BeautifulSoup</pre>
<ul style="list-style-type: disc; background-color: #ffffff; color: #0d0d0d; text-align: start;" data-ke-list-type="disc">
<li><span style="color: #000000;">requests: HTTP 요청을 보내고 응답을 받기 위해 사용됩니다.</span></li>
<li><span style="color: #000000;">json: API에서 받은 JSON 데이터를 처리하는 데 사용됩니다.</span></li>
<li><span style="color: #000000;">pandas: 데이터 처리를 용이하게 하기 위한 라이브러리. 현재 코드에서는 사용되지 않았지만 나중에 데이터를 처리할 때 유용합니다.</span></li>
<li><span style="color: #000000;">BeautifulSoup: HTML을 파싱하고 필요한 정보를 추출하기 위해 사용됩니다.</span></li>
</ul>
<h3 style="background-color: #ffffff; color: #0d0d0d; text-align: start;"><span style="color: #000000;">API URL과 요청 매개변수 설정</span></h3>
<pre id="code_1726353700028" class="bash hljs" contenteditable="false" data-ke-language="bash" data-ke-type="codeblock">url = <span class="hljs-string">"https://new.land.naver.com/api/complexes/overview/"</span>

param = {
    <span class="hljs-string">'complexNo'</span>: <span class="hljs-string">'23620'</span>
}</pre>
<div style="background-color: #000000;"></div>
<ul style="list-style-type: disc; background-color: #ffffff; color: #0d0d0d; text-align: start;" data-ke-list-type="disc">
<li><span style="color: #000000;">url: 네이버 부동산 API의 단지 정보에 접근하는 URL입니다.</span></li>
<li><span style="color: #000000;">param: 조회하려는 특정 아파트 단지의 고유번호가 담긴 파라미터로, &#8216;23620&#8217;은 &#8220;상암월드컵파크 4단지&#8221;를 나타냅니다.</span></li>
</ul>
<h3 style="background-color: #ffffff; color: #0d0d0d; text-align: start;"><span style="color: #000000;">요청 헤더 설정</span></h3>
<pre id="code_1726353742027" class="bash hljs" contenteditable="false" data-ke-language="bash" data-ke-type="codeblock">header = {
    <span class="hljs-string">'User-Agent'</span>: <span class="hljs-string">'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'</span>,
    <span class="hljs-string">'Referer'</span>: <span class="hljs-string">'https://m.land.naver.com/'</span>
}</pre>
<div style="background-color: #000000;"></div>
<ul style="list-style-type: disc; background-color: #ffffff; color: #0d0d0d; text-align: start;" data-ke-list-type="disc">
<li><span style="color: #000000;">User-Agent: 웹사이트에서 요청을 받을 때 어떤 브라우저로 접근하는지 인식하는 값입니다. 웹 서버에서 비정상적인 접근을 차단하는 경우가 있어, 이 값을 설정하여 사람처럼 보이도록 합니다.</span></li>
<li><span style="color: #000000;">Referer: API 요청을 네이버 모바일 부동산 사이트에서 온 것처럼 보이게 만듭니다.</span></li>
</ul>
<h3 style="background-color: #ffffff; color: #0d0d0d; text-align: start;"><span style="color: #000000;">단지 정보 요청 및 출력</span></h3>
<pre id="code_1726353760546" class="bash hljs" contenteditable="false" data-ke-language="bash" data-ke-type="codeblock">response = requests.request(<span class="hljs-string">"GET"</span>, url + param[<span class="hljs-string">'complexNo'</span>], params=param, headers=header, data={})
temp = json.loads(response.text)
<span class="hljs-built_in">print</span>(<span class="hljs-string">"\n\n단지명: %s 사용승인일: %s  세대수: %s \n"</span> \
      %(temp[<span class="hljs-string">'complexName'</span>], temp[<span class="hljs-string">'useApproveYmd'</span>], temp[<span class="hljs-string">'totalHouseHoldCount'</span>]))</pre>
<ul style="list-style-type: disc; background-color: #ffffff; color: #0d0d0d; text-align: start;" data-ke-list-type="disc">
<li><span style="color: #000000;">requests.request(&#8220;GET&#8221;, &#8230;): GET 요청을 통해 API로부터 데이터를 가져옵니다.</span></li>
<li><span style="color: #000000;">json.loads(response.text): API 응답을 JSON 형식으로 변환합니다.</span></li>
<li><span style="color: #000000;">print: 단지명, 사용승인일, 세대수를 출력합니다. 각각 temp에서 추출된 정보입니다.</span></li>
</ul>
<h3 style="background-color: #ffffff; color: #0d0d0d; text-align: start;"><span style="color: #000000;">추가 단지 정보 요청</span></h3>
<pre id="code_1726353790947" class="bash hljs" contenteditable="false" data-ke-language="bash" data-ke-type="codeblock">url2 = <span class="hljs-string">"https://m.land.naver.com/complex/info/"</span>+ param[<span class="hljs-string">'complexNo'</span>] + <span class="hljs-string">"?ptpNo=1"</span>
response2 = requests.request(<span class="hljs-string">"GET"</span>, url2, headers=header, data={})
doc = BeautifulSoup(response2.text, <span class="hljs-string">'html.parser'</span>)</pre>
<ul style="list-style-type: disc; background-color: #ffffff; color: #0d0d0d; text-align: start;" data-ke-list-type="disc">
<li><span style="color: #000000;">url2: 네이버 모바일 부동산 웹페이지에서 해당 단지에 대한 추가 정보를 가져오는 URL입니다.</span></li>
<li><span style="color: #000000;">BeautifulSoup: HTML 응답을 파싱하여 필요한 정보를 쉽게 추출할 수 있도록 합니다.</span></li>
</ul>
<h3 style="background-color: #ffffff; color: #0d0d0d; text-align: start;"><span style="color: #000000;">용적률, 건폐율 추출</span></h3>
<pre id="code_1726353811914" class="bash hljs" contenteditable="false" data-ke-language="bash" data-ke-type="codeblock">titles = doc.find_all(<span class="hljs-string">'span'</span>, class_=<span class="hljs-string">'tit'</span>)
datas = doc.find_all(<span class="hljs-string">'span'</span>, class_=<span class="hljs-string">'data'</span>)
tmp = dict()
<span class="hljs-keyword">for</span> title, data <span class="hljs-keyword">in</span> zip(titles, datas):
    tmp.setdefault(title.text, data.text.replace(<span class="hljs-string">"\n"</span>, <span class="hljs-string">""</span>).strip())
<span class="hljs-built_in">print</span>(<span class="hljs-string">"용적률: "</span> + tmp[<span class="hljs-string">'용적률'</span>] + <span class="hljs-string">" 건폐율: "</span> + tmp[<span class="hljs-string">'건폐율'</span>])</pre>
<ul style="list-style-type: disc; background-color: #ffffff; color: #0d0d0d; text-align: start;" data-ke-list-type="disc">
<li><span style="color: #000000;">doc.find_all(&#8216;span&#8217;, class_=&#8217;tit&#8217;): HTML에서 &#8216;span&#8217; 태그 중 클래스가 &#8216;tit&#8217;인 모든 요소를 찾습니다. 이는 제목(용적률, 건폐율 등)에 해당합니다.</span></li>
<li><span style="color: #000000;">zip: titles와 datas를 한 쌍으로 묶어 딕셔너리에 저장합니다.</span></li>
<li><span style="color: #000000;">print: 용적률과 건폐율을 출력합니다.</span></li>
</ul>
<h3 style="background-color: #ffffff; color: #0d0d0d; text-align: start;"><span style="color: #000000;">7. 평형별 정보 조회</span></h3>
<pre id="code_1726353824243" class="bash hljs" contenteditable="false" data-ke-language="bash" data-ke-type="codeblock">temp2 = temp[<span class="hljs-string">'pyeongs'</span>]
<span class="hljs-keyword">for</span> item <span class="hljs-keyword">in</span> temp2:
     <span class="hljs-built_in">print</span>(<span class="hljs-string">"분양: %6s m^2 [ %-5s] 전용: %5s m^2(%5s 평)"</span> \
           %(item[<span class="hljs-string">'supplyArea'</span>], item[<span class="hljs-string">'pyeongName2'</span>], item[<span class="hljs-string">'exclusiveArea'</span>], item[<span class="hljs-string">'exclusivePyeong'</span>]))</pre>
<ul style="list-style-type: disc; background-color: #ffffff; color: #0d0d0d; text-align: start;" data-ke-list-type="disc">
<li><span style="color: #000000;">temp2 = temp[&#8216;pyeongs&#8217;]: 단지 정보에서 평형별 데이터를 추출합니다.</span></li>
<li><span style="color: #000000;">for item in temp2: 각 평형의 정보를 순회하며 분양 면적과 전용 면적을 출력합니다.</span></li>
</ul>
<p><a href="https://2days.kr/15/09/07/56533/coding/data/">부동산 매물 정보 수집하기 &amp;#8211; 부동산 데이터 네이버 부동산 크롤링 및 가공 #1</a></p>
<!-- CONTENT END 12 -->
]]></content:encoded>
					
		
		
		<media:content url="https://2days.kr/wp-content/uploads/2024/09/부동산-매물-정보-수집하기-부동산-데이터-네이버-부동산-크롤링-및-가공.png" medium="image"></media:content>
            	</item>
		<item>
		<title>부동산 매물 정보 수집하기 &#8211; 부동산 데이터 네이버 부동산 크롤링 및 가공 #1</title>
		<link>https://2days.kr/15/09/07/56533/it/program/</link>
		
		<dc:creator><![CDATA[urjent]]></dc:creator>
		<pubDate>Sat, 14 Sep 2024 22:19:38 +0000</pubDate>
				<category><![CDATA[program]]></category>
		<category><![CDATA[네이버]]></category>
		<category><![CDATA[네이버 부동산]]></category>
		<category><![CDATA[네이버 크롤링]]></category>
		<category><![CDATA[네이버 파이썬]]></category>
		<category><![CDATA[부동산 크롤링]]></category>
		<category><![CDATA[부동산 파이썬]]></category>
		<category><![CDATA[크롤링]]></category>
		<category><![CDATA[파이썬]]></category>
		<guid isPermaLink="false">https://2days.kr/?p=56533</guid>

					<description><![CDATA[부동산 매물 정보 수집하기 &#8211; 부동산 데이터 네이버 부동산 크롤링 및 가공 #1 ㅣ 네이버 부동산 데이터는 매우 유용하게 활용할 수 있지만, 원하는 형태로 변환된 자료를 얻는 것은 상당히 어렵습니다. Excel의 VBA를 사용하여 데이터를 변환하는 방법이 소개되곤 하지만, Python의 뛰어난 기능을 통해 실시간 부동산 매물 정보를 크롤링하는 구체적인 방법을 공부하고 있습니다. 이제 네이버 부동산에서 방대한 [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>부동산 매물 정보 수집하기 &#8211; 부동산 데이터 네이버 부동산 크롤링 및 가공 #1 ㅣ 네이버 부동산 데이터는 매우 유용하게 활용할 수 있지만, 원하는 형태로 변환된 자료를 얻는 것은 상당히 어렵습니다. Excel의 VBA를 사용하여 데이터를 변환하는 방법이 소개되곤 하지만, Python의 뛰어난 기능을 통해 실시간 부동산 매물 정보를 크롤링하는 구체적인 방법을 공부하고 있습니다.</p>
<p style="background-color: #ffffff; color: #0d0d0d; text-align: start;">이제 네이버 부동산에서 방대한 데이터를 Python을 활용해 필요한 정보를 직접 수집해 보겠습니다.</p>
<h3 style="background-color: #ffffff; color: #0d0d0d; text-align: start;" data-ke-size="size23">부동산 매물 정보 수집하기 &#8211; 부동산 데이터 네이버 부동산 크롤링 및 가공 #1</h3>
<figure data-ke-type="image" data-ke-mobilestyle="widthOrigin" data-ke-style="alignCenter">
<p><figure style="width: 2560px" class="wp-caption alignnone"><img decoding="async" src="https://blog.kakaocdn.net/dn/YBEvR/btsJEUU24W5/T4wrGkk09jkMFBxAF1jitK/img.png" alt="부동산 매물 정보 수집하기 - 부동산 데이터 네이버 부동산 크롤링 및 가공 #1" width="2560" height="2560" data-origin-width="2560" data-origin-height="2560" data-is-animation="false" data-filename="부동산 매물 정보 수집하기 - 부동산 데이터 크롤링 및 가공 #1.png" loading="lazy" data-origin- title="부동산 매물 정보 수집하기 - 부동산 데이터 네이버 부동산 크롤링 및 가공 #1 30"><figcaption class="wp-caption-text">부동산 매물 정보 수집하기 &#8211; 부동산 데이터 네이버 부동산 크롤링 및 가공 #1</figcaption></figure><figcaption>부동산 매물 정보 수집하기 &#8211; 부동산 데이터 크롤링 및 가공 #1</figcaption></figure><div class='code-block code-block-2' style='margin: 8px auto; text-align: center; display: block; clear: both;'>
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8940400388075870"
     crossorigin="anonymous"></script>
<!-- 중간 -->
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-8940400388075870"
     data-ad-slot="8794586137"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></div>

<div id="SE-8f4a9d36-5aac-471b-9959-953aee3f8c53" style="background-color: #f7f7f7; color: #777777; text-align: left;">
<div>
<div>
<div>
<p id="SE-D957264E-4CFD-40F9-A4BD-D27C04709E52" style="color: #000000; text-align: var(--se-text-default-value-text-align);">네이버 부동산은 PC 환경과 모바일 환경으로 나누어져 서비스 되어지고 있으며,각각의 환경을 크롤링하는 방식도 차이가 있습니다. 두 방식 중에서 모바일 환경을 크롤링하는 방식이 보여지는 정보가 적어서 보다 유리합니다.</p>
</div>
</div>
</div>
</div>
<div id="SE-d184a622-947d-4abe-99fd-b636b3c39475" style="background-color: #f7f7f7; color: #777777; text-align: left;">
<div>
<div>
<div>
<figure data-ke-type="image" data-ke-style="alignCenter" data-ke-mobilestyle="widthOrigin"><img decoding="async" src="https://blog.kakaocdn.net/dn/piDAn/btsJEjVgagn/4I4snJQCRLpWL10yi1OBXk/img.jpg" data-height="563" data-width="886" data-lazy-src="" data-origin-width="966" data-origin-height="615" data-is-animation="false" loading="lazy" alt="img" title="부동산 매물 정보 수집하기 - 부동산 데이터 네이버 부동산 크롤링 및 가공 #1 31"></figure>
</div>
<div>
<p id="SE-F5057863-6C9B-467E-A914-7954491FE61E" style="color: #000000; text-align: var(--se-image-default-caption-text-align);"><span style="color: #555555;">PC환경</span></p>
</div>
</div>
</div>
</div>
<div id="SE-a55f1b6b-e89f-465c-a428-6bafdab2e902" style="background-color: #f7f7f7; color: #777777; text-align: left;">
<div>
<div>
<div>
<figure data-ke-type="image" data-ke-style="alignCenter" data-ke-mobilestyle="widthOrigin"><img decoding="async" src="https://blog.kakaocdn.net/dn/b9T632/btsJDcb3WhG/Gvbudr4UH8bpHxiYGufkJ0/img.jpg" data-height="632" data-width="886" data-lazy-src="" data-origin-width="966" data-origin-height="691" data-is-animation="false" loading="lazy" alt="img" title="부동산 매물 정보 수집하기 - 부동산 데이터 네이버 부동산 크롤링 및 가공 #1 32"></figure>
</div>
<div>
<p id="SE-86964DA9-18AE-417C-940E-E5A8420DD101" style="color: #000000; text-align: var(--se-image-default-caption-text-align);"><span style="color: #555555;">모바일환경</span></p>
</div>
</div>
</div>
</div>
<p>특정 아파트 단지의 매물 정보 가져오기</p>
<p style="background-color: #ffffff; color: #0d0d0d; text-align: start;">아래 이미지에서는 <a href="http://m.land.naver.com에">http://m.land.naver.com에</a> 접속하여 &#8216;상암월드컵파크4단지&#8217;의 매물과 관련된 정보를 보여준다. 여기서 중요한 요소는 아파트 단지의 고유 식별자인 &#8216;23620&#8217;과 거래 방식을 나타내는 코드 &#8216;A1:B1:B2 &#8216;입니다. 각 코드의 의미는 A1은 매매, B1은 전세, B2는 월세, 그리고 B3는 단기임대에 해당합니다.</p>
<p style="background-color: #ffffff; color: #0d0d0d; text-align: start;">예를 들어, 다음 주소에서 매물 정보를 확인할 수 있습니다.다<a href="https://m.land.naver.com/complex/info/23620?tradTpCd=A1:B1:B2:B3&amp;ptpNo=1&amp;bildNo=&amp;articleListYN=Y" target="_blank" rel="noopener">https://m.land.naver.com/complex/info/23620?tradTpCd=A1:B1:B2:B3&amp;ptpNo=1&amp;bildNo=&amp;articleListYN=Y</a></p>
<p>특정단지의 매물값을 가져오는 코드를 다시 작성해보면 아래와 같습니다.</p>
<pre id="code_1726351819860" class="bash hljs" contenteditable="false" data-ke-language="bash" data-ke-type="codeblock">import requests
import json
import pandas as pd

URL = <span class="hljs-string">"https://m.land.naver.com/complex/getComplexArticleList"</span>

parameter = {
    <span class="hljs-string">'hscpNo'</span>: <span class="hljs-string">'23620'</span>, <span class="hljs-comment"># 상암월드컵파크4단지 고유번호</span>
    <span class="hljs-string">'tradTpCd'</span>: <span class="hljs-string">'A1:B1:B2'</span>, <span class="hljs-comment"># 거래방식 3가지</span>
    <span class="hljs-string">'order'</span>: <span class="hljs-string">'spc_'</span>, <span class="hljs-comment"># 면적별 정열</span>
}

header = {
    <span class="hljs-string">'User-Agent'</span>: <span class="hljs-string">'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 Edg/112.0.1722.39'</span>,
    <span class="hljs-string">'Referer'</span>: <span class="hljs-string">'https://m.land.naver.com/'</span>
}

page = 0
lands = []

<span class="hljs-keyword">while</span> True:
    page = page + 1
    parameter[<span class="hljs-string">'page'</span>] = page

    response = requests.get(URL, params=parameter, headers=header)
    <span class="hljs-keyword">if</span> response.status_code != 200:
        <span class="hljs-built_in">print</span>(<span class="hljs-string">'invalid status: %d'</span> % response.status_code)
        <span class="hljs-built_in">break</span>

    data = json.loads(response.text)
    result = data[<span class="hljs-string">'result'</span>]
    <span class="hljs-keyword">if</span> result is None:
        <span class="hljs-built_in">print</span>(<span class="hljs-string">'no result'</span>)
        <span class="hljs-built_in">break</span>
    
    <span class="hljs-keyword">for</span> item <span class="hljs-keyword">in</span> result[<span class="hljs-string">'list'</span>]:
        lands.append([item[<span class="hljs-string">'tradTpNm'</span>], item[<span class="hljs-string">'bildNm'</span>], item[<span class="hljs-string">'flrInfo'</span>], item[<span class="hljs-string">'prcInfo'</span>], item[<span class="hljs-string">'spc1'</span>]])
    
    <span class="hljs-keyword">if</span> result[<span class="hljs-string">'moreDataYn'</span>] == <span class="hljs-string">'N'</span>:
        <span class="hljs-built_in">break</span>
<span class="hljs-built_in">print</span>(pd.DataFrame(lands))</pre>
<div id="SE-75bc509e-e497-4245-9e4c-e9b932f1248d" style="background-color: #f7f7f7; color: #777777; text-align: left;">
<div>
<div>
<div>
<figure data-ke-type="image" data-ke-style="alignCenter" data-ke-mobilestyle="widthOrigin"><img decoding="async" src="https://blog.kakaocdn.net/dn/nhjI8/btsJDv92amU/Y1GwjB0SlVeUmAAkjCmBB0/img.jpg" data-height="1001" data-width="886" data-lazy-src="" data-origin-width="792" data-origin-height="895" data-is-animation="false" loading="lazy" alt="img" title="부동산 매물 정보 수집하기 - 부동산 데이터 네이버 부동산 크롤링 및 가공 #1 33"></figure>
</div>
</div>
</div>
</div>
<div id="SE-71890684-4379-48e9-ac90-9757a8b0f2d5" style="background-color: #f7f7f7; color: #777777; text-align: left;">
<div>
<div>
<div>
<figure data-ke-type="image" data-ke-style="alignCenter" data-ke-mobilestyle="widthOrigin"><img decoding="async" src="https://blog.kakaocdn.net/dn/2QTjm/btsJDopKzg8/fpaGyMkpsBo2FhV7ueKNvk/img.jpg" data-height="820" data-width="641" data-lazy-src="" data-origin-width="641" data-origin-height="820" data-is-animation="false" loading="lazy" alt="img" title="부동산 매물 정보 수집하기 - 부동산 데이터 네이버 부동산 크롤링 및 가공 #1 34"></figure>
</div>
</div>
</div>
</div>
<p>다음편에서는 각 아파트별 정보를 얻을 수 있는 파이썬 코드를 알아보도록 하겠습니다.</p>
<!-- CONTENT END 14 -->
]]></content:encoded>
					
		
		
		<media:content url="https://2days.kr/wp-content/uploads/2024/09/부동산-매물-정보-수집하기-부동산-데이터-크롤링-및-가공-1.png" medium="image"></media:content>
            	</item>
		<item>
		<title>파이썬 부동산 매매가 조회 프로그램 만들기 4편 (전국 데이터)</title>
		<link>https://2days.kr/14/09/14/56529/it/program/</link>
		
		<dc:creator><![CDATA[urjent]]></dc:creator>
		<pubDate>Sat, 14 Sep 2024 05:33:20 +0000</pubDate>
				<category><![CDATA[program]]></category>
		<category><![CDATA[API키발급]]></category>
		<category><![CDATA[API활용]]></category>
		<category><![CDATA[개발자]]></category>
		<category><![CDATA[공공API]]></category>
		<category><![CDATA[공공데이터]]></category>
		<category><![CDATA[공공데이터포털]]></category>
		<category><![CDATA[데이터분석]]></category>
		<category><![CDATA[데이터수집]]></category>
		<category><![CDATA[매매가조회]]></category>
		<category><![CDATA[매물조회]]></category>
		<category><![CDATA[부동산]]></category>
		<category><![CDATA[부동산분석]]></category>
		<category><![CDATA[부동산시세]]></category>
		<category><![CDATA[부동산시장]]></category>
		<category><![CDATA[부동산자동화]]></category>
		<category><![CDATA[부동산정보]]></category>
		<category><![CDATA[시세분석]]></category>
		<category><![CDATA[시세조회]]></category>
		<category><![CDATA[실거래가조회]]></category>
		<category><![CDATA[실거래조회]]></category>
		<category><![CDATA[실거래조회기]]></category>
		<category><![CDATA[아파트매매]]></category>
		<category><![CDATA[연립다세대]]></category>
		<category><![CDATA[자동화프로그램]]></category>
		<category><![CDATA[주택매매]]></category>
		<category><![CDATA[주택시세]]></category>
		<category><![CDATA[주택정보]]></category>
		<category><![CDATA[파이썬]]></category>
		<category><![CDATA[파이썬개발]]></category>
		<category><![CDATA[파이썬프로그래밍]]></category>
		<category><![CDATA[파이썬프로젝트]]></category>
		<guid isPermaLink="false">https://2days.kr/?p=56529</guid>

					<description><![CDATA[파이썬 부동산 매매가 조회 프로그램 만들기 4편 (전국 데이터) ㅣ 서울 부동산 매매가를 조회하는 메소드가 잘 동작하는 것을 알았으니, 다 되었습니다. 약간 구조를 바꾸어서 서울 이외 지역의 부동산 매매가를 조회하는 메소드를 만들어보겠습니다. 파이썬 부동산 매매가 조회 프로그램 만들기 4편 (전국 데이터) 파이썬 부동산 매매가 조회 프로그램 만들기 4편 (전국 데이터) 2024.09.14 &#8211; [부동산/자동화 프로젝트] &#8211; 파이썬 부동산 매매가 조회 프로그램 만들기 1편 2024.09.14 [&#8230;]]]></description>
										<content:encoded><![CDATA[<p data-ke-size="size16">파이썬 부동산 매매가 조회 프로그램 만들기 4편 (전국 데이터) ㅣ 서울 부동산 매매가를 조회하는 메소드가 잘 동작하는 것을 알았으니, 다 되었습니다. 약간 구조를 바꾸어서 서울 이외 지역의 부동산 매매가를 조회하는 메소드를 만들어보겠습니다.</p>
<h3 data-ke-size="size23">파이썬 부동산 매매가 조회 프로그램 만들기 4편 (전국 데이터)</h3>
<figure data-ke-type="image" data-ke-style="alignCenter" data-ke-mobilestyle="widthOrigin">
<p><figure style="width: 2560px" class="wp-caption alignnone"><img decoding="async" src="https://blog.kakaocdn.net/dn/EeSAh/btsJDGpV2LI/0xKbiFscc7zjjRkUvFflS0/img.png" alt="파이썬 부동산 매매가 조회 프로그램 만들기 4편 (전국 데이터)" width="2560" height="2560" data-origin-width="2560" data-origin-height="2560" data-filename="파이썬 부동산 매매가 조회 프로그램 만들기 4편 (전국 데이터).png" data-is-animation="false" loading="lazy" data-origin- title="파이썬 부동산 매매가 조회 프로그램 만들기 4편 (전국 데이터) 39"><figcaption class="wp-caption-text">파이썬 부동산 매매가 조회 프로그램 만들기 4편 (전국 데이터)</figcaption></figure><figcaption>파이썬 부동산 매매가 조회 프로그램 만들기 4편 (전국 데이터)</figcaption></figure><div class='code-block code-block-2' style='margin: 8px auto; text-align: center; display: block; clear: both;'>
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8940400388075870"
     crossorigin="anonymous"></script>
<!-- 중간 -->
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-8940400388075870"
     data-ad-slot="8794586137"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></div>

<p data-ke-size="size16"><a href="https://aboda.kr/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%B6%80%EB%8F%99%EC%82%B0-%EB%A7%A4%EB%A7%A4%EA%B0%80-%EC%A1%B0%ED%9A%8C-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EB%A7%8C%EB%93%A4%EA%B8%B0-1%ED%8E%B8" target="_blank" rel="noopener">2024.09.14 &#8211; [부동산/자동화 프로젝트] &#8211; 파이썬 부동산 매매가 조회 프로그램 만들기 1편</a></p>
<p data-ke-size="size16"><a style="background-color: #e6f5ff; color: #0070d1; text-align: start;" href="https://aboda.kr/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%B6%80%EB%8F%99%EC%82%B0-%EB%A7%A4%EB%A7%A4%EA%B0%80-%EC%A1%B0%ED%9A%8C-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EB%A7%8C%EB%93%A4%EA%B8%B0-2%ED%8E%B8-%EC%A7%80%EC%97%AD%EC%BD%94%EB%93%9C" target="_blank" rel="noopener">2024.09.14 &#8211; [부동산/자동화 프로젝트] &#8211; 파이썬 부동산 매매가 조회 프로그램 만들기 2편 (지역코드)</a></p>
<p data-ke-size="size16"><a href="https://aboda.kr/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%B6%80%EB%8F%99%EC%82%B0-%EB%A7%A4%EB%A7%A4%EA%B0%80-%EC%A1%B0%ED%9A%8C-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EB%A7%8C%EB%93%A4%EA%B8%B0-3%ED%8E%B8-%EC%84%9C%EC%9A%B8%EC%95%84%ED%8C%8C%ED%8A%B8-%EC%BB%AC%EB%9F%BC-%EC%A0%95%EB%A6%AC" target="_blank" rel="noopener">2024.09.14 &#8211; [부동산/자동화 프로젝트] &#8211; 파이썬 부동산 매매가 조회 프로그램 만들기 3편 (서울아파트 컬럼 정리)</a></p>
<h2 id="서울-이외-지역-부동산-매매가를-조회하는-메소드" style="color: #000000; text-align: start;" data-ke-size="size26">서울 이외 지역 부동산 매매가를 조회하는 메소드</h2>
<pre class="bash hljs" style="color: #555555; text-align: start;" contenteditable="false" data-ke-language="bash"><span class="hljs-comment"># 사용자에게 시/도 이름을 입력받습니다.</span>
si_do_name = input(<span class="hljs-string">"시/도를 입력하세요 (예: 서울특별시): "</span>)
si_do_code = converter.get_si_do_code(si_do_name)

<span class="hljs-keyword">if</span> si_do_code is None:
    <span class="hljs-built_in">print</span>(f<span class="hljs-string">"'{si_do_name}'에 해당하는 시/도를 찾을 수 없습니다."</span>)
<span class="hljs-keyword">else</span>:
    <span class="hljs-comment"># 입력받은 시/도에 대한 시/군/구 코드 리스트 가져오기</span>
    sigungu_list = converter.get_sigungu(si_do_code)

    <span class="hljs-comment"># 모든 시/군/구 데이터를 수집할 DataFrame 초기화</span>
    all_data = pd.DataFrame()</pre>
<p style="color: #555555; text-align: start;" data-ke-size="size16">그냥 이전에 문자열로 &#8220;서울&#8221; 로 넣던 부분을 사용자에게 입력받아서 실행하도록 변경하였습니다. 저는 시험을 하기 위해서 충청남도를 검색하니, 충청남도 아파트 값을 잘 읽어 들이네요.</p>
<figure data-ke-type="image" data-ke-style="alignCenter" data-ke-mobilestyle="widthOrigin"><img decoding="async" src="https://blog.kakaocdn.net/dn/AqJpZ/btsJCWmRUCI/gAUkNVPjKJq6270npfCyok/img.png" data-origin-width="2730" data-origin-height="1192" data-filename="스크린샷 2024-09-14 오후 1.06.23.png" data-is-animation="false" loading="lazy" alt="img" title="파이썬 부동산 매매가 조회 프로그램 만들기 4편 (전국 데이터) 40"><figcaption>서울 이외 지역 부동산 매매가를 조회하는 메소드</figcaption></figure>
<h2 id="성남시-빌라매매가-조회해보기" style="color: #000000; text-align: start;" data-ke-size="size26">자동화를 위한 입력시간 제한</h2>
<p style="color: #555555; text-align: start;" data-ke-size="size16">나중에 해당 소스를 자동화하기 위해서 만약 사용자에게 10초 이내 입력값을 받지 못하면, 전국을 조사하도록 코드를 변경합니다.</p>
<pre id="code_1726287064121" class="bash hljs" contenteditable="false" data-ke-language="bash" data-ke-type="codeblock"><span class="hljs-comment"># 사용자에게 시/도를 물어봄</span>
si_do_name = get_user_input(<span class="hljs-string">"시/도를 입력하세요 (10초 이내 입력): "</span>)

<span class="hljs-comment"># 시/도가 제공되지 않았거나 유효하지 않은 경우 전체 데이터 조회</span>
<span class="hljs-keyword">if</span> not si_do_name or si_do_name not <span class="hljs-keyword">in</span> [district[<span class="hljs-string">"si_do_name"</span>] <span class="hljs-keyword">for</span> district <span class="hljs-keyword">in</span> converter.districts]:
    si_do_name = None
    <span class="hljs-built_in">print</span>(<span class="hljs-string">"유효하지 않은 시/도 입력 또는 입력이 없어서 전체 데이터를 조회합니다."</span>)
<span class="hljs-keyword">else</span>:
    <span class="hljs-built_in">print</span>(f<span class="hljs-string">"{si_do_name}에 대한 데이터를 조회합니다."</span>)

<span class="hljs-comment"># 시/도 코드 및 시/군/구 리스트 가져오기</span>
si_do_code = converter.get_si_do_code(si_do_name) <span class="hljs-keyword">if</span> si_do_name <span class="hljs-keyword">else</span> None
sigungu_list = converter.get_sigungu(si_do_code) <span class="hljs-keyword">if</span> si_do_code <span class="hljs-keyword">else</span> [sigungu <span class="hljs-keyword">for</span> district <span class="hljs-keyword">in</span> converter.districts <span class="hljs-keyword">for</span> sigungu <span class="hljs-keyword">in</span> district[<span class="hljs-string">"sigungu"</span>]]

<span class="hljs-comment"># 모든 시/군/구 데이터를 수집할 DataFrame 초기화</span>
all_data = pd.DataFrame()</pre>
<p style="color: #555555; text-align: start;" data-ke-size="size16">이렇게 하면 10초 이내 시/도를 입력하지 않을 경우 전국의 데이터를 조사합니다.</p>

<figure data-ke-type="image" data-ke-style="alignCenter" data-ke-mobilestyle="widthOrigin"><img decoding="async" src="https://blog.kakaocdn.net/dn/VgFLY/btsJDtxxq0e/HkLUFWhtD14IjkeD0fKfi0/img.png" data-origin-width="2638" data-origin-height="918" data-filename="스크린샷 2024-09-14 오후 1.09.50.png" data-is-animation="false" loading="lazy" alt="img" title="파이썬 부동산 매매가 조회 프로그램 만들기 4편 (전국 데이터) 41"><figcaption>파이썬 부동산 매매가 조회 프로그램 만들기 4편 (전국 데이터)</figcaption></figure>
<figure data-ke-type="image" data-ke-style="alignCenter" data-ke-mobilestyle="widthOrigin"><img decoding="async" src="https://blog.kakaocdn.net/dn/ctaQPJ/btsJCXspild/Fk4zCjRW0ApAKJrWZ9Vqr1/img.png" data-origin-width="2678" data-origin-height="1258" data-filename="스크린샷 2024-09-14 오후 1.16.04.png" data-is-animation="false" loading="lazy" alt="img" title="파이썬 부동산 매매가 조회 프로그램 만들기 4편 (전국 데이터) 42"><figcaption>파이썬 부동산 매매가 조회 프로그램 만들기 4편 (전국 데이터)</figcaption></figure>
<p data-ke-size="size16"><span style="color: #555555; text-align: start;">위와 같이 나옵니다.</span><br />
<span style="color: #555555; text-align: start;">코드를 만지면서 중간에 컬럼 제목이 다시 원상태가 되었고, 시/도명이 &#8216;전국&#8217;으로만 표시 되는 문제가 있네요. 그래서 조금 수정하는 겸, 기조회기간도 설정해보도록 하겠습니다. </span>이렇게 서울 이외의 지역에 대해서, 아파트가 아닌 부동산에 대해서 조회해보았습니다.</p>
<figure data-ke-type="image" data-ke-style="alignCenter" data-ke-mobilestyle="widthOrigin"><img decoding="async" src="https://blog.kakaocdn.net/dn/KQNpQ/btsJDZij1jw/4j4S9vKkW9giMwpZZmaA8k/img.png" data-origin-width="2670" data-origin-height="848" data-filename="스크린샷 2024-09-14 오후 2.16.12.png" data-is-animation="false" loading="lazy" alt="img" title="파이썬 부동산 매매가 조회 프로그램 만들기 4편 (전국 데이터) 43"><figcaption>파이썬 부동산 매매가 조회 프로그램 만들기 4편 (전국 데이터)</figcaption></figure>
<figure contenteditable="false" data-ke-type="file" data-ke-align="alignCenter">
<div class="image"></div>
<div class="desc">
<p class="filename"><span class="name">서울특별시_202401_202402_매매</span><span class="type">.csv</span></p>
<p class="size">0.76MB</p>
</div>
</figure>
<p style="color: #555555; text-align: start;" data-ke-size="size16">다음 포스트에서는 필터역할을 해주는 메소드를 만들어서, 매매가 데이터에 대해 필터링을 해보겠습니다.</p>
<pre id="code_1726291033637" class="bash hljs" contenteditable="false" data-ke-language="bash" data-ke-type="codeblock">import json
import os
import pandas as pd
from google.colab import drive
import PublicDataReader as pdr
from PublicDataReader import TransactionPrice
from datetime import datetime

class DistrictConverter:
    def __init__(self):
        self.districts = self.__read_district_file()

    def __read_district_file(self):
        <span class="hljs-comment"># Google 드라이브를 마운트합니다.</span>
        drive.mount(<span class="hljs-string">'/content/drive'</span>)

        <span class="hljs-comment"># 드라이브 내의 JSON 파일 경로를 설정합니다.</span>
        json_file_path = <span class="hljs-string">'/content/drive/MyDrive/district.json'</span>
        
        <span class="hljs-comment"># 파일을 열어서 내용을 읽고 JSON으로 변환합니다.</span>
        with open(json_file_path, <span class="hljs-string">'r'</span>) as f:
            <span class="hljs-built_in">return</span> json.loads(f.read())

    def get_si_do_code(self, si_do_name):
        <span class="hljs-keyword">for</span> district <span class="hljs-keyword">in</span> self.districts:
            <span class="hljs-keyword">if</span> si_do_name == district[<span class="hljs-string">"si_do_name"</span>]:
                <span class="hljs-built_in">return</span> district[<span class="hljs-string">"si_do_code"</span>]

    def get_sigungu(self, si_do_code):
        <span class="hljs-keyword">for</span> district <span class="hljs-keyword">in</span> self.districts:
            <span class="hljs-keyword">if</span> si_do_code == district[<span class="hljs-string">"si_do_code"</span>]:
                <span class="hljs-built_in">return</span> district[<span class="hljs-string">"sigungu"</span>]

def get_user_input(prompt, default_value=None):
    try:
        user_input = input(prompt)
        <span class="hljs-built_in">return</span> user_input <span class="hljs-keyword">if</span> user_input.strip() <span class="hljs-keyword">else</span> default_value
    except EOFError:
        <span class="hljs-built_in">return</span> default_value

<span class="hljs-comment"># 사용자로부터 시/도와 기간을 입력 받음</span>
si_do_name = get_user_input(<span class="hljs-string">"시/도를 입력하세요 (예: 서울특별시) 또는 '전국' 입력: "</span>, <span class="hljs-string">"전국"</span>)
start_year_month = get_user_input(<span class="hljs-string">"조회 시작 년월 (YYYYMM 형식, 예: 202301): "</span>, None)
end_year_month = get_user_input(<span class="hljs-string">"조회 종료 년월 (YYYYMM 형식, 예: 202312): "</span>, None)

<span class="hljs-comment"># 현재 날짜를 기준으로 기간을 설정</span>
now = datetime.now()
current_year_month = now.strftime(<span class="hljs-string">"%Y%m"</span>)

<span class="hljs-comment"># 기간을 설정합니다.</span>
<span class="hljs-keyword">if</span> not start_year_month:
    start_year_month = f<span class="hljs-string">"{now.year}01"</span>
<span class="hljs-keyword">if</span> not end_year_month:
    end_year_month = current_year_month

<span class="hljs-comment"># DistrictConverter 인스턴스 생성</span>
converter = DistrictConverter()

<span class="hljs-comment"># 서울특별시와 모든 시/군/구 데이터를 수집할 DataFrame 초기화</span>
all_data = pd.DataFrame()

<span class="hljs-comment"># 전체 시/도 조사</span>
<span class="hljs-keyword">if</span> si_do_name == <span class="hljs-string">"전국"</span>:
    <span class="hljs-keyword">for</span> district <span class="hljs-keyword">in</span> converter.districts:
        si_do_code = district[<span class="hljs-string">"si_do_code"</span>]
        sigungu_list = district[<span class="hljs-string">"sigungu"</span>]
        <span class="hljs-keyword">for</span> sigungu <span class="hljs-keyword">in</span> sigungu_list:
            sigungu_code = sigungu[<span class="hljs-string">"sigungu_code"</span>]
            sigungu_name = sigungu[<span class="hljs-string">"sigungu_name"</span>]

            <span class="hljs-built_in">print</span>(f<span class="hljs-string">"Processing data for {sigungu_name} ({sigungu_code})"</span>)

            <span class="hljs-comment"># 부동산 데이터를 가져옴</span>
            df = api.get_data(
                property_type=<span class="hljs-string">"아파트"</span>,
                trade_type=<span class="hljs-string">"매매"</span>,
                sigungu_code=sigungu_code,
                start_year_month=start_year_month,
                end_year_month=end_year_month
            )

            <span class="hljs-comment"># 시/군/구 이름 및 시/도 이름을 새로운 컬럼으로 추가</span>
            df[<span class="hljs-string">"sigungu_name"</span>] = sigungu_name
            df[<span class="hljs-string">"si_do_name"</span>] = district[<span class="hljs-string">"si_do_name"</span>]

            <span class="hljs-comment"># 가져온 데이터를 all_data에 추가</span>
            all_data = pd.concat([all_data, df], ignore_index=True)
<span class="hljs-keyword">else</span>:
    si_do_code = converter.get_si_do_code(si_do_name)
    sigungu_list = converter.get_sigungu(si_do_code)

    <span class="hljs-keyword">for</span> sigungu <span class="hljs-keyword">in</span> sigungu_list:
        sigungu_code = sigungu[<span class="hljs-string">"sigungu_code"</span>]
        sigungu_name = sigungu[<span class="hljs-string">"sigungu_name"</span>]

        <span class="hljs-built_in">print</span>(f<span class="hljs-string">"Processing data for {sigungu_name} ({sigungu_code})"</span>)

        <span class="hljs-comment"># 부동산 데이터를 가져옴</span>
        df = api.get_data(
            property_type=<span class="hljs-string">"아파트"</span>,
            trade_type=<span class="hljs-string">"매매"</span>,
            sigungu_code=sigungu_code,
            start_year_month=start_year_month,
            end_year_month=end_year_month
        )

        <span class="hljs-comment"># 시/군/구 이름 및 시/도 이름을 새로운 컬럼으로 추가</span>
        df[<span class="hljs-string">"sigungu_name"</span>] = sigungu_name
        df[<span class="hljs-string">"si_do_name"</span>] = si_do_name

        <span class="hljs-comment"># 가져온 데이터를 all_data에 추가</span>
        all_data = pd.concat([all_data, df], ignore_index=True)

<span class="hljs-comment"># 데이터 열 이름을 한국어로 변환</span>
columns_to_select = {
    <span class="hljs-string">"si_do_name"</span>: <span class="hljs-string">"시도"</span>,
    <span class="hljs-string">"sigungu_name"</span>: <span class="hljs-string">"시군구"</span>,
    <span class="hljs-string">"umdNm"</span>: <span class="hljs-string">"법정동"</span>,
    <span class="hljs-string">"roadNm"</span>: <span class="hljs-string">"도로명"</span>,
    <span class="hljs-string">"bonbun"</span>: <span class="hljs-string">"지번"</span>,
    <span class="hljs-string">"aptNm"</span>: <span class="hljs-string">"아파트"</span>,
    <span class="hljs-string">"buildYear"</span>: <span class="hljs-string">"건축년도"</span>,
    <span class="hljs-string">"excluUseAr"</span>: <span class="hljs-string">"전용면적"</span>,
    <span class="hljs-string">"floor"</span>: <span class="hljs-string">"층"</span>,
    <span class="hljs-string">"dealYear"</span>: <span class="hljs-string">"거래년도"</span>,
    <span class="hljs-string">"dealMonth"</span>: <span class="hljs-string">"거래월"</span>,
    <span class="hljs-string">"dealDay"</span>: <span class="hljs-string">"거래일"</span>,
    <span class="hljs-string">"dealAmount"</span>: <span class="hljs-string">"거래금액"</span>,
    <span class="hljs-string">"aptSeq"</span>: <span class="hljs-string">"일련번호"</span>,
    <span class="hljs-string">"dealingGbn"</span>: <span class="hljs-string">"거래유형"</span>,
    <span class="hljs-string">"estateAgentSggNm"</span>: <span class="hljs-string">"중개사소재지"</span>,
    <span class="hljs-string">"cdealType"</span>: <span class="hljs-string">"해제여부"</span>,
    <span class="hljs-string">"cdealDay"</span>: <span class="hljs-string">"해제사유발생일"</span>
}

<span class="hljs-comment"># 필요한 열만 남기고 한국어 열 이름으로 변경</span>
selected_data = all_data.rename(columns=columns_to_select)[list(columns_to_select.values())]

<span class="hljs-comment"># 파일명을 규칙적으로 지정</span>
file_name = f<span class="hljs-string">'{si_do_name if si_do_name != "전국" else "전체"}_{start_year_month}_{end_year_month}_매매.csv'</span>.replace(<span class="hljs-string">" "</span>, <span class="hljs-string">""</span>)
csv_path = f<span class="hljs-string">'/content/drive/MyDrive/{file_name}'</span>

<span class="hljs-comment"># 필요한 열만 남긴 데이터를 CSV 파일로 저장 (utf-8-sig 인코딩으로 저장)</span>
selected_data.to_csv(csv_path, index=False, encoding=<span class="hljs-string">'utf-8-sig'</span>)

<span class="hljs-comment"># 파일 저장 후, 선택된 데이터의 일부를 출력하여 확인</span>
<span class="hljs-built_in">print</span>(selected_data.head())</pre>
<p><a href="https://2days.kr/14/09/08/56521/coding/data/">파이썬 부동산 매매가 조회 프로그램 만들기 2편 (지역코드)</a></p>
<p><a href="https://2days.kr/14/09/12/56525/coding/data/">파이썬 부동산 매매가 조회 프로그램 만들기 3편 (서울아파트 컬럼 정리)</a></p>
<!-- CONTENT END 16 -->
]]></content:encoded>
					
		
		
		<media:content url="https://2days.kr/wp-content/uploads/2024/09/파이썬-부동산-매매가-조회-프로그램-만들기-4편-전국-데이터.png" medium="image"></media:content>
            	</item>
		<item>
		<title>파이썬 부동산 매매가 조회 프로그램 만들기 3편 (서울아파트 컬럼 정리)</title>
		<link>https://2days.kr/14/09/12/56525/it/program/</link>
		
		<dc:creator><![CDATA[urjent]]></dc:creator>
		<pubDate>Sat, 14 Sep 2024 03:44:50 +0000</pubDate>
				<category><![CDATA[program]]></category>
		<category><![CDATA[API키발급]]></category>
		<category><![CDATA[API활용]]></category>
		<category><![CDATA[개발자]]></category>
		<category><![CDATA[공공API]]></category>
		<category><![CDATA[공공데이터]]></category>
		<category><![CDATA[공공데이터포털]]></category>
		<category><![CDATA[데이터분석]]></category>
		<category><![CDATA[데이터수집]]></category>
		<category><![CDATA[매매가조회]]></category>
		<category><![CDATA[매물조회]]></category>
		<category><![CDATA[부동산]]></category>
		<category><![CDATA[부동산분석]]></category>
		<category><![CDATA[부동산시세]]></category>
		<category><![CDATA[부동산시장]]></category>
		<category><![CDATA[부동산자동화]]></category>
		<category><![CDATA[부동산정보]]></category>
		<category><![CDATA[시세분석]]></category>
		<category><![CDATA[시세조회]]></category>
		<category><![CDATA[실거래가조회]]></category>
		<category><![CDATA[실거래조회]]></category>
		<category><![CDATA[실거래조회기]]></category>
		<category><![CDATA[아파트매매]]></category>
		<category><![CDATA[연립다세대]]></category>
		<category><![CDATA[자동화프로그램]]></category>
		<category><![CDATA[주택매매]]></category>
		<category><![CDATA[주택시세]]></category>
		<category><![CDATA[주택정보]]></category>
		<category><![CDATA[파이썬]]></category>
		<category><![CDATA[파이썬개발]]></category>
		<category><![CDATA[파이썬프로그래밍]]></category>
		<category><![CDATA[파이썬프로젝트]]></category>
		<guid isPermaLink="false">https://2days.kr/?p=56525</guid>

					<description><![CDATA[파이썬 부동산 매매가 조회 프로그램 만들기 3편 (서울아파트 컬럼 정리) ㅣ 저번 포스트에서는 지역 구분별 코드를 컨버팅해주는 클래스를 만들어보았습니다. 이번 포스트에서는 일단 라이브러리를 이용해서 추출을 한다음에 어떤 컬럼이 필요한지, 필요없는지, 추가해야할 데이터는 무엇이 있을지 생각해보고 추가해서 정제한다음, 대표적으로 서울 아파트 매매가를 조회해보겠습니다. 파이썬 부동산 매매가 조회 프로그램 만들기 3편 (서울아파트 컬럼 정리) 파이썬 부동산 매매가 조회 프로그램 만들기 3편 (서울아파트 컬럼 정리) 해당 포스팅은 [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>파이썬 부동산 매매가 조회 프로그램 만들기 3편 (서울아파트 컬럼 정리) ㅣ 저번 포스트에서는 지역 구분별 코드를 컨버팅해주는 클래스를 만들어보았습니다. 이번 포스트에서는 일단 라이브러리를 이용해서 추출을 한다음에 어떤 컬럼이 필요한지, 필요없는지, 추가해야할 데이터는 무엇이 있을지 생각해보고 추가해서 정제한다음, 대표적으로 서울 아파트 매매가를 조회해보겠습니다.</p>
<h3 data-ke-size="size23"><b>파이썬 부동산 매매가 조회 프로그램 만들기 3편 (서울아파트 컬럼 정리)</b></h3>
<figure data-ke-type="image" data-ke-mobilestyle="widthOrigin" data-ke-style="alignCenter">
<p><figure style="width: 2560px" class="wp-caption alignnone"><img decoding="async" src="https://blog.kakaocdn.net/dn/bNuJrP/btsJCJVvPkl/XPmdmQDRwPqAK4S3kIC9o1/img.png" alt="파이썬 부동산 매매가 조회 프로그램 만들기 3편 (서울아파트 컬럼 정리)" width="2560" height="2560" data-origin-width="2560" data-origin-height="2560" data-is-animation="false" data-filename="파이썬 부동산 매매가 조회 프로그램 만들기 3편 (서울아파트 컬럼 정리).png" loading="lazy" data-origin- title="파이썬 부동산 매매가 조회 프로그램 만들기 3편 (서울아파트 컬럼 정리) 46"><figcaption class="wp-caption-text">파이썬 부동산 매매가 조회 프로그램 만들기 3편 (서울아파트 컬럼 정리)</figcaption></figure><figcaption>파이썬 부동산 매매가 조회 프로그램 만들기 3편 (서울아파트 컬럼 정리)</figcaption></figure><div class='code-block code-block-2' style='margin: 8px auto; text-align: center; display: block; clear: both;'>
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8940400388075870"
     crossorigin="anonymous"></script>
<!-- 중간 -->
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-8940400388075870"
     data-ad-slot="8794586137"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></div>

<p>해당 포스팅은 1편, 2편에 이은 3편이므로 1,2편을 보지 않으신 분들은 먼저 포스팅을 보고 오세요!</p>
<p><a href="https://2days.kr/14/09/06/56517/coding/data/">파이썬 부동산 매매가 조회 프로그램 만들기 1편</a></p>
<p><a href="https://2days.kr/14/09/08/56521/coding/data/">파이썬 부동산 매매가 조회 프로그램 만들기 2편 (지역코드)</a></p>
<h2 id="라이브러리-이용해서-한-번-추출해보기" style="color: #000000; text-align: start;">라이브러리 이용해서 한 번 추출해보기</h2>
<p style="color: #555555; text-align: start;">일단 라이브러리를 이용해서 결과물이 어떻게 나오는지 한 번 보겠습니다. 저번 포스트에서 말씀드린 것 처럼, 저는 구글 코랩을 이용하고 있습니다.</p>
<p><a href="https://github.com/WooilJeong/PublicDataReader" target="_blank" rel="noopener noreferrer noopener">https://github.com/WooilJeong/PublicDataReader</a></p>
<p style="color: #555555; text-align: start;">제가 원하는건 특정 월의 매매데이터라서, read_data() 메소드를 이용해보겠습니다. 파라미터로는 매물의 종류, 거래유형, 시군구코드, 거래가 발생한 연도와 달을 넘겨주고 실행해봅니다.</p>
<p style="color: #555555; text-align: start;">그러면 아래와 같이 결과값이 출력됩니다. 일단 print문으로 에러가 있는 api들에 대해 알려주네요. 에러가 있는 서비스들은 따로 제가 조회신청을 하지 않았기 때문에 에러출력되는 것이 당연합니다.</p>
<figure data-ke-type="image" data-ke-mobilestyle="widthOrigin" data-ke-style="alignCenter"><img decoding="async" src="https://blog.kakaocdn.net/dn/80pcc/btsJEELugdf/yYvKWUGoBkK44hR3MSgijK/img.png" data-is-animation="false" data-origin-width="2668" data-origin-height="626" data-filename="스크린샷 2024-09-14 오후 12.21.49.png" loading="lazy" alt="img" title="파이썬 부동산 매매가 조회 프로그램 만들기 3편 (서울아파트 컬럼 정리) 47"><figcaption>파이썬 부동산 매매가 조회 프로그램 만들기 3편 (서울아파트 컬럼 정리)</figcaption></figure>
<p>이름설명데이터 타입샘플 데이터항목구분</p>
<table style="background-color: #ffffff; color: #212121; text-align: start; border-collapse: collapse; width: 100%;" border="1" data-ke-align="alignLeft">
<tbody>
<tr>
<td>property_type</td>
<td>부동산 유형<br />
(아파트, 오피스텔, 단독다가구, 연립다세대, 토지, 분양입주권, 공장창고등)</td>
<td>String</td>
<td>아파트</td>
<td>필수</td>
</tr>
<tr>
<td>trade_type</td>
<td>거래 유형<br />
(매매, 전월세)</td>
<td>String</td>
<td>매매</td>
<td>필수</td>
</tr>
<tr>
<td>sigungu_code</td>
<td>시군구의 5자리 지역코드<br />
(서울 서초구: 11650, 경기 성남 분당구: 41135)</td>
<td>String</td>
<td>11650</td>
<td>필수</td>
</tr>
<tr>
<td>year_month</td>
<td>조회 년월 (단일 월 조회 시 필수)<br />
(2023년 1월: 202301)<br />
※ start_year_month와 end_year_month 모두 입력 시 기간 내 조회가 실행됨</td>
<td>String</td>
<td>202301</td>
<td>조건부 필수</td>
</tr>
<tr>
<td>start_year_month</td>
<td>조회 시작 년월 (기간 내 조회 시 필수)<br />
(2022년 1월 202201)</td>
<td>String</td>
<td>202201</td>
<td>조건부 필수</td>
</tr>
<tr>
<td>end_year_month</td>
<td>조회 종료 년월 (기간 내 조회 시 필수)<br />
(2022년 12월: 202212)</td>
<td>String</td>
<td>202212</td>
<td>조건부 필수</td>
</tr>
<tr>
<td>verbose</td>
<td>데이터 조회 진행 상황 메시지 출력 여부<br />
(출력: True, 미출력: False)<br />
※ 기본값: False</td>
<td>Boolean</td>
<td>True</td>
<td>선택</td>
</tr>
</tbody>
</table>
<ul style="list-style-type: disc; color: #555555; text-align: start;" data-ke-list-type="disc">
<li style="list-style-type: inherit; color: #666666;">지역코드</li>
<li style="list-style-type: inherit; color: #666666;">도로명</li>
<li style="list-style-type: inherit; color: #666666;">법정동</li>
<li style="list-style-type: inherit; color: #666666;">지번</li>
<li style="list-style-type: inherit; color: #666666;">아파트</li>
<li style="list-style-type: inherit; color: #666666;">건축년도</li>
<li style="list-style-type: inherit; color: #666666;">층</li>
<li style="list-style-type: inherit; color: #666666;">전용면적</li>
<li style="list-style-type: inherit; color: #666666;">년</li>
<li style="list-style-type: inherit; color: #666666;">월</li>
<li style="list-style-type: inherit; color: #666666;">일</li>
<li style="list-style-type: inherit; color: #666666;">거래금액 (만원단위)</li>
<li style="list-style-type: inherit; color: #666666;">도로명건물본번호코드</li>
<li style="list-style-type: inherit; color: #666666;">도로명건물부번호코드</li>
<li style="list-style-type: inherit; color: #666666;">도로명시군구코드</li>
<li style="list-style-type: inherit; color: #666666;">도로명일련번호코드</li>
<li style="list-style-type: inherit; color: #666666;">도로명지상지하코드</li>
<li style="list-style-type: inherit; color: #666666;">도로명코드</li>
<li style="list-style-type: inherit; color: #666666;">법정동본번코드</li>
<li style="list-style-type: inherit; color: #666666;">법정동부번코드</li>
<li style="list-style-type: inherit; color: #666666;">법정동시군구코드</li>
<li style="list-style-type: inherit; color: #666666;">법정동지번코드</li>
<li style="list-style-type: inherit; color: #666666;">일련번호</li>
<li style="list-style-type: inherit; color: #666666;">거래유형</li>
<li style="list-style-type: inherit; color: #666666;">중개사소재지</li>
<li style="list-style-type: inherit; color: #666666;">해제사유발생일</li>
<li style="list-style-type: inherit; color: #666666;">해제여부</li>
</ul>
<p style="color: #555555; text-align: start;">전체 컬럼은 위와 같습니다. 꽤 많기도하고&#8230; 숫자코드만 있어서 얼핏보면 이게 뭘 의미하는지 모르는 내용들도 많습니다. 그래서 필요한 컬럼들은 제외하고 뺄껀 빼주고, 여기서 추가되어야할 컬럼이 있으면 추가작업을 해주어야합니다.</p>
<h2 id="서울아파트-매매가-조회해보기" style="color: #000000; text-align: start;">서울아파트 매매가 조회해보기</h2>
<p style="color: #555555; text-align: start;">일단 처음으로는 서울 모든 구의 아파트 매매가를 조회해보는 것으로 시작하겠습니다.</p>

<h3 id="라이브러리를-이용한-api연결" style="color: #000000; text-align: start;">라이브러리를 이용한 API연결</h3>
<p style="color: #555555; text-align: start;">일단 파일의 제일 윗부분에는 필요한 다른 파일들을 import하고, 컨버터의 객체생성과 함께 API연결을 선언합니다.</p>
<pre class="bash hljs" style="color: #555555; text-align: start;" contenteditable="false" data-ke-language="bash">import json
import os
import pandas as pd
from google.colab import drive
import PublicDataReader as pdr
from PublicDataReader import TransactionPrice
api = pdr.TransactionPrice(service_key)

class DistrictConverter:
    def __init__(self):
        self.districts = self.__read_district_file()

    def __read_district_file(self):
        <span class="hljs-comment"># Google 드라이브를 마운트합니다.</span>
        drive.mount(<span class="hljs-string">'/content/drive'</span>)

        <span class="hljs-comment"># 드라이브 내의 JSON 파일 경로를 설정합니다.</span>
        json_file_path = <span class="hljs-string">'/content/drive/MyDrive/district.json'</span>
        
        <span class="hljs-comment"># 파일을 열어서 내용을 읽고 JSON으로 변환합니다.</span>
        with open(json_file_path, <span class="hljs-string">'r'</span>) as f:
            <span class="hljs-built_in">return</span> json.loads(f.read())

    def get_si_do_code(self, si_do_name):
        <span class="hljs-keyword">for</span> district <span class="hljs-keyword">in</span> self.districts:
            <span class="hljs-keyword">if</span> si_do_name == district[<span class="hljs-string">"si_do_name"</span>]:
                <span class="hljs-built_in">return</span> district[<span class="hljs-string">"si_do_code"</span>]

    def get_sigungu(self, si_do_code):
        <span class="hljs-keyword">for</span> district <span class="hljs-keyword">in</span> self.districts:
            <span class="hljs-keyword">if</span> si_do_code == district[<span class="hljs-string">"si_do_code"</span>]:
                <span class="hljs-built_in">return</span> district[<span class="hljs-string">"sigungu"</span>]</pre>
<h3 id="입력받은-시군구-리스트에-대해서-매매가-조회하는-메소드-만들기" style="color: #000000; text-align: start;">입력받은 시군구 리스트에 대해서 매매가 조회하는 메소드 만들기</h3>
<p style="color: #555555; text-align: start;">이전 포스트와, 본 포스트 상단에 라이브러리로 넘기는 파라미터에서 보이듯이, 조회는 시군구 코드를 기준으로 조회하는데요 조회하고자하는 시군구가 여러개 일 수 있으므로, 시군구 데이터를 리스트로 받아 반복문을 돌리며 조회하는 메소드를 만듭니다.</p>
<p style="color: #555555; text-align: start;">이 때, API를 조회한 데이터에는 이것이 어떤 시/도의, 어떤 시군구의 데이터인지는 알 수 없습니다. 표시되는 것은 도로명과 읍면동 단위의 데이터만 한글로 나옵니다. (아마도 시군구코드를 넣어서 조회하는 것으로 보아, 조회할 때 이미 어떤 지역인지를 콕 찝어서 조회한다는 유저시나리오를 바탕으로 설계되어있는 것 같습니다.)</p>
<p style="color: #555555; text-align: start;">따라서, 우리가 결과물을 받아서 어디 데이터인지를 알기 위해서는 시/도 이름과, 시군구이름도 같이 표기되어야 알기 쉽습니다.</p>
<pre class="bash hljs" style="color: #555555; text-align: start;" contenteditable="false" data-ke-language="bash"><span class="hljs-comment"># DistrictConverter 인스턴스 생성</span>
converter = DistrictConverter()

<span class="hljs-comment"># 서울특별시 시/군/구 코드 리스트 가져오기</span>
si_do_name = <span class="hljs-string">"서울특별시"</span>
si_do_code = converter.get_si_do_code(si_do_name)
sigungu_list = converter.get_sigungu(si_do_code)

<span class="hljs-comment"># 모든 시/군/구 데이터를 수집할 DataFrame 초기화</span>
all_data = pd.DataFrame()

<span class="hljs-comment"># 각 시/군/구 코드에 대해 데이터를 가져오고 시/군/구 이름 추가</span>
<span class="hljs-keyword">for</span> sigungu <span class="hljs-keyword">in</span> sigungu_list:
    sigungu_code = sigungu[<span class="hljs-string">"sigungu_code"</span>]
    sigungu_name = sigungu[<span class="hljs-string">"sigungu_name"</span>]

    <span class="hljs-built_in">print</span>(f<span class="hljs-string">"Processing data for {sigungu_name} ({sigungu_code})"</span>)</pre>
<p style="color: #555555; text-align: start;">파라미터로 시/도 이름, 시군구 데이터가 담긴 리스트, 매물종류, 거래종류, 거래년월 6자리를 받습니다. 이후 시군구리스트에 대해 반복문을 돌아가며 조회를 시작합니다.</p>
<p style="color: #555555; text-align: start;">조회한 데이터 data 에 대해, 위에서 말씀드린대로 시도 이름과 시군구 이름이 기재된 컬럼으로 생성해줍니다. sigungu_list 에 데이터 하나하나에는 sigungu_code, sigungu_name, eup_myeon_dong 데이터가 json형태로 들어있습니다. 본 시리즈의 2번째 포스트(지역구분별 코드 먼저 준비하기) 를 확인해주세요.</p>
<p style="color: #555555; text-align: start;">data[&#8220;시군구&#8221;] = sigungu[&#8220;sigungu_name&#8221;]</p>
<p style="color: #555555; text-align: start;">이렇게 시군구 json객체 하나하나에서 시군구이름을 뽑아 컬럼을 하나 만들어줍니다. 그 후에는 기존에 만들었던 시군구 데이터에, 바로 아래에 추가로 데이터를 이어붙여줍니다.</p>
<p style="color: #555555; text-align: start;">df = pd.concat([data, df])</p>
<p style="color: #555555; text-align: start;">이렇게해서 서울의 모든 구의 매매데이터를 하나하나 붙여나갑니다.</p>
<p style="color: #555555; text-align: start;">이 후에, 아까 위에서 만든 전용면적(평) 계산 메소드를 호출해줍니다.<br />
df = caculate_column_data(df)</p>
<p style="color: #555555; text-align: start;">그러고 마지막으로 컬럼이름을 재정의해주고, 추출한 매매데이터를 리턴합니다. 저는 개인적으로 년, 월, 일 컬럼이 조금 알기 어렵다고 생각해서 아래와 같이 수정했습니다.</p>
<pre class="bash hljs" style="color: #555555; text-align: start;" contenteditable="false" data-ke-language="bash"> <span class="hljs-comment"># 부동산 데이터를 가져옴</span>
    df = api.get_data(
        property_type=<span class="hljs-string">"아파트"</span>,
        trade_type=<span class="hljs-string">"매매"</span>,
        sigungu_code=sigungu_code,
        year_month=<span class="hljs-string">"202402"</span>,
    )</pre>
<p style="color: #555555; text-align: start;">본 메소드의 전체 코드는 아래와 같습니다.</p>
<pre class="hljs reasonml" style="color: #555555; text-align: start;" contenteditable="false">def get<span class="hljs-constructor">_data_using_sigungu_list(<span class="hljs-params">si_do_name</span>, <span class="hljs-params">sigungu_list</span>: <span class="hljs-params">list</span>, <span class="hljs-params">product</span>, <span class="hljs-params">transaction</span>, <span class="hljs-params">year_month</span>)</span>:
    df = pd.<span class="hljs-constructor">DataFrame()</span>

    for sigungu <span class="hljs-keyword">in</span> sigungu_list:
        data = get<span class="hljs-constructor">_data_from_portal(<span class="hljs-params">product</span>, <span class="hljs-params">transaction</span>, <span class="hljs-params">sigungu</span>[<span class="hljs-string">"sigungu_code"</span>], <span class="hljs-params">year_month</span>)</span>
        data<span class="hljs-literal">["시도"]</span> = si_do_name
        data<span class="hljs-literal">["시군구"]</span> = sigungu<span class="hljs-literal">["<span class="hljs-identifier">sigungu_name</span>"]</span>
        df = pd.concat(<span class="hljs-literal">[<span class="hljs-identifier">data</span>, <span class="hljs-identifier">df</span>]</span>)

    df = caculate<span class="hljs-constructor">_column_data(<span class="hljs-params">df</span>)</span>

    df.rename(columns={<span class="hljs-string">"년"</span>: <span class="hljs-string">"거래년도"</span>,
                       <span class="hljs-string">"월"</span>: <span class="hljs-string">"거래월"</span>,
                       <span class="hljs-string">"일"</span>: <span class="hljs-string">"거래일"</span>
                       },
              inplace=True)

    return df</pre>
<h3 id="서울-데이터만-조회하는-메소드-만들기" style="color: #000000; text-align: start;">서울 데이터만 조회하는 메소드 만들기</h3>
<p style="color: #555555; text-align: start;">입력받은 시군구 리스트를 대상으로 매매데이터를 조회하여 리턴하는 메소드가 완성되었습니다. 그럼 이제 어느 시/도의 시군구를 파라미터로 넘겨줘야하냐, 이게 남았습니다.</p>
<p style="color: #555555; text-align: start;">
<p style="color: #555555; text-align: start;">저는 이번 시리즈 예시에서 일단 서울 데이터만 조회하는 메소드를 만들고 있어서, 서울 시도코드만 따로 추출하는 메소드를 만들어봅니다.</p>
<pre class="bash hljs" style="color: #555555; text-align: start;" contenteditable="false" data-ke-language="bash"><span class="hljs-comment"># 시/군/구 이름 및 시/도 이름을 새로운 컬럼으로 추가</span>
    df[<span class="hljs-string">"sigungu_name"</span>] = sigungu_name
    df[<span class="hljs-string">"si_do_name"</span>] = si_do_name  <span class="hljs-comment"># 서울특별시 추가</span>

    <span class="hljs-comment"># 가져온 데이터를 all_data에 추가</span>
    all_data = pd.concat([all_data, df], ignore_index=True)</pre>
<p style="color: #555555; text-align: start;">여기에, 마지막으로 인덱스를 리셋해주고, 컬럼들을 제가 원하는 컬럼만으로 간추립니다.</p>
<pre class="bash hljs" style="color: #555555; text-align: start;" contenteditable="false" data-ke-language="bash"><span class="hljs-comment"># 필요한 열만 선택하여 데이터 간추리기</span>
columns_to_select = {
    <span class="hljs-string">"si_do_name"</span>: <span class="hljs-string">"시도"</span>,          <span class="hljs-comment"># 시도</span>
    <span class="hljs-string">"sigungu_name"</span>: <span class="hljs-string">"시군구"</span>,      <span class="hljs-comment"># 시군구</span>
    <span class="hljs-string">"umdNm"</span>: <span class="hljs-string">"법정동"</span>,             <span class="hljs-comment"># 법정동</span>
    <span class="hljs-string">"roadNm"</span>: <span class="hljs-string">"도로명"</span>,            <span class="hljs-comment"># 도로명</span>
    <span class="hljs-string">"bonbun"</span>: <span class="hljs-string">"지번"</span>,              <span class="hljs-comment"># 지번 (본번)</span>
    <span class="hljs-string">"aptNm"</span>: <span class="hljs-string">"아파트"</span>,             <span class="hljs-comment"># 아파트</span>
    <span class="hljs-string">"buildYear"</span>: <span class="hljs-string">"건축년도"</span>,       <span class="hljs-comment"># 건축년도</span>
    <span class="hljs-string">"excluUseAr"</span>: <span class="hljs-string">"전용면적"</span>,      <span class="hljs-comment"># 전용면적</span>
    <span class="hljs-string">"floor"</span>: <span class="hljs-string">"층"</span>,                <span class="hljs-comment"># 거래층</span>
    <span class="hljs-string">"dealYear"</span>: <span class="hljs-string">"거래년도"</span>,        <span class="hljs-comment"># 거래년도</span>
    <span class="hljs-string">"dealMonth"</span>: <span class="hljs-string">"거래월"</span>,         <span class="hljs-comment"># 거래월</span>
    <span class="hljs-string">"dealDay"</span>: <span class="hljs-string">"거래일"</span>,           <span class="hljs-comment"># 거래일</span>
    <span class="hljs-string">"dealAmount"</span>: <span class="hljs-string">"거래금액"</span>,      <span class="hljs-comment"># 거래금액</span>
    <span class="hljs-string">"aptSeq"</span>: <span class="hljs-string">"일련번호"</span>,          <span class="hljs-comment"># 일련번호</span>
    <span class="hljs-string">"dealingGbn"</span>: <span class="hljs-string">"거래유형"</span>,      <span class="hljs-comment"># 거래유형</span>
    <span class="hljs-string">"estateAgentSggNm"</span>: <span class="hljs-string">"중개사소재지"</span>,  <span class="hljs-comment"># 중개사소재지</span>
    <span class="hljs-string">"cdealType"</span>: <span class="hljs-string">"해제여부"</span>,       <span class="hljs-comment"># 해제여부</span>
    <span class="hljs-string">"cdealDay"</span>: <span class="hljs-string">"해제사유발생일"</span>   <span class="hljs-comment"># 해제사유발생일</span>
}</pre>
<p style="color: #555555; text-align: start;">제가 원하는 컬럼목록은 아래와 같습니다.</p>
<pre class="bash hljs" style="color: #555555; text-align: start;" contenteditable="false" data-ke-language="bash">    <span class="hljs-string">"시도"</span>,
    <span class="hljs-string">"시군구"</span>,
    <span class="hljs-string">"법정동"</span>,
    <span class="hljs-string">"도로명"</span>,
    <span class="hljs-string">"지번"</span>,
    <span class="hljs-string">"아파트"</span>,
    <span class="hljs-string">"건축년도"</span>,
    <span class="hljs-string">"전용면적"</span>,
    <span class="hljs-string">"전용면적(평)"</span>,
    <span class="hljs-string">"거래년도"</span>,
    <span class="hljs-string">"거래월"</span>,
    <span class="hljs-string">"거래일"</span>,
    <span class="hljs-string">"거래금액"</span>,
    <span class="hljs-string">"일련번호"</span>,
    <span class="hljs-string">"거래유형"</span>,
    <span class="hljs-string">"중개사소재지"</span>,
    <span class="hljs-string">"해제여부"</span>,
    <span class="hljs-string">"해제사유발생일"</span>

]</pre>
<p style="color: #555555; text-align: start;">이렇게해서  내용이 일단 완료되었습니다. 전체 코드는 아래와 같습니다.</p>
<pre class="bash hljs" style="color: #555555; text-align: start;" contenteditable="false" data-ke-language="bash">import json
import os
import pandas as pd
from google.colab import drive
import PublicDataReader as pdr
from PublicDataReader import TransactionPrice
api = pdr.TransactionPrice(service_key)

class DistrictConverter:
    def __init__(self):
        self.districts = self.__read_district_file()

    def __read_district_file(self):
        <span class="hljs-comment"># Google 드라이브를 마운트합니다.</span>
        drive.mount(<span class="hljs-string">'/content/drive'</span>)

        <span class="hljs-comment"># 드라이브 내의 JSON 파일 경로를 설정합니다.</span>
        json_file_path = <span class="hljs-string">'/content/drive/MyDrive/district.json'</span>
        
        <span class="hljs-comment"># 파일을 열어서 내용을 읽고 JSON으로 변환합니다.</span>
        with open(json_file_path, <span class="hljs-string">'r'</span>) as f:
            <span class="hljs-built_in">return</span> json.loads(f.read())

    def get_si_do_code(self, si_do_name):
        <span class="hljs-keyword">for</span> district <span class="hljs-keyword">in</span> self.districts:
            <span class="hljs-keyword">if</span> si_do_name == district[<span class="hljs-string">"si_do_name"</span>]:
                <span class="hljs-built_in">return</span> district[<span class="hljs-string">"si_do_code"</span>]

    def get_sigungu(self, si_do_code):
        <span class="hljs-keyword">for</span> district <span class="hljs-keyword">in</span> self.districts:
            <span class="hljs-keyword">if</span> si_do_code == district[<span class="hljs-string">"si_do_code"</span>]:
                <span class="hljs-built_in">return</span> district[<span class="hljs-string">"sigungu"</span>]

<span class="hljs-comment"># DistrictConverter 인스턴스 생성</span>
converter = DistrictConverter()

<span class="hljs-comment"># 서울특별시 시/군/구 코드 리스트 가져오기</span>
si_do_name = <span class="hljs-string">"서울특별시"</span>
si_do_code = converter.get_si_do_code(si_do_name)
sigungu_list = converter.get_sigungu(si_do_code)

<span class="hljs-comment"># 모든 시/군/구 데이터를 수집할 DataFrame 초기화</span>
all_data = pd.DataFrame()

<span class="hljs-comment"># 각 시/군/구 코드에 대해 데이터를 가져오고 시/군/구 이름 추가</span>
<span class="hljs-keyword">for</span> sigungu <span class="hljs-keyword">in</span> sigungu_list:
    sigungu_code = sigungu[<span class="hljs-string">"sigungu_code"</span>]
    sigungu_name = sigungu[<span class="hljs-string">"sigungu_name"</span>]

    <span class="hljs-built_in">print</span>(f<span class="hljs-string">"Processing data for {sigungu_name} ({sigungu_code})"</span>)

    <span class="hljs-comment"># 부동산 데이터를 가져옴</span>
    df = api.get_data(
        property_type=<span class="hljs-string">"아파트"</span>,
        trade_type=<span class="hljs-string">"매매"</span>,
        sigungu_code=sigungu_code,
        year_month=<span class="hljs-string">"202402"</span>,
    )

    <span class="hljs-comment"># 시/군/구 이름 및 시/도 이름을 새로운 컬럼으로 추가</span>
    df[<span class="hljs-string">"sigungu_name"</span>] = sigungu_name
    df[<span class="hljs-string">"si_do_name"</span>] = si_do_name  <span class="hljs-comment"># 서울특별시 추가</span>

    <span class="hljs-comment"># 가져온 데이터를 all_data에 추가</span>
    all_data = pd.concat([all_data, df], ignore_index=True)

<span class="hljs-comment"># 필요한 열만 선택하여 데이터 간추리기</span>
<span class="hljs-comment"># 필요한 열만 선택하여 데이터 간추리기</span>
columns_to_select = {
    <span class="hljs-string">"si_do_name"</span>: <span class="hljs-string">"시도"</span>,          <span class="hljs-comment"># 시도</span>
    <span class="hljs-string">"sigungu_name"</span>: <span class="hljs-string">"시군구"</span>,      <span class="hljs-comment"># 시군구</span>
    <span class="hljs-string">"umdNm"</span>: <span class="hljs-string">"법정동"</span>,             <span class="hljs-comment"># 법정동</span>
    <span class="hljs-string">"roadNm"</span>: <span class="hljs-string">"도로명"</span>,            <span class="hljs-comment"># 도로명</span>
    <span class="hljs-string">"bonbun"</span>: <span class="hljs-string">"지번"</span>,              <span class="hljs-comment"># 지번 (본번)</span>
    <span class="hljs-string">"aptNm"</span>: <span class="hljs-string">"아파트"</span>,             <span class="hljs-comment"># 아파트</span>
    <span class="hljs-string">"buildYear"</span>: <span class="hljs-string">"건축년도"</span>,       <span class="hljs-comment"># 건축년도</span>
    <span class="hljs-string">"excluUseAr"</span>: <span class="hljs-string">"전용면적"</span>,      <span class="hljs-comment"># 전용면적</span>
    <span class="hljs-string">"floor"</span>: <span class="hljs-string">"층"</span>,                <span class="hljs-comment"># 거래층</span>
    <span class="hljs-string">"dealYear"</span>: <span class="hljs-string">"거래년도"</span>,        <span class="hljs-comment"># 거래년도</span>
    <span class="hljs-string">"dealMonth"</span>: <span class="hljs-string">"거래월"</span>,         <span class="hljs-comment"># 거래월</span>
    <span class="hljs-string">"dealDay"</span>: <span class="hljs-string">"거래일"</span>,           <span class="hljs-comment"># 거래일</span>
    <span class="hljs-string">"dealAmount"</span>: <span class="hljs-string">"거래금액"</span>,      <span class="hljs-comment"># 거래금액</span>
    <span class="hljs-string">"aptSeq"</span>: <span class="hljs-string">"일련번호"</span>,          <span class="hljs-comment"># 일련번호</span>
    <span class="hljs-string">"dealingGbn"</span>: <span class="hljs-string">"거래유형"</span>,      <span class="hljs-comment"># 거래유형</span>
    <span class="hljs-string">"estateAgentSggNm"</span>: <span class="hljs-string">"중개사소재지"</span>,  <span class="hljs-comment"># 중개사소재지</span>
    <span class="hljs-string">"cdealType"</span>: <span class="hljs-string">"해제여부"</span>,       <span class="hljs-comment"># 해제여부</span>
    <span class="hljs-string">"cdealDay"</span>: <span class="hljs-string">"해제사유발생일"</span>   <span class="hljs-comment"># 해제사유발생일</span>
}

<span class="hljs-comment"># 필요한 열만 선택하여 데이터프레임을 새로 생성하고, 열 이름을 한글로 변경</span>
selected_data = all_data[list(columns_to_select.keys())].rename(columns=columns_to_select)

<span class="hljs-comment"># 파일명을 규칙적으로 지정: 서울특별시_202401_매매.csv</span>
file_name = f<span class="hljs-string">'{si_do_name}_202401_매매.csv'</span>.replace(<span class="hljs-string">" "</span>, <span class="hljs-string">""</span>)  <span class="hljs-comment"># 파일명에서 공백 제거</span>

<span class="hljs-comment"># 필요한 열만 남긴 데이터를 CSV 파일로 저장</span>
csv_path = f<span class="hljs-string">'/content/drive/MyDrive/{file_name}'</span>
selected_data.to_csv(csv_path, index=False)

<span class="hljs-comment"># 파일 저장 후, 선택된 데이터의 일부를 출력하여 확인</span>
<span class="hljs-built_in">print</span>(selected_data.head())</pre>
<h3 id="주피터-파일에서-만든-메소드를-이용해서-매매가-구해보기" style="color: #000000; text-align: start;">코랩에서 데이터 활용 이용해서 매매가 구해보기</h3>
<p style="color: #555555; text-align: start;">이제, 코랩에서 해당 데이터를 실행해봅니다.</p>
<figure data-ke-type="image" data-ke-mobilestyle="widthOrigin" data-ke-style="alignCenter"><img decoding="async" src="https://blog.kakaocdn.net/dn/lFPoM/btsJCJafVX8/J5kkehOURfLihtQZhGdKv0/img.png" data-is-animation="false" data-origin-width="2166" data-origin-height="1004" data-filename="스크린샷 2024-09-14 오후 12.28.25.png" loading="lazy" alt="img" title="파이썬 부동산 매매가 조회 프로그램 만들기 3편 (서울아파트 컬럼 정리) 48"><figcaption>파이썬 부동산 매매가 조회 프로그램 만들기 3편 (서울아파트 컬럼 정리)</figcaption></figure>
<p style="color: #555555; text-align: start;">그러면 아래와 같이 제가 원하는 데이터만 보기좋게 딱 나옵니다.</p>
<figure data-ke-type="image" data-ke-mobilestyle="widthOrigin" data-ke-style="alignCenter">
<p><figure style="width: 2758px" class="wp-caption alignnone"><img decoding="async" src="https://blog.kakaocdn.net/dn/uMtGu/btsJDYwShyi/XK6GIG1yQ5KHJNU9NvjJs1/img.png" alt="파이썬 부동산 매매가 조회 프로그램 만들기 3편 (서울아파트 컬럼 정리)" width="2758" height="1214" data-is-animation="false" data-origin-width="2758" data-origin-height="1214" data-filename="스크린샷 2024-09-14 오후 12.28.40.png" loading="lazy" data-origin- title="파이썬 부동산 매매가 조회 프로그램 만들기 3편 (서울아파트 컬럼 정리) 49"><figcaption class="wp-caption-text">파이썬 부동산 매매가 조회 프로그램 만들기 3편 (서울아파트 컬럼 정리)</figcaption></figure><figcaption>파이썬 부동산 매매가 조회 프로그램 만들기 3편 (서울아파트 컬럼 정리)</figcaption></figure>
<p style="color: #555555; text-align: start;">
데이터가 700가 훌쩍 넘는 것을 보니, 서울의 모든 구의 아파트 매매데이터가 다 나온 것 같네요.</p>
<p style="color: #555555; text-align: start;">이렇게 서울 아파트 매매 데이터를 구해보았습니다. 위에 파라미터를 아파트 로 넣었는데, 연립/다세대 매매 데이터 API에 대한 신청도 해놓으셨다면, 파라미터로 연립/다세대 를 넣으셔서 이른바 빌라 매매 데이터도 구해볼 수 있습니다.</p>
<p style="color: #555555; text-align: start;">다음 포스트에서는 서울 이외의 시도, 시군구에 대한 매매데이터를 구하는 메소드를 만들어봅니다.</p>
<p>&nbsp;</p>
<!-- CONTENT END 18 -->
]]></content:encoded>
					
		
		
		<media:content url="https://2days.kr/wp-content/uploads/2024/09/파이썬-부동산-매매가-조회-프로그램-만들기-3편-서울아파트-컬럼-정리.png" medium="image"></media:content>
            	</item>
		<item>
		<title>파이썬 부동산 매매가 조회 프로그램 만들기 2편 (지역코드)</title>
		<link>https://2days.kr/14/09/08/56521/it/program/</link>
		
		<dc:creator><![CDATA[urjent]]></dc:creator>
		<pubDate>Fri, 13 Sep 2024 23:12:10 +0000</pubDate>
				<category><![CDATA[program]]></category>
		<category><![CDATA[API키발급]]></category>
		<category><![CDATA[API활용]]></category>
		<category><![CDATA[개발자]]></category>
		<category><![CDATA[공공API]]></category>
		<category><![CDATA[공공데이터]]></category>
		<category><![CDATA[공공데이터포털]]></category>
		<category><![CDATA[데이터분석]]></category>
		<category><![CDATA[데이터수집]]></category>
		<category><![CDATA[매매가조회]]></category>
		<category><![CDATA[매물조회]]></category>
		<category><![CDATA[부동산]]></category>
		<category><![CDATA[부동산분석]]></category>
		<category><![CDATA[부동산시세]]></category>
		<category><![CDATA[부동산시장]]></category>
		<category><![CDATA[부동산자동화]]></category>
		<category><![CDATA[부동산정보]]></category>
		<category><![CDATA[시세분석]]></category>
		<category><![CDATA[시세조회]]></category>
		<category><![CDATA[실거래가조회]]></category>
		<category><![CDATA[실거래조회]]></category>
		<category><![CDATA[실거래조회기]]></category>
		<category><![CDATA[아파트매매]]></category>
		<category><![CDATA[연립다세대]]></category>
		<category><![CDATA[자동화프로그램]]></category>
		<category><![CDATA[주택매매]]></category>
		<category><![CDATA[주택시세]]></category>
		<category><![CDATA[주택정보]]></category>
		<category><![CDATA[파이썬]]></category>
		<category><![CDATA[파이썬개발]]></category>
		<category><![CDATA[파이썬프로그래밍]]></category>
		<category><![CDATA[파이썬프로젝트]]></category>
		<guid isPermaLink="false">https://2days.kr/?p=56521</guid>

					<description><![CDATA[파이썬 부동산 매매가 조회 프로그램 만들기 2편 (지역코드) ㅣ 지역 구분 코드 체계를 정리하는 것은 공공 데이터를 다루는 데 있어서 매우 중요한 과정입니다. 시, 도, 시군구, 읍면동의 계층적 관계를 파악하고, 이를 사용하기 쉽게 데이터 구조로 변환하는 것이 조회 및 데이터 처리 과정에서 큰 도움을 주기 때문이죠. 특히, 시군구 코드만으로도 많은 작업이 가능하지만, 다양한 상황에서 읍면동까지 [&#8230;]]]></description>
										<content:encoded><![CDATA[<p style="color: #555555; text-align: start;" data-ke-size="size16"><span style="color: #000000;">파이썬 부동산 매매가 조회 프로그램 만들기 2편 (지역코드) ㅣ 지역 구분 코드 체계를 정리하는 것은 공공 데이터를 다루는 데 있어서 매우 중요한 과정입니다. 시, 도, 시군구, 읍면동의 계층적 관계를 파악하고, 이를 사용하기 쉽게 데이터 구조로 변환하는 것이 조회 및 데이터 처리 과정에서 큰 도움을 주기 때문이죠. 특히, 시군구 코드만으로도 많은 작업이 가능하지만, 다양한 상황에서 읍면동까지 세부적으로 사용할 일이 생길 수 있어 미리 준비해두면 좋습니다.</span></p>
<p style="color: #555555; text-align: start;" data-ke-size="size16"><span style="color: #000000;">아직 1편을 못보고 넘어오신 분들이라면 1편 먼저 보고 오시는게 좋을 것 같아요!</span></p>
<p><a href="https://aboda.kr/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%B6%80%EB%8F%99%EC%82%B0-%EB%A7%A4%EB%A7%A4%EA%B0%80-%EC%A1%B0%ED%9A%8C-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EB%A7%8C%EB%93%A4%EA%B8%B0-1%ED%8E%B8" target="_blank" rel="noopener">2024.09.14 &#8211; [부동산/자동화 프로젝트] &#8211; 파이썬 부동산 매매가 조회 프로그램 만들기 1편</a></p>
<h3 style="color: #555555; text-align: start;" data-ke-size="size23"><span style="color: #000000;"><b>파이썬 부동산 매매가 조회 프로그램 만들기 2편 (지역코드)</b></span></h3>
<figure data-ke-type="image" data-ke-mobilestyle="widthOrigin" data-ke-style="alignCenter">
<p><figure style="width: 2560px" class="wp-caption alignnone"><img decoding="async" src="https://blog.kakaocdn.net/dn/mgZFS/btsJCV9a7Ql/I3FmxmR4gtnNCYkEKgkKu1/img.png" alt="파이썬 부동산 매매가 조회 프로그램 만들기 2편 (지역코드)" width="2560" height="2560" data-origin-width="2560" data-origin-height="2560" data-is-animation="false" data-filename="파이썬 부동산 매매가 조회 프로그램 만들기 2편 (지역코드).png" loading="lazy" data-origin- title="파이썬 부동산 매매가 조회 프로그램 만들기 2편 (지역코드) 51"><figcaption class="wp-caption-text">파이썬 부동산 매매가 조회 프로그램 만들기 2편 (지역코드)</figcaption></figure><figcaption>파이썬 부동산 매매가 조회 프로그램 만들기 2편 (지역코드)</figcaption><b></b></figure><div class='code-block code-block-2' style='margin: 8px auto; text-align: center; display: block; clear: both;'>
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8940400388075870"
     crossorigin="anonymous"></script>
<!-- 중간 -->
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-8940400388075870"
     data-ad-slot="8794586137"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></div>

<h3 style="background-color: #ffffff; color: #0d0d0d; text-align: start;"><span style="color: #000000;">지역 구분 코드 구조</span></h3>
<p style="background-color: #ffffff; color: #0d0d0d; text-align: start;"><span style="color: #000000;">지역 구분 코드는 기본적으로 1: N 관계를 따릅니다. 즉, 하나의 시, 도 아래 여러 시군구가 있고, 다시 하나의 시군구 아래 여러 읍면동이 있는 형태입니다. 이러한 구조를 효율적으로 관리하려면 계층적 관계를 잘 표현할 수 있는 데이터 형식을 사용하는 것이 좋습니다. 여기서는 <b>JSON</b> 형식으로 시, 도, 시군구, 읍면동 코드를 정리해보겠습니다.</span></p>
<figure style="color: #333333; text-align: center;" data-ke-mobilestyle="widthOrigin" data-ke-style="alignCenter" data-ke-type="image"><img decoding="async" src="https://blog.kakaocdn.net/dn/b2d3Z8/btsJCIPNcBo/UwIg1KjfviXu6AfvsKmTO1/img.png" data-is-animation="false" data-origin-width="1280" data-origin-height="892" data-phocus-index="1" loading="lazy" alt="img" title="파이썬 부동산 매매가 조회 프로그램 만들기 2편 (지역코드) 52"></figure>
<p style="background-color: #ffffff; color: #0d0d0d; text-align: start;"><span style="color: #000000;">어느 분이 정리를 해두셨지만 조금 불편하여 JSON 형태로 바꿔보겠습니다.</span></p>
<p style="background-color: #ffffff; color: #0d0d0d; text-align: start;"><span style="color: #000000;"><a style="color: #000000;" href="https://github.com/WooilJeong/PublicDataReader" target="_blank" rel="noopener">https://github.com/WooilJeong/PublicDataReader</a></span></p>
<figure id="og_1726263637439" contenteditable="false" data-ke-type="opengraph" data-ke-align="alignCenter" data-og-type="object" data-og-title="GitHub - WooilJeong/PublicDataReader: 공공 데이터 조회를 위한 오픈소스 파이썬 라이브러리" data-og-description="공공 데이터 조회를 위한 오픈소스 파이썬 라이브러리. Contribute to WooilJeong/PublicDataReader development by creating an account on GitHub." data-og-host="github.com" data-og-source-url="https://github.com/WooilJeong/PublicDataReader" data-og-url="https://github.com/WooilJeong/PublicDataReader" data-og-image="https://scrap.kakaocdn.net/dn/6TsCS/hyW2Ycwf8c/QRUvYLHFlkH8bUKkat2CO1/img.png?width=3544&amp;height=3545&amp;face=0_0_3544_3545">
<div class="og-image" style="background-image: url('https://scrap.kakaocdn.net/dn/6TsCS/hyW2Ycwf8c/QRUvYLHFlkH8bUKkat2CO1/img.png?width=3544&amp;height=3545&amp;face=0_0_3544_3545');"></div>
<div class="og-text">
<p class="og-title">GitHub &#8211; WooilJeong/PublicDataReader: 공공 데이터 조회를 위한 오픈소스 파이썬 라이브러리</p>
<p class="og-desc">공공 데이터 조회를 위한 오픈소스 파이썬 라이브러리. Contribute to WooilJeong/PublicDataReader development by creating an account on GitHub.</p>
<p class="og-host">github.com</p>
</div>
</figure>
<h3 style="background-color: #ffffff; color: #0d0d0d; text-align: start;"><span style="color: #000000;">JSON 데이터 구조 설명</span></h3>
<p style="background-color: #ffffff; color: #0d0d0d; text-align: start;"><span style="color: #000000;">다음은 파이썬을 이용해 지역 구분 코드를 <b>JSON</b> 형식으로 구성한 예시입니다. si_do_code는 시도 코드를 의미하고, 그 하위에 sigungu로 시군구 정보가, 시군구 안에는 eup_myeon_dong으로 읍면동 정보가 포함되어 있습니다.</span></p>
<pre style="color: #555555; text-align: start;" contenteditable="false">{
 "si_do_code":{si_do_code},
  "si_do_name":{si_do_name},
  "sigungu":[{
      "sigungu_code":{sigungu_code},
    "sigungu_name":{sigungu_name},
    "eup_myeon_dong":[{
        "code":{code},
          "name":{name}
    }]
  }]
}</pre>
<div style="background-color: #000000;">
<div style="background-color: #000000; color: #000000;"><span style="color: #000000;">json</span></div>
<div>
<div>
<div style="background-color: #000000; color: #000000;"><span style="color: #000000;" data-state="closed">코드 복사</span></div>
</div>
</div>
<div><span style="color: #000000;">{ &#8220;si_do_code&#8221;: &#8220;{si_do_code}&#8221;, &#8220;si_do_name&#8221;: &#8220;{si_do_name}&#8221;, &#8220;sigungu&#8221;: [ { &#8220;sigungu_code&#8221;: &#8220;{sigungu_code}&#8221;, &#8220;sigungu_name&#8221;: &#8220;{sigungu_name}&#8221;, &#8220;eup_myeon_dong&#8221;: [ { &#8220;code&#8221;: &#8220;{eup_myeon_dong_code}&#8221;, &#8220;name&#8221;: &#8220;{eup_myeon_dong_name}&#8221; } ] } ] }</span></div>
</div>
<p style="background-color: #ffffff; color: #0d0d0d; text-align: start;"><span style="color: #000000;">이 구조에서는:</span></p>
<ul style="list-style-type: disc; background-color: #ffffff; color: #0d0d0d; text-align: start;" data-ke-list-type="disc">
<li><span style="color: #000000;"><b>시/도</b>: si_do_code와 si_do_name으로 표시됩니다. 각 시/도는 고유한 코드와 이름을 가지고 있습니다.</span></li>
<li><span style="color: #000000;"><b>시군구</b>: sigungu_code와 sigungu_name은 시군구를 나타내며, 이는 시도 아래에 속하는 여러 시군구를 나열합니다.</span></li>
<li><span style="color: #000000;"><b>읍면동</b>: code와 name은 읍면동의 코드와 이름으로, 시군구 아래에 속하는 읍면동 리스트를 포함합니다.</span></li>
</ul>
<figure contenteditable="false" data-ke-type="file" data-file-name="district.json" data-ke-align="alignCenter" data-file-size="1894965" data-file-mimetype="application/json">
<div class="image"></div>
<div class="desc">
<p class="filename"><span class="name">district</span><span class="type">.json</span></p>
<p class="size">1.81MB</p>
</div>
</figure>
<p style="color: #555555; text-align: start;" data-ke-size="size16"><span style="color: #000000;">저는 이 구조를 구글 드라이브 코랩에서 실행할 수 있도록 코드를 작성할 예정입니다. 구글 코랩에서는 무료로 쉽게 코드를 실행하거나 동작시킬 수 있거든요</span></p>
<p style="color: #555555; text-align: start;" data-ke-size="size16"><span style="color: #000000;"><a style="color: #000000;" href="https://colab.research.google.com/?hl=ko" target="_blank" rel="noopener noreferrer noopener">https://colab.research.google.com/?hl=ko</a></span></p>
<figure id="og_1726267893378" contenteditable="false" data-ke-type="opengraph" data-ke-align="alignCenter" data-og-type="article" data-og-title="Google Colab" data-og-description="" data-og-host="colab.research.google.com" data-og-source-url="https://colab.research.google.com/?hl=ko" data-og-url="https://colab.research.google.com/?hl=ko" data-og-image="https://scrap.kakaocdn.net/dn/bI3GJE/hyW2YXVjwF/AXKN19ym9JPcikvljjHhd1/img.png?width=260&amp;height=260&amp;face=0_0_260_260">
<div class="og-image" style="background-image: url('https://scrap.kakaocdn.net/dn/bI3GJE/hyW2YXVjwF/AXKN19ym9JPcikvljjHhd1/img.png?width=260&amp;height=260&amp;face=0_0_260_260');"></div>
<div class="og-text">
<p class="og-title">Google Colab</p>
<p class="og-desc">
<p class="og-host">colab.research.google.com</p>
</div>
</figure>
<p><span style="color: #000000;">구글 코랩에서 JSON 파일을 불러오기 위해서 구글 드라이브에 JSON 파일을 업로드 해둡니다. 저는 기본 폴더에 저장했습니다.</span></p>
<p><span style="color: #000000;">코드는 DistrictConverter 클래스를 이용하여, Google 드라이브에서 JSON 파일을 읽고, 여러 가지 데이터를 반환하는 메서드들을 포함하고 있습니다. 이 클래스의 메서드들을 살펴보겠습니다.</span></p>

<h3 style="background-color: #ffffff; color: #0d0d0d; text-align: start;"><span style="color: #000000;">주요 메서드 설명:</span></h3>
<ol style="list-style-type: decimal; background-color: #ffffff; color: #0d0d0d; text-align: start;" data-ke-list-type="decimal">
<li><span style="color: #000000;"><b>get_data()</b>:</span>
<ul style="list-style-type: disc;" data-ke-list-type="disc">
<li><span style="color: #000000;">JSON 파일에서 읽어온 모든 데이터를 반환합니다.</span></li>
</ul>
</li>
<li><span style="color: #000000;"><b>get_si_do_name(si_do)</b>:</span>
<ul style="list-style-type: disc;" data-ke-list-type="disc">
<li><span style="color: #000000;">입력받은 si_do (시/도의 이름)을 포함하는 si_do_name을 반환합니다.</span></li>
</ul>
</li>
<li><span style="color: #000000;"><b>get_si_do_code(si_do_name)</b>:</span>
<ul style="list-style-type: disc;" data-ke-list-type="disc">
<li><span style="color: #000000;">입력받은 si_do_name과 일치하는 시/도의 코드를 반환합니다.</span></li>
</ul>
</li>
<li><span style="color: #000000;"><b>get_sigungu(si_do_code)</b>:</span>
<ul style="list-style-type: disc;" data-ke-list-type="disc">
<li><span style="color: #000000;">입력된 si_do_code와 일치하는 시/도 내의 모든 시/군/구 데이터를 반환합니다.</span></li>
</ul>
</li>
<li><span style="color: #000000;"><b>get_sigungu_list(si_do_code, sigungu_name)</b>:</span>
<ul style="list-style-type: disc;" data-ke-list-type="disc">
<li><span style="color: #000000;">특정 시/도의 코드와 시/군/구 이름을 입력받아 해당하는 시/군/구 리스트를 반환합니다.</span></li>
</ul>
</li>
</ol>
<pre id="code_1726268011458" class="bash hljs" contenteditable="false" data-ke-language="bash" data-ke-type="codeblock">import json
import os
from google.colab import drive

class DistrictConverter:
    def __init__(self):
        self.districts = self.__read_district_file()

    def __read_district_file(self):
        <span class="hljs-comment"># Google 드라이브를 마운트합니다.</span>
        drive.mount(<span class="hljs-string">'/content/drive'</span>)

        <span class="hljs-comment"># 드라이브 내의 JSON 파일 경로를 설정합니다.</span>
        <span class="hljs-comment"># 이 부분을 실제 파일 경로로 수정해야 합니다.</span>
        json_file_path = <span class="hljs-string">'/content/drive/MyDrive/district.json'</span>
        
        <span class="hljs-comment"># 파일을 열어서 내용을 읽고 JSON으로 변환합니다.</span>
        with open(json_file_path, <span class="hljs-string">'r'</span>) as f:
            <span class="hljs-built_in">return</span> json.loads(f.read())

    def get_data(self):
        <span class="hljs-built_in">return</span> self.districts

    def get_si_do_name(self, si_do):
        <span class="hljs-keyword">for</span> district <span class="hljs-keyword">in</span> self.districts:
            <span class="hljs-keyword">if</span> si_do <span class="hljs-keyword">in</span> district[<span class="hljs-string">"si_do_name"</span>]:
                <span class="hljs-built_in">return</span> district[<span class="hljs-string">"si_do_name"</span>]

    def get_si_do_code(self, si_do_name):
        <span class="hljs-keyword">for</span> district <span class="hljs-keyword">in</span> self.districts:
            <span class="hljs-keyword">if</span> si_do_name <span class="hljs-keyword">in</span> district[<span class="hljs-string">"si_do_name"</span>]:
                <span class="hljs-built_in">return</span> district[<span class="hljs-string">"si_do_code"</span>]

    def get_sigungu(self, si_do_code):
        <span class="hljs-keyword">for</span> district <span class="hljs-keyword">in</span> self.districts:
            <span class="hljs-keyword">if</span> si_do_code <span class="hljs-keyword">in</span> district[<span class="hljs-string">"si_do_code"</span>]:
                <span class="hljs-built_in">return</span> district[<span class="hljs-string">"sigungu"</span>]

    def get_sigungu_list(self, si_do_code, sigungu_name):
        sigungu_list = []
        sigungu_data = self.get_sigungu(si_do_code)
        <span class="hljs-keyword">for</span> sigungu <span class="hljs-keyword">in</span> sigungu_data:
            <span class="hljs-keyword">if</span> sigungu_name <span class="hljs-keyword">in</span> sigungu[<span class="hljs-string">"sigungu_name"</span>]:
                sigungu_list.append(sigungu)

        <span class="hljs-built_in">return</span> sigungu_list</pre>
<p><span style="color: #000000;">이렇게 작성하면 구글 코랩에서 준비작업은 끝났습니다. </span></p>
<p><span style="color: #000000;">잘 동작이 되는지 한번 볼까요? 프린트를 찍어서 출력을 한번 해보도록 하겠습니다.</span></p>
<pre id="code_1726268156836" class="bash hljs" contenteditable="false" data-ke-language="bash" data-ke-type="codeblock"><span class="hljs-comment"># 전체 데이터 출력</span>
<span class="hljs-built_in">print</span>(<span class="hljs-string">"전체 데이터:"</span>)
<span class="hljs-built_in">print</span>(converter.get_data())

<span class="hljs-comment"># 시/도 이름 출력</span>
si_do_name = converter.get_si_do_name(<span class="hljs-string">"서울특별시"</span>)
<span class="hljs-built_in">print</span>(<span class="hljs-string">"\n시/도 이름:"</span>)
<span class="hljs-built_in">print</span>(si_do_name)

<span class="hljs-comment"># 시/도 코드 출력</span>
si_do_code = converter.get_si_do_code(<span class="hljs-string">"서울특별시"</span>)
<span class="hljs-built_in">print</span>(<span class="hljs-string">"\n시/도 코드:"</span>)
<span class="hljs-built_in">print</span>(si_do_code)

<span class="hljs-comment"># 해당 시/도 코드의 시/군/구 데이터 출력</span>
sigungu_data = converter.get_sigungu(si_do_code)
<span class="hljs-built_in">print</span>(<span class="hljs-string">"\n시/군/구 데이터:"</span>)
<span class="hljs-built_in">print</span>(sigungu_data)

<span class="hljs-comment"># 특정 시/군/구 리스트 출력</span>
sigungu_list = converter.get_sigungu_list(si_do_code, <span class="hljs-string">"강남구"</span>)
<span class="hljs-built_in">print</span>(<span class="hljs-string">"\n필터된 시/군/구 리스트:"</span>)
<span class="hljs-built_in">print</span>(sigungu_list)</pre>
<p><span style="color: #000000;">결과값은 아래와 같이 도출이 됩니다. </span></p>
<p><span style="color: #000000;">서울시 전체 구, 강남구에 속한 동 까지 잘 출력이 되고 있네요.</span></p>
<div style="background-color: #ffffff; color: #212121; text-align: start;">
<div>
<div>
<div>
<div id="cell-VNgeCbovdcWu">
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<pre class="hljs 1c" style="color: #000000;" contenteditable="false">시/군/구 데이터:
[{'sigungu_code': '<span class="hljs-number">1111</span>0', 'sigungu_name': '종로구', 'eup_myeon_dong': [{'code': '<span class="hljs-number">1111000000</span>', 'name': 'nan'}, {'code': '<span class="hljs-number">1111010100</span>', 'name': '청운동'}, {'code': '<span class="hljs-number">1111010200</span>', 'name': '신교동'}, {'code': '<span class="hljs-number">1111010300</span>', 'name': '궁정동'}, {'code': '<span class="hljs-number">1111010400</span>', 'name': '효자동'}, {'code': '<span class="hljs-number">1111010500</span>', 'name': '창성동'}, {'code': '<span class="hljs-number">1111010600</span>', 'name': '통의동'}, {'code': '<span class="hljs-number">1111010700</span>', 'name': '적선동'}, {'code': '<span class="hljs-number">1111010800</span>', 'name': '통인동'}, {'code': '<span class="hljs-number">1111010900</span>', 'name': '누상동'}, {'code': '<span class="hljs-number">1111011000</span>', 'name': '누하동'}, {'code': '<span class="hljs-number">1111011100</span>', 'name': '옥인동'}, {'code': '<span class="hljs-number">1111011200</span>', 'name': '체부동'}, {'code': '<span class="hljs-number">1111011300</span>', 'name': '필운동'}, {'code': '<span class="hljs-number">1111011400</span>', 'name': '내자동'}, {'code': '<span class="hljs-number">1111011500</span>', 'name': '사직동'}, {'code': '<span class="hljs-number">1111011600</span>', 'name': '도렴동'}, {'code': '<span class="hljs-number">1111011700</span>', 'name': '당주동'}, {'code': '<span class="hljs-number">1111011800</span>', 'name': '내수동'}, {'code': '<span class="hljs-number">1111011900</span>', 'name': '세종로'}, {'code': '<span class="hljs-number">1111012000</span>', 'name': '신문로1가'}, {'code': '<span class="hljs-number">1111012100</span>', 'name': '신문로2가'}, {'code': '<span class="hljs-number">1111012200</span>', 'name': '청진동'}, {'code': '<span class="hljs-number">1111012300</span>', 'name': '서린동'}, {'code': '<span class="hljs-number">1111012400</span>', 'name': '수송동'}, {'code': '<span class="hljs-number">1111012500</span>', 'name': '중학동'}, {'code': '<span class="hljs-number">1111012600</span>', 'name': '종로1가'}, {'code': '<span class="hljs-number">1111012700</span>', 'name': '공평동'}, {'code': '<span class="hljs-number">1111012800</span>', 'name': '관훈동'}, {'code': '<span class="hljs-number">1111012900</span>', 'name': '견지동'}, {'code': '<span class="hljs-number">1111013000</span>', 'name': '와룡동'}, {'code': '<span class="hljs-number">1111013100</span>', 'name': '권농동'}, {'code': '<span class="hljs-number">1111013200</span>', 'name': '운니동'}, {'code': '<span class="hljs-number">1111013300</span>', 'name': '익선동'}, {'code': '<span class="hljs-number">1111013400</span>', 'name': '경운동'}, {'code': '<span class="hljs-number">1111013500</span>', 'name': '관철동'}, {'code': '<span class="hljs-number">1111013600</span>', 'name': '인사동'}, {'code': '<span class="hljs-number">1111013700</span>', 'name': '낙원동'}, {'code': '<span class="hljs-number">1111013800</span>', 'name': '종로2가'}, {'code': '<span class="hljs-number">1111013900</span>', 'name': '팔판동'}, {'code': '<span class="hljs-number">1111014000</span>', 'name': '삼청동'}, {'code': '<span class="hljs-number">1111014100</span>', 'name': '안국동'}, {'code': '<span class="hljs-number">1111014200</span>', 'name': '소격동'}, {'code': '<span class="hljs-number">1111014300</span>', 'name': '화동'}, {'code': '<span class="hljs-number">1111014400</span>', 'name': '사간동'}, {'code': '<span class="hljs-number">1111014500</span>', 'name': '송현동'}, {'code': '<span class="hljs-number">1111014600</span>', 'name': '가회동'}, {'code': '<span class="hljs-number">1111014700</span>', 'name': '재동'}, {'code': '<span class="hljs-number">1111014800</span>', 'name': '계동'}, {'code': '<span class="hljs-number">1111014900</span>', 'name': '원서동'}, {'code': '<span class="hljs-number">1111015000</span>', 'name': '훈정동'}, {'code': '<span class="hljs-number">1111015100</span>', 'name': '묘동'}, {'code': '<span class="hljs-number">1111015200</span>', 'name': '봉익동'}, {'code': '<span class="hljs-number">1111015300</span>', 'name': '돈의동'}, {'code': '<span class="hljs-number">1111015400</span>', 'name': '장사동'}, {'code': '<span class="hljs-number">1111015500</span>', 'name': '관수동'}, {'code': '<span class="hljs-number">1111015600</span>', 'name': '종로3가'}, {'code': '<span class="hljs-number">1111015700</span>', 'name': '인의동'}, {'code': '<span class="hljs-number">1111015800</span>', 'name': '예지동'}, {'code': '<span class="hljs-number">1111015900</span>', 'name': '원남동'}, {'code': '<span class="hljs-number">1111016000</span>', 'name': '연지동'}, {'code': '<span class="hljs-number">1111016100</span>', 'name': '종로4가'}, {'code': '<span class="hljs-number">1111016200</span>', 'name': '효제동'}, {'code': '<span class="hljs-number">1111016300</span>', 'name': '종로5가'}, {'code': '<span class="hljs-number">1111016400</span>', 'name': '종로6가'}, {'code': '<span class="hljs-number">1111016500</span>', 'name': '이화동'}, {'code': '<span class="hljs-number">1111016600</span>', 'name': '연건동'}, {'code': '<span class="hljs-number">1111016700</span>', 'name': '충신동'}, {'code': '<span class="hljs-number">1111016800</span>', 'name': '동숭동'}, {'code': '<span class="hljs-number">1111016900</span>', 'name': '혜화동'}, {'code': '<span class="hljs-number">1111017000</span>', 'name': '명륜1가'}, {'code': '<span class="hljs-number">1111017100</span>', 'name': '명륜2가'}, {'code': '<span class="hljs-number">1111017200</span>', 'name': '명륜4가'}, {'code': '<span class="hljs-number">1111017300</span>', 'name': '명륜3가'}, {'code': '<span class="hljs-number">1111017400</span>', 'name': '창신동'}, {'code': '<span class="hljs-number">1111017500</span>', 'name': '숭인동'}, {'code': '<span class="hljs-number">1111017600</span>', 'name': '교남동'}, {'code': '<span class="hljs-number">1111017700</span>', 'name': '평동'}, {'code': '<span class="hljs-number">1111017800</span>', 'name': '송월동'}, {'code': '<span class="hljs-number">1111017900</span>', 'name': '홍파동'}, {'code': '<span class="hljs-number">1111018000</span>', 'name': '교북동'}, {'code': '<span class="hljs-number">1111018100</span>', 'name': '행촌동'}, {'code': '<span class="hljs-number">1111018200</span>', 'name': '구기동'}, {'code': '<span class="hljs-number">1111018300</span>', 'name': '평창동'}, {'code': '<span class="hljs-number">1111018400</span>', 'name': '부암동'}, {'code': '<span class="hljs-number">1111018500</span>', 'name': '홍지동'}, {'code': '<span class="hljs-number">1111018600</span>', 'name': '신영동'}, {'code': '<span class="hljs-number">1111018700</span>', 'name': '무악동'}]}, {'sigungu_code': '<span class="hljs-number">1114</span>0', 'sigungu_name': '중구', 'eup_myeon_dong': [{'code': '<span class="hljs-number">1114000000</span>', 'name': 'NaN'}, {'code': '<span class="hljs-number">1114010100</span>', 'name': '무교동'}, {'code': '<span class="hljs-number">1114010200</span>', 'name': '다동'}, {'code': '<span class="hljs-number">1114010300</span>', 'name': '태평로1가'}, {'code': '<span class="hljs-number">1114010400</span>', 'name': '을지로1가'}, {'code': '<span class="hljs-number">1114010500</span>', 'name': '을지로2가'}, {'code': '<span class="hljs-number">1114010600</span>', 'name': '남대문로1가'}, {'code': '<span class="hljs-number">1114010700</span>', 'name': '삼각동'}, {'code': '<span class="hljs-number">1114010800</span>', 'name': '수하동'}, {'code': '<span class="hljs-number">1114010900</span>', 'name': '장교동'}, {'code': '<span class="hljs-number">1114011000</span>', 'name': '수표동'}, {'code': '<span class="hljs-number">1114011100</span>', 'name': '소공동'}, {'code': '<span class="hljs-number">1114011200</span>', 'name': '남창동'}, {'code': '<span class="hljs-number">1114011300</span>', 'name': '북창동'}, {'code': '<span class="hljs-number">1114011400</span>', 'name': '태평로2가'}, {'code': '<span class="hljs-number">1114011500</span>', 'name': '남대문로2가'}, {'code': '<span class="hljs-number">1114011600</span>', 'name': '남대문로3가'}, {'code': '<span class="hljs-number">1114011700</span>', 'name': '남대문로4가'}, {'code': '<span class="hljs-number">1114011800</span>', 'name': '남대문로5가'}, {'code': '<span class="hljs-number">1114011900</span>', 'name': '봉래동1가'}, {'code': '<span class="hljs-number">1114012000</span>', 'name': '봉래동2가'}, {'code': '<span class="hljs-number">1114012100</span>', 'name': '회현동1가'}, {'code': '<span class="hljs-number">1114012200</span>', 'name': '회현동2가'}, {'code': '<span class="hljs-number">1114012300</span>', 'name': '회현동3가'}, {'code': '<span class="hljs-number">1114012400</span>', 'name': '충무로1가'}, {'code': '<span class="hljs-number">1114012500</span>', 'name': '충무로2가'}, {'code': '<span class="hljs-number">1114012600</span>', 'name': '명동1가'}, {'code': '<span class="hljs-number">1114012700</span>', 'name': '명동2가'}, {'code': '<span class="hljs-number">1114012800</span>', 'name': '남산동1가'}, {'code': '<span class="hljs-number">1114012900</span>', 'name': '남산동2가'}, {'code': '<span class="hljs-number">1114013000</span>', 'name': '남산동3가'}, {'code': '<span class="hljs-number">1114013100</span>', 'name': '저동1가'}, {'code': '<span class="hljs-number">1114013200</span>', 'name': '충무로4가'}, {'code': '<span class="hljs-number">1114013300</span>', 'name': '충무로5가'}, {'code': '<span class="hljs-number">1114013400</span>', 'name': '인현동2가'}, {'code': '<span class="hljs-number">1114013500</span>', 'name': '예관동'}, {'code': '<span class="hljs-number">1114013600</span>', 'name': '묵정동'}, {'code': '<span class="hljs-number">1114013700</span>', 'name': '필동1가'}, {'code': '<span class="hljs-number">1114013800</span>', 'name': '필동2가'}, {'code': '<span class="hljs-number">1114013900</span>', 'name': '필동3가'}, {'code': '<span class="hljs-number">1114014000</span>', 'name': '남학동'}, {'code': '<span class="hljs-number">1114014100</span>', 'name': '주자동'}, {'code': '<span class="hljs-number">1114014200</span>', 'name': '예장동'}, {'code': '<span class="hljs-number">1114014300</span>', 'name': '장충동1가'}, {'code': '<span class="hljs-number">1114014400</span>', 'name': '장충동2가'}, {'code': '<span class="hljs-number">1114014500</span>', 'name': '광희동1가'}, {'code': '<span class="hljs-number">1114014600</span>', 'name': '광희동2가'}, {'code': '<span class="hljs-number">1114014700</span>', 'name': '쌍림동'}, {'code': '<span class="hljs-number">1114014800</span>', 'name': '을지로6가'}, {'code': '<span class="hljs-number">1114014900</span>', 'name': '을지로7가'}, {'code': '<span class="hljs-number">1114015000</span>', 'name': '을지로4가'}, {'code': '<span class="hljs-number">1114015100</span>', 'name': '을지로5가'}, {'code': '<span class="hljs-number">1114015200</span>', 'name': '주교동'}, {'code': '<span class="hljs-number">1114015300</span>', 'name': '방산동'}, {'code': '<span class="hljs-number">1114015400</span>', 'name': '오장동'}, {'code': '<span class="hljs-number">1114015500</span>', 'name': '을지로3가'}, {'code': '<span class="hljs-number">1114015600</span>', 'name': '입정동'}, {'code': '<span class="hljs-number">1114015700</span>', 'name': '산림동'}, {'code': '<span class="hljs-number">1114015800</span>', 'name': '충무로3가'}, {'code': '<span class="hljs-number">1114015900</span>', 'name': '초동'}, {'code': '<span class="hljs-number">1114016000</span>', 'name': '인현동1가'}, {'code': '<span class="hljs-number">1114016100</span>', 'name': '저동2가'}, {'code': '<span class="hljs-number">1114016200</span>', 'name': '신당동'}, {'code': '<span class="hljs-number">1114016300</span>', 'name': '흥인동'}, {'code': '<span class="hljs-number">1114016400</span>', 'name': '무학동'}, {'code': '<span class="hljs-number">1114016500</span>', 'name': '황학동'}, {'code': '<span class="hljs-number">1114016600</span>', 'name': '서소문동'}, {'code': '<span class="hljs-number">1114016700</span>', 'name': '정동'}, {'code': '<span class="hljs-number">1114016800</span>', 'name': '순화동'}, {'code': '<span class="hljs-number">1114016900</span>', 'name': '의주로1가'}, {'code': '<span class="hljs-number">1114017000</span>', 'name': '충정로1가'}, {'code': '<span class="hljs-number">1114017100</span>', 'name': '중림동'}, {'code': '<span class="hljs-number">1114017200</span>', 'name': '의주로2가'}, {'code': '<span class="hljs-number">1114017300</span>', 'name': '만리동1가'}, {'code': '<span class="hljs-number">1114017400</span>', 'name': '만리동2가'}]}, {'sigungu_code': '<span class="hljs-number">1117</span>0', 'sigungu_name': '용산구', 'eup_myeon_dong': [{'code': '<span class="hljs-number">1117000000</span>', 'name': 'nan'}, {'code': '<span class="hljs-number">1117010100</span>', 'name': '후암동'}, {'code': '<span class="hljs-number">1117010200</span>', 'name': '용산동2가'}, {'code': '<span class="hljs-number">1117010300</span>', 'name': '용산동4가'}, {'code': '<span class="hljs-number">1117010400</span>', 'name': '갈월동'}, {'code': '<span class="hljs-number">1117010500</span>', 'name': '남영동'}, {'code': '<span class="hljs-number">1117010600</span>', 'name': '용산동1가'}, {'code': '<span class="hljs-number">1117010700</span>', 'name': '동자동'}, {'code': '<span class="hljs-number">1117010800</span>', 'name': '서계동'}, {'code': '<span class="hljs-number">1117010900</span>', 'name': '청파동1가'}, {'code': '<span class="hljs-number">1117011000</span>', 'name': '청파동2가'}, {'code': '<span class="hljs-number">1117011100</span>', 'name': '청파동3가'}, {'code': '<span class="hljs-number">1117011200</span>', 'name': '원효로1가'}, {'code': '<span class="hljs-number">1117011300</span>', 'name': '원효로2가'}, {'code': '<span class="hljs-number">1117011400</span>', 'name': '신창동'}, {'code': '<span class="hljs-number">1117011500</span>', 'name': '산천동'}, {'code': '<span class="hljs-number">1117011600</span>', 'name': '청암동'}, {'code': '<span class="hljs-number">1117011700</span>', 'name': '원효로3가'}, {'code': '<span class="hljs-number">1117011800</span>', 'name': '원효로4가'}, {'code': '<span class="hljs-number">1117011900</span>', 'name': '효창동'}, {'code': '<span class="hljs-number">1117012000</span>', 'name': '도원동'}, {'code': '<span class="hljs-number">1117012100</span>', 'name': '용문동'}, {'code': '<span class="hljs-number">1117012200</span>', 'name': '문배동'}, {'code': '<span class="hljs-number">1117012300</span>', 'name': '신계동'}, {'code': '<span class="hljs-number">1117012400</span>', 'name': '한강로1가'}, {'code': '<span class="hljs-number">1117012500</span>', 'name': '한강로2가'}, {'code': '<span class="hljs-number">1117012600</span>', 'name': '용산동3가'}, {'code': '<span class="hljs-number">1117012700</span>', 'name': '용산동5가'}, {'code': '<span class="hljs-number">1117012800</span>', 'name': '한강로3가'}, {'code': '<span class="hljs-number">1117012900</span>', 'name': '이촌동'}, {'code': '<span class="hljs-number">1117013000</span>', 'name': '이태원동'}, {'code': '<span class="hljs-number">1117013100</span>', 'name': '한남동'}, {'code': '<span class="hljs-number">1117013200</span>', 'name': '동빙고동'}, {'code': '<span class="hljs-number">1117013300</span>', 'name': '서빙고동'}, {'code': '<span class="hljs-number">1117013400</span>', 'name': '주성동'}, {'code': '<span class="hljs-number">1117013500</span>', 'name': '용산동6가'}, {'code': '<span class="hljs-number">1117013600</span>', 'name': '보광동'}]}, {'sigungu_code': '<span class="hljs-number">1120</span>0', 'sigungu_name': '성동구', 'eup_myeon_dong': [{'code': '<span class="hljs-number">1120000000</span>', 'name': 'nan'}, {'code': '<span class="hljs-number">1120010100</span>', 'name': '상왕십리동'}, {'code': '<span class="hljs-number">1120010200</span>', 'name': '하왕십리동'}, {'code': '<span class="hljs-number">1120010300</span>', 'name': '홍익동'}, {'code': '<span class="hljs-number">1120010400</span>', 'name': '도선동'}, {'code': '<span class="hljs-number">1120010500</span>', 'name': '마장동'}, {'code': '<span class="hljs-number">1120010600</span>', 'name': '사근동'}, {'code': '<span class="hljs-number">1120010700</span>', 'name': '행당동'}, {'code': '<span class="hljs-number">1120010800</span>', 'name': '응봉동'}, {'code': '<span class="hljs-number">1120010900</span>', 'name': '금호동1가'}, {'code': '<span class="hljs-number">1120011000</span>', 'name': '금호동2가'}, {'code': '<span class="hljs-number">1120011100</span>', 'name': '금호동3가'}, {'code': '<span class="hljs-number">1120011200</span>', 'name': '금호동4가'}, {'code': '<span class="hljs-number">1120011300</span>', 'name': '옥수동'}, {'code': '<span class="hljs-number">1120011400</span>', 'name': '성수동1가'}, {'code': '<span class="hljs-number">1120011500</span>', 'name': '성수동2가'}, {'code': '<span class="hljs-number">1120011800</span>', 'name': '송정동'}, {'code': '<span class="hljs-number">1120012200</span>', 'name': '용답동'}]}, {'sigungu_code': '<span class="hljs-number">1121</span>5', 'sigungu_name': '광진구', 'eup_myeon_dong': [{'code': '<span class="hljs-number">1121500000</span>', 'name': 'nan'}, {'code': '<span class="hljs-number">1121510100</span>', 'name': '중곡동'}, {'code': '<span class="hljs-number">1121510200</span>', 'name': '능동'}, {'code': '<span class="hljs-number">1121510300</span>', 'name': '구의동'}, {'code': '<span class="hljs-number">1121510400</span>', 'name': '광장동'}, {'code': '<span class="hljs-number">1121510500</span>', 'name': '자양동'}, {'code': '<span class="hljs-number">1121510700</span>', 'name': '화양동'}, {'code': '<span class="hljs-number">1121510900</span>', 'name': '군자동'}]}, {'sigungu_code': '<span class="hljs-number">1123</span>0', 'sigungu_name': '동대문구', 'eup_myeon_dong': [{'code': '<span class="hljs-number">1123000000</span>', 'name': 'nan'}, {'code': '<span class="hljs-number">1123010100</span>', 'name': '신설동'}, {'code': '<span class="hljs-number">1123010200</span>', 'name': '용두동'}, {'code': '<span class="hljs-number">1123010300</span>', 'name': '제기동'}, {'code': '<span class="hljs-number">1123010400</span>', 'name': '전농동'}, {'code': '<span class="hljs-number">1123010500</span>', 'name': '답십리동'}, {'code': '<span class="hljs-number">1123010600</span>', 'name': '장안동'}, {'code': '<span class="hljs-number">1123010700</span>', 'name': '청량리동'}, {'code': '<span class="hljs-number">1123010800</span>', 'name': '회기동'}, {'code': '<span class="hljs-number">1123010900</span>', 'name': '휘경동'}, {'code': '<span class="hljs-number">1123011000</span>', 'name': '이문동'}]}, {'sigungu_code': '<span class="hljs-number">1126</span>0', 'sigungu_name': '중랑구', 'eup_myeon_dong': [{'code': '<span class="hljs-number">1126000000</span>', 'name': 'nan'}, {'code': '<span class="hljs-number">1126010100</span>', 'name': '면목동'}, {'code': '<span class="hljs-number">1126010200</span>', 'name': '상봉동'}, {'code': '<span class="hljs-number">1126010300</span>', 'name': '중화동'}, {'code': '<span class="hljs-number">1126010400</span>', 'name': '묵동'}, {'code': '<span class="hljs-number">1126010500</span>', 'name': '망우동'}, {'code': '<span class="hljs-number">1126010600</span>', 'name': '신내동'}]}, {'sigungu_code': '<span class="hljs-number">1129</span>0', 'sigungu_name': '성북구', 'eup_myeon_dong': [{'code': '<span class="hljs-number">1129000000</span>', 'name': 'nan'}, {'code': '<span class="hljs-number">1129010100</span>', 'name': '성북동'}, {'code': '<span class="hljs-number">1129010200</span>', 'name': '성북동1가'}, {'code': '<span class="hljs-number">1129010300</span>', 'name': '돈암동'}, {'code': '<span class="hljs-number">1129010400</span>', 'name': '동소문동1가'}, {'code': '<span class="hljs-number">1129010500</span>', 'name': '동소문동2가'}, {'code': '<span class="hljs-number">1129010600</span>', 'name': '동소문동3가'}, {'code': '<span class="hljs-number">1129010700</span>', 'name': '동소문동4가'}, {'code': '<span class="hljs-number">1129010800</span>', 'name': '동소문동5가'}, {'code': '<span class="hljs-number">1129010900</span>', 'name': '동소문동6가'}, {'code': '<span class="hljs-number">1129011000</span>', 'name': '동소문동7가'}, {'code': '<span class="hljs-number">1129011100</span>', 'name': '삼선동1가'}, {'code': '<span class="hljs-number">1129011200</span>', 'name': '삼선동2가'}, {'code': '<span class="hljs-number">1129011300</span>', 'name': '삼선동3가'}, {'code': '<span class="hljs-number">1129011400</span>', 'name': '삼선동4가'}, {'code': '<span class="hljs-number">1129011500</span>', 'name': '삼선동5가'}, {'code': '<span class="hljs-number">1129011600</span>', 'name': '동선동1가'}, {'code': '<span class="hljs-number">1129011700</span>', 'name': '동선동2가'}, {'code': '<span class="hljs-number">1129011800</span>', 'name': '동선동3가'}, {'code': '<span class="hljs-number">1129011900</span>', 'name': '동선동4가'}, {'code': '<span class="hljs-number">1129012000</span>', 'name': '동선동5가'}, {'code': '<span class="hljs-number">1129012100</span>', 'name': '안암동1가'}, {'code': '<span class="hljs-number">1129012200</span>', 'name': '안암동2가'}, {'code': '<span class="hljs-number">1129012300</span>', 'name': '안암동3가'}, {'code': '<span class="hljs-number">1129012400</span>', 'name': '안암동4가'}, {'code': '<span class="hljs-number">1129012500</span>', 'name': '안암동5가'}, {'code': '<span class="hljs-number">1129012600</span>', 'name': '보문동4가'}, {'code': '<span class="hljs-number">1129012700</span>', 'name': '보문동5가'}, {'code': '<span class="hljs-number">1129012800</span>', 'name': '보문동6가'}, {'code': '<span class="hljs-number">1129012900</span>', 'name': '보문동7가'}, {'code': '<span class="hljs-number">1129013000</span>', 'name': '보문동1가'}, {'code': '<span class="hljs-number">1129013100</span>', 'name': '보문동2가'}, {'code': '<span class="hljs-number">1129013200</span>', 'name': '보문동3가'}, {'code': '<span class="hljs-number">1129013300</span>', 'name': '정릉동'}, {'code': '<span class="hljs-number">1129013400</span>', 'name': '길음동'}, {'code': '<span class="hljs-number">1129013500</span>', 'name': '종암동'}, {'code': '<span class="hljs-number">1129013600</span>', 'name': '하월곡동'}, {'code': '<span class="hljs-number">1129013700</span>', 'name': '상월곡동'}, {'code': '<span class="hljs-number">1129013800</span>', 'name': '장위동'}, {'code': '<span class="hljs-number">1129013900</span>', 'name': '석관동'}]}, {'sigungu_code': '<span class="hljs-number">1130</span>5', 'sigungu_name': '강북구', 'eup_myeon_dong': [{'code': '<span class="hljs-number">1130500000</span>', 'name': 'nan'}, {'code': '<span class="hljs-number">1130510100</span>', 'name': '미아동'}, {'code': '<span class="hljs-number">1130510200</span>', 'name': '번동'}, {'code': '<span class="hljs-number">1130510300</span>', 'name': '수유동'}, {'code': '<span class="hljs-number">1130510400</span>', 'name': '우이동'}]}, {'sigungu_code': '<span class="hljs-number">1132</span>0', 'sigungu_name': '도봉구', 'eup_myeon_dong': [{'code': '<span class="hljs-number">1132000000</span>', 'name': 'nan'}, {'code': '<span class="hljs-number">1132010500</span>', 'name': '쌍문동'}, {'code': '<span class="hljs-number">1132010600</span>', 'name': '방학동'}, {'code': '<span class="hljs-number">1132010700</span>', 'name': '창동'}, {'code': '<span class="hljs-number">1132010800</span>', 'name': '도봉동'}]}, {'sigungu_code': '<span class="hljs-number">1135</span>0', 'sigungu_name': '노원구', 'eup_myeon_dong': [{'code': '<span class="hljs-number">1135000000</span>', 'name': 'nan'}, {'code': '<span class="hljs-number">1135010200</span>', 'name': '월계동'}, {'code': '<span class="hljs-number">1135010300</span>', 'name': '공릉동'}, {'code': '<span class="hljs-number">1135010400</span>', 'name': '하계동'}, {'code': '<span class="hljs-number">1135010500</span>', 'name': '상계동'}, {'code': '<span class="hljs-number">1135010600</span>', 'name': '중계동'}]}, {'sigungu_code': '<span class="hljs-number">1138</span>0', 'sigungu_name': '은평구', 'eup_myeon_dong': [{'code': '<span class="hljs-number">1138000000</span>', 'name': 'nan'}, {'code': '<span class="hljs-number">1138010100</span>', 'name': '수색동'}, {'code': '<span class="hljs-number">1138010200</span>', 'name': '녹번동'}, {'code': '<span class="hljs-number">1138010300</span>', 'name': '불광동'}, {'code': '<span class="hljs-number">1138010400</span>', 'name': '갈현동'}, {'code': '<span class="hljs-number">1138010500</span>', 'name': '구산동'}, {'code': '<span class="hljs-number">1138010600</span>', 'name': '대조동'}, {'code': '<span class="hljs-number">1138010700</span>', 'name': '응암동'}, {'code': '<span class="hljs-number">1138010800</span>', 'name': '역촌동'}, {'code': '<span class="hljs-number">1138010900</span>', 'name': '신사동'}, {'code': '<span class="hljs-number">1138011000</span>', 'name': '증산동'}, {'code': '<span class="hljs-number">1138011400</span>', 'name': '진관동'}]}, {'sigungu_code': '<span class="hljs-number">1141</span>0', 'sigungu_name': '서대문구', 'eup_myeon_dong': [{'code': '<span class="hljs-number">1141000000</span>', 'name': 'nan'}, {'code': '<span class="hljs-number">1141010100</span>', 'name': '충정로2가'}, {'code': '<span class="hljs-number">1141010200</span>', 'name': '충정로3가'}, {'code': '<span class="hljs-number">1141010300</span>', 'name': '합동'}, {'code': '<span class="hljs-number">1141010400</span>', 'name': '미근동'}, {'code': '<span class="hljs-number">1141010500</span>', 'name': '냉천동'}, {'code': '<span class="hljs-number">1141010600</span>', 'name': '천연동'}, {'code': '<span class="hljs-number">1141010700</span>', 'name': '옥천동'}, {'code': '<span class="hljs-number">1141010800</span>', 'name': '영천동'}, {'code': '<span class="hljs-number">1141010900</span>', 'name': '현저동'}, {'code': '<span class="hljs-number">1141011000</span>', 'name': '북아현동'}, {'code': '<span class="hljs-number">1141011100</span>', 'name': '홍제동'}, {'code': '<span class="hljs-number">1141011200</span>', 'name': '대현동'}, {'code': '<span class="hljs-number">1141011300</span>', 'name': '대신동'}, {'code': '<span class="hljs-number">1141011400</span>', 'name': '신촌동'}, {'code': '<span class="hljs-number">1141011500</span>', 'name': '봉원동'}, {'code': '<span class="hljs-number">1141011600</span>', 'name': '창천동'}, {'code': '<span class="hljs-number">1141011700</span>', 'name': '연희동'}, {'code': '<span class="hljs-number">1141011800</span>', 'name': '홍은동'}, {'code': '<span class="hljs-number">1141011900</span>', 'name': '북가좌동'}, {'code': '<span class="hljs-number">1141012000</span>', 'name': '남가좌동'}]}, {'sigungu_code': '<span class="hljs-number">1144</span>0', 'sigungu_name': '마포구', 'eup_myeon_dong': [{'code': '<span class="hljs-number">1144000000</span>', 'name': 'nan'}, {'code': '<span class="hljs-number">1144010100</span>', 'name': '아현동'}, {'code': '<span class="hljs-number">1144010200</span>', 'name': '공덕동'}, {'code': '<span class="hljs-number">1144010300</span>', 'name': '신공덕동'}, {'code': '<span class="hljs-number">1144010400</span>', 'name': '도화동'}, {'code': '<span class="hljs-number">1144010500</span>', 'name': '용강동'}, {'code': '<span class="hljs-number">1144010600</span>', 'name': '토정동'}, {'code': '<span class="hljs-number">1144010700</span>', 'name': '마포동'}, {'code': '<span class="hljs-number">1144010800</span>', 'name': '대흥동'}, {'code': '<span class="hljs-number">1144010900</span>', 'name': '염리동'}, {'code': '<span class="hljs-number">1144011000</span>', 'name': '노고산동'}, {'code': '<span class="hljs-number">1144011100</span>', 'name': '신수동'}, {'code': '<span class="hljs-number">1144011200</span>', 'name': '현석동'}, {'code': '<span class="hljs-number">1144011300</span>', 'name': '구수동'}, {'code': '<span class="hljs-number">1144011400</span>', 'name': '창전동'}, {'code': '<span class="hljs-number">1144011500</span>', 'name': '상수동'}, {'code': '<span class="hljs-number">1144011600</span>', 'name': '하중동'}, {'code': '<span class="hljs-number">1144011700</span>', 'name': '신정동'}, {'code': '<span class="hljs-number">1144011800</span>', 'name': '당인동'}, {'code': '<span class="hljs-number">1144012000</span>', 'name': '서교동'}, {'code': '<span class="hljs-number">1144012100</span>', 'name': '동교동'}, {'code': '<span class="hljs-number">1144012200</span>', 'name': '합정동'}, {'code': '<span class="hljs-number">1144012300</span>', 'name': '망원동'}, {'code': '<span class="hljs-number">1144012400</span>', 'name': '연남동'}, {'code': '<span class="hljs-number">1144012500</span>', 'name': '성산동'}, {'code': '<span class="hljs-number">1144012600</span>', 'name': '중동'}, {'code': '<span class="hljs-number">1144012700</span>', 'name': '상암동'}]}, {'sigungu_code': '<span class="hljs-number">1147</span>0', 'sigungu_name': '양천구', 'eup_myeon_dong': [{'code': '<span class="hljs-number">1147000000</span>', 'name': 'nan'}, {'code': '<span class="hljs-number">1147010100</span>', 'name': '신정동'}, {'code': '<span class="hljs-number">1147010200</span>', 'name': '목동'}, {'code': '<span class="hljs-number">1147010300</span>', 'name': '신월동'}]}, {'sigungu_code': '<span class="hljs-number">1150</span>0', 'sigungu_name': '강서구', 'eup_myeon_dong': [{'code': '<span class="hljs-number">1150000000</span>', 'name': 'nan'}, {'code': '<span class="hljs-number">1150000100</span>', 'name': '신정동'}, {'code': '<span class="hljs-number">1150000200</span>', 'name': '신월동'}, {'code': '<span class="hljs-number">1150010100</span>', 'name': '염창동'}, {'code': '<span class="hljs-number">1150010200</span>', 'name': '등촌동'}, {'code': '<span class="hljs-number">1150010300</span>', 'name': '화곡동'}, {'code': '<span class="hljs-number">1150010400</span>', 'name': '가양'}, {'code': '<span class="hljs-number">1150010500</span>', 'name': '마곡동'}, {'code': '<span class="hljs-number">1150010600</span>', 'name': '내발산동'}, {'code': '<span class="hljs-number">1150010700</span>', 'name': '외발산동'}, {'code': '<span class="hljs-number">1150010800</span>', 'name': '공항동'}, {'code': '<span class="hljs-number">1150010900</span>', 'name': '방화동'}, {'code': '<span class="hljs-number">1150011000</span>', 'name': '개화동'}, {'code': '<span class="hljs-number">1150011100</span>', 'name': '과해동'}, {'code': '<span class="hljs-number">1150011200</span>', 'name': '오곡동'}, {'code': '<span class="hljs-number">1150011300</span>', 'name': '오쇠동'}]}, {'sigungu_code': '<span class="hljs-number">1153</span>0', 'sigungu_name': '구로구', 'eup_myeon_dong': [{'code': '<span class="hljs-number">1153000000</span>', 'name': 'nan'}, {'code': '<span class="hljs-number">1153010100</span>', 'name': '신도림동'}, {'code': '<span class="hljs-number">1153010200</span>', 'name': '구로동'}, {'code': '<span class="hljs-number">1153010300</span>', 'name': '가리봉동'}, {'code': '<span class="hljs-number">1153010600</span>', 'name': '고척동'}, {'code': '<span class="hljs-number">1153010700</span>', 'name': '개봉동'}, {'code': '<span class="hljs-number">1153010800</span>', 'name': '오류동'}, {'code': '<span class="hljs-number">1153010900</span>', 'name': '궁동'}, {'code': '<span class="hljs-number">1153011000</span>', 'name': '온수동'}, {'code': '<span class="hljs-number">1153011100</span>', 'name': '천왕동'}, {'code': '<span class="hljs-number">1153011200</span>', 'name': '항동'}]}, {'sigungu_code': '<span class="hljs-number">1154</span>5', 'sigungu_name': '금천구', 'eup_myeon_dong': [{'code': '<span class="hljs-number">1154500000</span>', 'name': 'nan'}, {'code': '<span class="hljs-number">1154510100</span>', 'name': '가산동'}, {'code': '<span class="hljs-number">1154510200</span>', 'name': '독산동'}, {'code': '<span class="hljs-number">1154510300</span>', 'name': '시흥동'}]}, {'sigungu_code': '<span class="hljs-number">1156</span>0', 'sigungu_name': '영등포구', 'eup_myeon_dong': [{'code': '<span class="hljs-number">1156000000</span>', 'name': 'nan'}, {'code': '<span class="hljs-number">1156010100</span>', 'name': '영등포동'}, {'code': '<span class="hljs-number">1156010200</span>', 'name': '영등포동1가'}, {'code': '<span class="hljs-number">1156010300</span>', 'name': '영등포동2가'}, {'code': '<span class="hljs-number">1156010400</span>', 'name': '영등포동3가'}, {'code': '<span class="hljs-number">1156010500</span>', 'name': '영등포동4가'}, {'code': '<span class="hljs-number">1156010600</span>', 'name': '영등포동5가'}, {'code': '<span class="hljs-number">1156010700</span>', 'name': '영등포동6가'}, {'code': '<span class="hljs-number">1156010800</span>', 'name': '영등포동7가'}, {'code': '<span class="hljs-number">1156010900</span>', 'name': '영등포동8가'}, {'code': '<span class="hljs-number">1156011000</span>', 'name': '여의도동'}, {'code': '<span class="hljs-number">1156011100</span>', 'name': '당산동1가'}, {'code': '<span class="hljs-number">1156011200</span>', 'name': '당산동2가'}, {'code': '<span class="hljs-number">1156011300</span>', 'name': '당산동3가'}, {'code': '<span class="hljs-number">1156011400</span>', 'name': '당산동4가'}, {'code': '<span class="hljs-number">1156011500</span>', 'name': '당산동5가'}, {'code': '<span class="hljs-number">1156011600</span>', 'name': '당산동6가'}, {'code': '<span class="hljs-number">1156011700</span>', 'name': '당산동'}, {'code': '<span class="hljs-number">1156011800</span>', 'name': '도림동'}, {'code': '<span class="hljs-number">1156011900</span>', 'name': '문래동1가'}, {'code': '<span class="hljs-number">1156012000</span>', 'name': '문래동2가'}, {'code': '<span class="hljs-number">1156012100</span>', 'name': '문래동3가'}, {'code': '<span class="hljs-number">1156012200</span>', 'name': '문래동4가'}, {'code': '<span class="hljs-number">1156012300</span>', 'name': '문래동5가'}, {'code': '<span class="hljs-number">1156012400</span>', 'name': '문래동6가'}, {'code': '<span class="hljs-number">1156012500</span>', 'name': '양평동1가'}, {'code': '<span class="hljs-number">1156012600</span>', 'name': '양평동2가'}, {'code': '<span class="hljs-number">1156012700</span>', 'name': '양평동3가'}, {'code': '<span class="hljs-number">1156012800</span>', 'name': '양평동4가'}, {'code': '<span class="hljs-number">1156012900</span>', 'name': '양평동5가'}, {'code': '<span class="hljs-number">1156013000</span>', 'name': '양평동6가'}, {'code': '<span class="hljs-number">1156013100</span>', 'name': '양화동'}, {'code': '<span class="hljs-number">1156013200</span>', 'name': '신길동'}, {'code': '<span class="hljs-number">1156013300</span>', 'name': '대림동'}, {'code': '<span class="hljs-number">1156013400</span>', 'name': '양평동'}]}, {'sigungu_code': '<span class="hljs-number">1159</span>0', 'sigungu_name': '동작구', 'eup_myeon_dong': [{'code': '<span class="hljs-number">1159000000</span>', 'name': 'nan'}, {'code': '<span class="hljs-number">1159010100</span>', 'name': '노량진동'}, {'code': '<span class="hljs-number">1159010200</span>', 'name': '상도동'}, {'code': '<span class="hljs-number">1159010300</span>', 'name': '상도1동'}, {'code': '<span class="hljs-number">1159010400</span>', 'name': '본동'}, {'code': '<span class="hljs-number">1159010500</span>', 'name': '흑석동'}, {'code': '<span class="hljs-number">1159010600</span>', 'name': '동작동'}, {'code': '<span class="hljs-number">1159010700</span>', 'name': '사당동'}, {'code': '<span class="hljs-number">1159010800</span>', 'name': '대방동'}, {'code': '<span class="hljs-number">1159010900</span>', 'name': '신대방동'}]}, {'sigungu_code': '<span class="hljs-number">1162</span>0', 'sigungu_name': '관악구', 'eup_myeon_dong': [{'code': '<span class="hljs-number">1162000000</span>', 'name': 'nan'}, {'code': '<span class="hljs-number">1162010100</span>', 'name': '봉천동'}, {'code': '<span class="hljs-number">1162010200</span>', 'name': '신림동'}, {'code': '<span class="hljs-number">1162010300</span>', 'name': '남현동'}]}, {'sigungu_code': '<span class="hljs-number">1165</span>0', 'sigungu_name': '서초구', 'eup_myeon_dong': [{'code': '<span class="hljs-number">1165000000</span>', 'name': 'nan'}, {'code': '<span class="hljs-number">1165010100</span>', 'name': '방배동'}, {'code': '<span class="hljs-number">1165010200</span>', 'name': '양재동'}, {'code': '<span class="hljs-number">1165010300</span>', 'name': '우면동'}, {'code': '<span class="hljs-number">1165010400</span>', 'name': '원지동'}, {'code': '<span class="hljs-number">1165010600</span>', 'name': '잠원동'}, {'code': '<span class="hljs-number">1165010700</span>', 'name': '반포동'}, {'code': '<span class="hljs-number">1165010800</span>', 'name': '서초동'}, {'code': '<span class="hljs-number">1165010900</span>', 'name': '내곡동'}, {'code': '<span class="hljs-number">1165011000</span>', 'name': '염곡동'}, {'code': '<span class="hljs-number">1165011100</span>', 'name': '신원동'}]}, {'sigungu_code': '<span class="hljs-number">1168</span>0', 'sigungu_name': '강남구', 'eup_myeon_dong': [{'code': '<span class="hljs-number">1168000000</span>', 'name': 'nan'}, {'code': '<span class="hljs-number">1168010100</span>', 'name': '역삼동'}, {'code': '<span class="hljs-number">1168010300</span>', 'name': '개포동'}, {'code': '<span class="hljs-number">1168010400</span>', 'name': '청담동'}, {'code': '<span class="hljs-number">1168010500</span>', 'name': '삼성동'}, {'code': '<span class="hljs-number">1168010600</span>', 'name': '대치동'}, {'code': '<span class="hljs-number">1168010700</span>', 'name': '신사동'}, {'code': '<span class="hljs-number">1168010800</span>', 'name': '논현동'}, {'code': '<span class="hljs-number">1168011000</span>', 'name': '압구정동'}, {'code': '<span class="hljs-number">1168011100</span>', 'name': '세곡동'}, {'code': '<span class="hljs-number">1168011200</span>', 'name': '자곡동'}, {'code': '<span class="hljs-number">1168011300</span>', 'name': '율현동'}, {'code': '<span class="hljs-number">1168011400</span>', 'name': '일원동'}, {'code': '<span class="hljs-number">1168011500</span>', 'name': '수서동'}, {'code': '<span class="hljs-number">1168011800</span>', 'name': '도곡동'}]}, {'sigungu_code': '<span class="hljs-number">1171</span>0', 'sigungu_name': '송파구', 'eup_myeon_dong': [{'code': '<span class="hljs-number">1171000000</span>', 'name': 'nan'}, {'code': '<span class="hljs-number">1171010100</span>', 'name': '잠실동'}, {'code': '<span class="hljs-number">1171010200</span>', 'name': '신천동'}, {'code': '<span class="hljs-number">1171010300</span>', 'name': '풍납동'}, {'code': '<span class="hljs-number">1171010400</span>', 'name': '송파동'}, {'code': '<span class="hljs-number">1171010500</span>', 'name': '석촌동'}, {'code': '<span class="hljs-number">1171010600</span>', 'name': '삼전동'}, {'code': '<span class="hljs-number">1171010700</span>', 'name': '가락동'}, {'code': '<span class="hljs-number">1171010800</span>', 'name': '문정동'}, {'code': '<span class="hljs-number">1171010900</span>', 'name': '장지동'}, {'code': '<span class="hljs-number">1171011100</span>', 'name': '방이동'}, {'code': '<span class="hljs-number">1171011200</span>', 'name': '오금동'}, {'code': '<span class="hljs-number">1171011300</span>', 'name': '거여동'}, {'code': '<span class="hljs-number">1171011400</span>', 'name': '마천동'}]}, {'sigungu_code': '<span class="hljs-number">1174</span>0', 'sigungu_name': '강동구', 'eup_myeon_dong': [{'code': '<span class="hljs-number">1174000000</span>', 'name': 'nan'}, {'code': '<span class="hljs-number">1174010100</span>', 'name': '명일동'}, {'code': '<span class="hljs-number">1174010200</span>', 'name': '고덕동'}, {'code': '<span class="hljs-number">1174010300</span>', 'name': '상일동'}, {'code': '<span class="hljs-number">1174010500</span>', 'name': '길동'}, {'code': '<span class="hljs-number">1174010600</span>', 'name': '둔촌동'}, {'code': '<span class="hljs-number">1174010700</span>', 'name': '암사동'}, {'code': '<span class="hljs-number">1174010800</span>', 'name': '성내동'}, {'code': '<span class="hljs-number">1174010900</span>', 'name': '천호동'}, {'code': '<span class="hljs-number">1174011000</span>', 'name': '강일동'}]}]

필터된 시/군/구 리스트:
[{'sigungu_code': '<span class="hljs-number">1168</span>0', 'sigungu_name': '강남구', 'eup_myeon_dong': [{'code': '<span class="hljs-number">1168000000</span>', 'name': 'nan'}, {'code': '<span class="hljs-number">1168010100</span>', 'name': '역삼동'}, {'code': '<span class="hljs-number">1168010300</span>', 'name': '개포동'}, {'code': '<span class="hljs-number">1168010400</span>', 'name': '청담동'}, {'code': '<span class="hljs-number">1168010500</span>', 'name': '삼성동'}, {'code': '<span class="hljs-number">1168010600</span>', 'name': '대치동'}, {'code': '<span class="hljs-number">1168010700</span>', 'name': '신사동'}, {'code': '<span class="hljs-number">1168010800</span>', 'name': '논현동'}, {'code': '<span class="hljs-number">1168011000</span>', 'name': '압구정동'}, {'code': '<span class="hljs-number">1168011100</span>', 'name': '세곡동'}, {'code': '<span class="hljs-number">1168011200</span>', 'name': '자곡동'}, {'code': '<span class="hljs-number">1168011300</span>', 'name': '율현동'}, {'code': '<span class="hljs-number">1168011400</span>', 'name': '일원동'}, {'code': '<span class="hljs-number">1168011500</span>', 'name': '수서동'}, {'code': '<span class="hljs-number">1168011800</span>', 'name': '도곡동'}]}]
</pre>
<p><span style="color: #000000; text-align: start;">다음포스트에서는 공공데이터를 읽어와서, 컬럼이름을 수정하고, 전용면적을 평수로 계산하는 메소드를 구현해봅니다.</span></p>
<p><a href="https://2days.kr/14/09/06/56517/coding/data/">파이썬 부동산 매매가 조회 프로그램 만들기 1편</a></p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- CONTENT END 20 -->
]]></content:encoded>
					
		
		
		<media:content url="https://2days.kr/wp-content/uploads/2024/09/파이썬-부동산-매매가-조회-프로그램-만들기-2편-지역코드.png" medium="image"></media:content>
            	</item>
	</channel>
</rss>
