🪧 About  
home
[출판사] 전기장판  
home

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

글쓴이
생성일
2019/06/14
카테고리
태그
5 more properties
네이버 부동산에서 지역과 조건을 설정했을 때, 목록에 뜨는 각 매물들의 세부정보를 불러오는 코드입니다. 부동산 서비스들이 전부 매물의 세부정보(세부설명)에 대한 검색이나 손쉬운 열람을 허용하지 않아서 만들었습니다.
자세한 설명은 추후 시간이 날 때 하도록 하겠습니다.
아래는 코드 전문입니다.

전체코드

# -*- coding: utf-8 -*- import requests import json import pandas as pd from pandas.io.json import json_normalize from urllib.request import Request, urlopen from bs4 import BeautifulSoup import numpy as np import time from datetime import datetime # %% 원하는 지역에서 부동산 추출 자동화 header = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.220 Whale/1.3.51.7 Safari/537.36', 'Referer': '<https://m.land.naver.com/>' } url = '<https://m.land.naver.com/cluster/ajax/articleList?itemId=&mapKey=&lgeo=&showR0=&rletTpCd=APT%3AOPST%3AVL%3AABYG%3AOBYG%3AJGC%3AJWJT%3ADDDGG%3ASGJT%3AHOJT%3AJGB%3AOR%3ASG%3ASMS%3AGJCG%3AGM%3ATJ&tradTpCd=B1&z=8&lat=37.5311046&lon=126.9936986&btm=37.4562759&lft=126.9366519&top=37.6028669&rgt=127.0508543&wprcMax=10000&spcMin=33&spcMax=99&totCnt=1938&sort=rank&page=>' df_full = pd.DataFrame() page = 1 while 1: resp = requests.get(url+str(page)) data = json.loads(resp.text) result = data['body'] if result == []: print('페이지가 {}페이지에 도달했습니다.'.format(page)) break df = pd.DataFrame.from_dict(json_normalize(result), orient='columns') df['매물소개'] = np.nan df['면적'] = np.nan df['atclNo'] for atclNo in df['atclNo']: req = Request('<https://m.land.naver.com/article/info/>' + atclNo, headers=header) res = urlopen(req) html = res.read() bs = BeautifulSoup(html, 'html.parser') tags = bs.findAll('div', attrs={'class': 'info_item info_item--intro'}) text = '' tags for tag in tags: text = text + tag.text df.loc[df['atclNo'] == atclNo, ['매물소개']] = text tags = bs.findAll('div', attrs={'class': 'info_item info_item--supply _spc_area'}) text = '' tags for tag in tags: text = text + tag.text df.loc[df['atclNo'] == atclNo, ['면적']] = text rand_value = np.random.randint(1, 3) time.sleep(rand_value) df_full = pd.concat([df_full, df]) page += 1 # %% 원하는 조건만 남기기 df_want = df_full[df_full.atclFetrDesc.str.contains('중기청' or '중소기업', na=False) | df_full.매물소개.str.contains('중기청' or '중소기업', na=False)] df_want = df_want[df_want['면적'].apply(lambda d: float(d.split()[1].split('/')[1].split('㎡')[0])) > 30] df_want['매물주소'] = df_want['atclNo'].apply(lambda d: '<https://m.land.naver.com/article/info/>' + d) df_want['전용면적'] = df_want['면적'].apply(lambda d: float(d.split()[1].split('/')[1].split('㎡')[0])) df_want['공급면적'] = df_want['면적'].apply(lambda d: d.split()[1].split('/')[0]) df_want = df_want[['atclFetrDesc', '전용면적', '공급면적', 'flrInfo', 'hanPrc', 'rletTpNm', '매물소개', '매물주소']] # %% 저장하기 now = datetime.now() now_str = str('{}{}{}').format(now.year, now.month, now.day) df_want.to_excel('S:/내 드라이브/09_git/Py-Projects/0004/data/estate_naver(' + now_str + ').xlsx', sheet_name='Sheet1', header=True, index=False)
Plain Text
Copyright ⓒ 2022 SADAM Media All Rights Reserved.
사담미디어(SADAM Media) / 사업자번호: 703-37-00838