본문 바로가기
카테고리 없음

[부동산지인 크롤링] 지역/기간별 미분양 세대수 수집하는 파이썬 코드

by 일코 2023. 2. 7.

유튜브의 부동산지인 크롤링 시리즈 중
미분양세대수 수집 프로그램의 최종코드입니다.

미분양데이터 크롤링 1부
미분양데이터 크롤링 2부

파이썬 소스코드

city_list = [
    ["1100000000", "1168000000"],  # 서울특별시 강남구
    ["1100000000", "1174000000"],  # 서울특별시 강동구
    ["1100000000", "1130500000"],  # 서울특별시 강북구
    ["1100000000", "1150000000"],  # 서울특별시 강서구
    ["1100000000", "1162000000"],  # 서울특별시 관악구
    ["1100000000", "1121500000"],  # 서울특별시 광진구
    ["1100000000", "1153000000"],  # 서울특별시 구로구
    ["1100000000", "1154500000"],  # 서울특별시 금천구
    ["1100000000", "1135000000"],  # 서울특별시 노원구
    ["1100000000", "1132000000"],  # 서울특별시 도봉구
    ["1100000000", "1123000000"],  # 서울특별시 동대문구
    ["1100000000", "1159000000"],  # 서울특별시 동작구
    ["1100000000", "1144000000"],  # 서울특별시 마포구
    ["1100000000", "1141000000"],  # 서울특별시 서대문구
    ["1100000000", "1165000000"],  # 서울특별시 서초구
    ["1100000000", "1120000000"],  # 서울특별시 성동구
    ["1100000000", "1129000000"],  # 서울특별시 성북구
    ["1100000000", "1171000000"],  # 서울특별시 송파구
    ["1100000000", "1147000000"],  # 서울특별시 양천구
    ["1100000000", "1156000000"],  # 서울특별시 영등포구
    ["1100000000", "1117000000"],  # 서울특별시 용산구
    ["1100000000", "1138000000"],  # 서울특별시 은평구
    ["1100000000", "1111000000"],  # 서울특별시 종로구
    ["1100000000", "1114000000"],  # 서울특별시 중구
    ["1100000000", "1126000000"],  # 서울특별시 중랑구

    ["2600000000", "2644000000"],  # 부산광역시 강서구
    ["2600000000", "2641000000"],  # 부산광역시 금정구
    ["2600000000", "2671000000"],  # 부산광역시 기장군
    ["2600000000", "2629000000"],  # 부산광역시 남구
    ["2600000000", "2617000000"],  # 부산광역시 동구
    ["2600000000", "2626000000"],  # 부산광역시 동래구
    ["2600000000", "2623000000"],  # 부산광역시 부산진구
    ["2600000000", "2632000000"],  # 부산광역시 북구
    ["2600000000", "2653000000"],  # 부산광역시 사상구
    ["2600000000", "2638000000"],  # 부산광역시 사하구
    ["2600000000", "2614000000"],  # 부산광역시 서구
    ["2600000000", "2650000000"],  # 부산광역시 수영구
    ["2600000000", "2647000000"],  # 부산광역시 연제구
    ["2600000000", "2620000000"],  # 부산광역시 영도구
    ["2600000000", "2611000000"],  # 부산광역시 중구
    ["2600000000", "2635000000"],  # 부산광역시 해운대구

    ["2700000000", "2720000000"],  # 대구광역시 남구
    ["2700000000", "2729000000"],  # 대구광역시 달서구
    ["2700000000", "2771000000"],  # 대구광역시 달성군
    ["2700000000", "2714000000"],  # 대구광역시 동구
    ["2700000000", "2723000000"],  # 대구광역시 북구
    ["2700000000", "2717000000"],  # 대구광역시 서구
    ["2700000000", "2726000000"],  # 대구광역시 수성구
    ["2700000000", "2711000000"],  # 대구광역시 중구

    ["2800000000", "2871000000"],  # 인천광역시 강화군
    ["2800000000", "2824500000"],  # 인천광역시 계양구
    ["2800000000", "2820000000"],  # 인천광역시 남동구
    ["2800000000", "2814000000"],  # 인천광역시 동구
    ["2800000000", "2817700000"],  # 인천광역시 미추홀구
    ["2800000000", "2823700000"],  # 인천광역시 부평구
    ["2800000000", "2826000000"],  # 인천광역시 서구
    ["2800000000", "2818500000"],  # 인천광역시 연수구
    ["2800000000", "2872000000"],  # 인천광역시 옹진군
    ["2800000000", "2811000000"],  # 인천광역시 중구

    ["2900000000", "2920000000"],  # 광주광역시 광산구
    ["2900000000", "2915500000"],  # 광주광역시 남구
    ["2900000000", "2911000000"],  # 광주광역시 동구
    ["2900000000", "2917000000"],  # 광주광역시 북구
    ["2900000000", "2914000000"],  # 광주광역시 서구

    ["3000000000", "3023000000"],  # 대전광역시 대덕구
    ["3000000000", "3011000000"],  # 대전광역시 동구
    ["3000000000", "3017000000"],  # 대전광역시 서구
    ["3000000000", "3020000000"],  # 대전광역시 유성구
    ["3000000000", "3014000000"],  # 대전광역시 중구

    ["3100000000", "3114000000"],  # 울산광역시 남구
    ["3100000000", "3117000000"],  # 울산광역시 동구
    ["3100000000", "3120000000"],  # 울산광역시 북구
    ["3100000000", "3171000000"],  # 울산광역시 울주군
    ["3100000000", "3111000000"],  # 울산광역시 중구

    ["3600000000", "3611000000"],  # 세종특별자치시 세종시

    ["4100000000", "4182000000"],  # 경기도 가평군
    ["4100000000", "4128000000"],  # 경기도 고양시
    ["4100000000", "4129000000"],  # 경기도 과천시
    ["4100000000", "4121000000"],  # 경기도 광명시
    ["4100000000", "4161000000"],  # 경기도 광주시
    ["4100000000", "4131000000"],  # 경기도 구리시
    ["4100000000", "4141000000"],  # 경기도 군포시
    ["4100000000", "4157000000"],  # 경기도 김포시
    ["4100000000", "4136000000"],  # 경기도 남양주시
    ["4100000000", "4125000000"],  # 경기도 동두천시
    ["4100000000", "4119000000"],  # 경기도 부천시
    ["4100000000", "4113000000"],  # 경기도 성남시
    ["4100000000", "4111000000"],  # 경기도 수원시
    ["4100000000", "4139000000"],  # 경기도 시흥시
    ["4100000000", "4127000000"],  # 경기도 안산시
    ["4100000000", "4155000000"],  # 경기도 안성시
    ["4100000000", "4117000000"],  # 경기도 안양시
    ["4100000000", "4163000000"],  # 경기도 양주시
    ["4100000000", "4183000000"],  # 경기도 양평군
    ["4100000000", "4167000000"],  # 경기도 여주시
    ["4100000000", "4180000000"],  # 경기도 연천군
    ["4100000000", "4137000000"],  # 경기도 오산시
    ["4100000000", "4146000000"],  # 경기도 용인시
    ["4100000000", "4143000000"],  # 경기도 의왕시
    ["4100000000", "4115000000"],  # 경기도 의정부시
    ["4100000000", "4150000000"],  # 경기도 이천시
    ["4100000000", "4148000000"],  # 경기도 파주시
    ["4100000000", "4122000000"],  # 경기도 평택시
    ["4100000000", "4165000000"],  # 경기도 포천시
    ["4100000000", "4145000000"],  # 경기도 하남시
    ["4100000000", "4159000000"],  # 경기도 화성시

    ["4200000000", "4215000000"],  # 강원도 강릉시
    ["4200000000", "4282000000"],  # 강원도 고성군
    ["4200000000", "4217000000"],  # 강원도 동해시
    ["4200000000", "4223000000"],  # 강원도 삼척시
    ["4200000000", "4221000000"],  # 강원도 속초시
    ["4200000000", "4280000000"],  # 강원도 양구군
    ["4200000000", "4283000000"],  # 강원도 양양군
    ["4200000000", "4275000000"],  # 강원도 영월군
    ["4200000000", "4213000000"],  # 강원도 원주시
    ["4200000000", "4281000000"],  # 강원도 인제군
    ["4200000000", "4277000000"],  # 강원도 정선군
    ["4200000000", "4278000000"],  # 강원도 철원군
    ["4200000000", "4211000000"],  # 강원도 춘천시
    ["4200000000", "4219000000"],  # 강원도 태백시
    ["4200000000", "4276000000"],  # 강원도 평창군
    ["4200000000", "4272000000"],  # 강원도 홍천군
    ["4200000000", "4279000000"],  # 강원도 화천군
    ["4200000000", "4273000000"],  # 강원도 횡성군

    ["4300000000", "4376000000"],  # 충청북도 괴산군
    ["4300000000", "4380000000"],  # 충청북도 단양군
    ["4300000000", "4372000000"],  # 충청북도 보은군
    ["4300000000", "4374000000"],  # 충청북도 영동군
    ["4300000000", "4373000000"],  # 충청북도 옥천군
    ["4300000000", "4377000000"],  # 충청북도 음성군
    ["4300000000", "4315000000"],  # 충청북도 제천시
    ["4300000000", "4374500000"],  # 충청북도 증평군
    ["4300000000", "4375000000"],  # 충청북도 진천군
    ["4300000000", "4311000000"],  # 충청북도 청주시
    ["4300000000", "4313000000"],  # 충청북도 충주시

    ["4400000000", "4425000000"],  # 충청남도 계룡시
    ["4400000000", "4415000000"],  # 충청남도 공주시
    ["4400000000", "4471000000"],  # 충청남도 금산군
    ["4400000000", "4423000000"],  # 충청남도 논산시
    ["4400000000", "4427000000"],  # 충청남도 당진시
    ["4400000000", "4418000000"],  # 충청남도 보령시
    ["4400000000", "4476000000"],  # 충청남도 부여군
    ["4400000000", "4421000000"],  # 충청남도 서산시
    ["4400000000", "4477000000"],  # 충청남도 서천군
    ["4400000000", "4420000000"],  # 충청남도 아산시
    ["4400000000", "4481000000"],  # 충청남도 예산군
    ["4400000000", "4413000000"],  # 충청남도 천안시
    ["4400000000", "4479000000"],  # 충청남도 청양군
    ["4400000000", "4482500000"],  # 충청남도 태안군
    ["4400000000", "4480000000"],  # 충청남도 홍성군

    ["4500000000", "4579000000"],  # 전라북도 고창군
    ["4500000000", "4513000000"],  # 전라북도 군산시
    ["4500000000", "4521000000"],  # 전라북도 김제시
    ["4500000000", "4519000000"],  # 전라북도 남원시
    ["4500000000", "4573000000"],  # 전라북도 무주군
    ["4500000000", "4580000000"],  # 전라북도 부안군
    ["4500000000", "4577000000"],  # 전라북도 순창군
    ["4500000000", "4571000000"],  # 전라북도 완주군
    ["4500000000", "4514000000"],  # 전라북도 익산시
    ["4500000000", "4575000000"],  # 전라북도 임실군
    ["4500000000", "4574000000"],  # 전라북도 장수군
    ["4500000000", "4511000000"],  # 전라북도 전주시
    ["4500000000", "4518000000"],  # 전라북도 정읍시
    ["4500000000", "4572000000"],  # 전라북도 진안군

    ["4600000000", "4681000000"],  # 전라남도 강진군
    ["4600000000", "4677000000"],  # 전라남도 고흥군
    ["4600000000", "4672000000"],  # 전라남도 곡성군
    ["4600000000", "4623000000"],  # 전라남도 광양시
    ["4600000000", "4673000000"],  # 전라남도 구례군
    ["4600000000", "4617000000"],  # 전라남도 나주시
    ["4600000000", "4671000000"],  # 전라남도 담양군
    ["4600000000", "4611000000"],  # 전라남도 목포시
    ["4600000000", "4684000000"],  # 전라남도 무안군
    ["4600000000", "4678000000"],  # 전라남도 보성군
    ["4600000000", "4615000000"],  # 전라남도 순천시
    ["4600000000", "4691000000"],  # 전라남도 신안군
    ["4600000000", "4613000000"],  # 전라남도 여수시
    ["4600000000", "4687000000"],  # 전라남도 영광군
    ["4600000000", "4683000000"],  # 전라남도 영암군
    ["4600000000", "4689000000"],  # 전라남도 완도군
    ["4600000000", "4688000000"],  # 전라남도 장성군
    ["4600000000", "4680000000"],  # 전라남도 장흥군
    ["4600000000", "4690000000"],  # 전라남도 진도군
    ["4600000000", "4686000000"],  # 전라남도 함평군
    ["4600000000", "4682000000"],  # 전라남도 해남군
    ["4600000000", "4679000000"],  # 전라남도 화순군

    ["4700000000", "4729000000"],  # 경상북도 경산시
    ["4700000000", "4713000000"],  # 경상북도 경주시
    ["4700000000", "4783000000"],  # 경상북도 고령군
    ["4700000000", "4719000000"],  # 경상북도 구미시
    ["4700000000", "4772000000"],  # 경상북도 군위군
    ["4700000000", "4715000000"],  # 경상북도 김천시
    ["4700000000", "4728000000"],  # 경상북도 문경시
    ["4700000000", "4792000000"],  # 경상북도 봉화군
    ["4700000000", "4725000000"],  # 경상북도 상주시
    ["4700000000", "4784000000"],  # 경상북도 성주군
    ["4700000000", "4717000000"],  # 경상북도 안동시
    ["4700000000", "4777000000"],  # 경상북도 영덕군
    ["4700000000", "4776000000"],  # 경상북도 영양군
    ["4700000000", "4721000000"],  # 경상북도 영주시
    ["4700000000", "4723000000"],  # 경상북도 영천시
    ["4700000000", "4790000000"],  # 경상북도 예천군
    ["4700000000", "4794000000"],  # 경상북도 울릉군
    ["4700000000", "4793000000"],  # 경상북도 울진군
    ["4700000000", "4773000000"],  # 경상북도 의성군
    ["4700000000", "4782000000"],  # 경상북도 청도군
    ["4700000000", "4775000000"],  # 경상북도 청송군
    ["4700000000", "4785000000"],  # 경상북도 칠곡군
    ["4700000000", "4711000000"],  # 경상북도 포항시

    ["4800000000", "4831000000"],  # 경상남도 거제시
    ["4800000000", "4888000000"],  # 경상남도 거창군
    ["4800000000", "4882000000"],  # 경상남도 고성군
    ["4800000000", "4825000000"],  # 경상남도 김해시
    ["4800000000", "4884000000"],  # 경상남도 남해군
    ["4800000000", "4827000000"],  # 경상남도 밀양시
    ["4800000000", "4824000000"],  # 경상남도 사천시
    ["4800000000", "4886000000"],  # 경상남도 산청군
    ["4800000000", "4833000000"],  # 경상남도 양산시
    ["4800000000", "4872000000"],  # 경상남도 의령군
    ["4800000000", "4817000000"],  # 경상남도 진주시
    ["4800000000", "4874000000"],  # 경상남도 창녕군
    ["4800000000", "4812000000"],  # 경상남도 창원시
    ["4800000000", "4822000000"],  # 경상남도 통영시
    ["4800000000", "4885000000"],  # 경상남도 하동군
    ["4800000000", "4873000000"],  # 경상남도 함안군
    ["4800000000", "4887000000"],  # 경상남도 함양군
    ["4800000000", "4889000000"],  # 경상남도 합천군

    ["5000000000", "5013000000"],  # 제주특별자치도 서귀포시
    ["5000000000", "5011000000"],  # 제주특별자치도 제주시
]

from time import sleep

import chromedriver_autoinstaller
import pandas as pd
from selenium import webdriver
from selenium.common import UnexpectedAlertPresentException, NoAlertPresentException
from selenium.webdriver import ActionChains as ac
from selenium.webdriver.common.by import By

chromedriver_autoinstaller.install()
driver = webdriver.Chrome()

driver.implicitly_wait(5)
driver.maximize_window()

driver.get("https://www.aptgin.com/homeLogin")
driver.find_element(By.ID, "user_id1").send_keys("여러분의아이디")
driver.find_element(By.ID, "password1").send_keys("여러분의암호")
driver.find_element(By.CSS_SELECTOR, "button.btn.btn-primary.logbtn").click()

sleep(1)
try:
    driver.switch_to.alert.accept()
except [UnexpectedAlertPresentException, NoAlertPresentException]:
    pass

driver.get("https://www.aptgin.com/home/gin04/gin0403")


for i, j in city_list:
    driver.find_element(By.ID, "regionTxt").click()
    driver.find_element(By.CSS_SELECTOR, f'button[data-code="{i}"]').click()
    driver.find_element(By.CSS_SELECTOR, f'button[data-code="{j}"]').click()

    # 검색버튼 클릭
    driver.find_element(By.CSS_SELECTOR, "button.btn-submit").click()

    # 엑셀파일 이름 정하기 : 차트 제목에서 추출
    sleep(1)
    filename = driver.find_element(By.CSS_SELECTOR, "text.highcharts-title > tspan").text
    print(filename)

    # 2010-01월 마우스를 갖다대고 데이터 취득
    # hover
    elem = driver.find_element(By.CSS_SELECTOR, "path.highcharts-graph")
    ac(driver).move_to_element(elem).move_by_offset(xoffset=-544, yoffset=-10).perform()
    # driver.execute_script("window.scrollBy(0, 100);")

    미분양리스트 = []


    data = driver.find_elements(By.CSS_SELECTOR, 'text[style="font-size:12px;color:#333333;cursor:default;fill:#333333;"]')
    연월 = data[0].text
    미분양_전체 = data[1].text.replace("● 미분양(전체): ", "")
    미분양_준공후 = data[2].text.replace("● 미분양(준공후): ", "")

    # 데이터dict를 "list"에 추가
    미분양리스트.append({"연월": 연월, "전체": 미분양_전체, "준공후": 미분양_준공후})

    # 아주 조금 오른쪽으로 옮기기를 반복하면서
    while True:
        ac(driver).move_by_offset(xoffset=6, yoffset=0).perform()
        data = driver.find_elements(By.CSS_SELECTOR,
                                    'text[style="font-size:12px;color:#333333;cursor:default;fill:#333333;"]')
        연월 = data[0].text
        미분양_전체 = data[1].text.replace("● 미분양(전체): ", "")
        try:
            미분양_준공후 = data[2].text.replace("● 미분양(준공후): ", "")
        except IndexError:
            미분양_준공후 = 0
        미분양리스트.append({"연월": 연월, "전체": 미분양_전체, "준공후": 미분양_준공후})
        print(연월, 미분양_전체, 미분양_준공후)

        if not 연월:
            break

    # 데이터프레임 생성
    df = pd.DataFrame(미분양리스트[:-1])
    # 중복 제거
    df = df.drop_duplicates()

    # 데이터프레임 엑셀저장(파일명은 차트제목)
    df.to_excel(f"{filename}.xlsx")
driver.quit()

질문은 유튜브나 블로그에 댓글로 남겨주세요.

 

행복한 하루 되세요!!!ㅋ

댓글