donut

'포토폴리오'에 해당되는 글 1건

  1. 네이버 부동산 단지정보 크롤링 4

네이버 부동산 단지정보 크롤링

Crawling

안녕하세요. 이번 포스팅 주제는 네이버 부동산 크롤링하기입니다.

 

이번이 두 번째 포스팅인데요.

 

지난번에 첫 번째 포스팅으론 파이썬의 기초인 자료형_숫자형에 대해 포스팅을 했었는데 ㅋㅋㅋㅋㅋ

너무 갑작스럽게 난이도가 올라간 포스팅을 하게 되어 저도 놀랍습니다. ㅋㅋㅋㅋ

 

네이버에는 정말 많은 정보가 들어있는데요, 오늘은 그 정보,

즉 데이타 중에서도 부동산 페이지에 있는 정보를 크롤링해 보려고 해요.

 

크롤링에 앞서 몇 가지 체크해보려고 합니다.

 

1. 어떤 정보가 필요한지

-> 아파트(단지) 별 준공일자와 거래 가능일의 정보

2. 왜 크롤링을 하는지

-> 수기로 검색한 후 복붙을 하면 되나, 주기적이고 반복적인 행동을 시스템화 시켜 일손을 줄이고자 함

3. 어디에 활용할 것인지

-> 업무에 활용하기 때문에 자세한 내용은 생략..ㅎㅎ

 

 

 

주의사항

이 글은 독자가 기본적인 파이썬 지식이 있다는 걸 감안하고 작성합니다.

주피터 노트북으로 작성하였습니다.

파이썬 버전은 3.7

크롬 드라이버 버전은 83입니다.

미리 전 처리된 검색 할 '단지명' 정보를 가지고 있다는 전제하에 작성합니다.

1. 크롤링할 데이터 확인

네이버 부동산 크롤링

크롤링 할 데이터를 확인해 볼게요

네이버 부동산에 '삼송자이더빌리지(6-3BL,도시형)을 검색해보면

'본 단지는 전매제한 단지입니다'라는 메시지와 함께 창이 열립니다.

그리고 단지정보를 클릭하면 오른쪽에 추가적인 패널이 생기는데요

가운데 잘 보면 준공 년월이 있어요

 

네이버 부동산 크롤링

아래로 창을 내리면 거래 가능일이 있죠. ㅎㅎㅎ

 

오늘은 이렇게 준공년월과, 거래가능일을 크롤링해올 겁니다.

저는 업무에서 활용하기 위해 이 정보를 크롤링했습니다만.

 

앞서 보여드린 사진에서 알 수 있듯이 다른 유용한 정보들도 크롤링하여

유익하게 활용할 수 있을 것 같습니다.

 

네이버부동산 크롤링

그럼 개발자 도구로 타깃을 미리 한번 살펴보았습니다.

-> 크롤링에서 느끼는 거지만 파이썬만가지곤 완벽한 크롤링을 하긴 힘드네요

->html, css, javascript, Ajax 등등 다른 지식들도 필요합니다.

 

표 detail_box--complex 안에 있는 내용이네요.. ㅋㅋㅋ 

어려울 것 같은 예감이 들죠?

이제 본격적으로 코딩 시작해 보겠습니다.

 

2.코딩

2-1 import

우선 필요한 모듈을 세팅했습니다.

 

numpy는 배열로 된 정보들을 다루기 위해 import 했습니다.

크롬 드라이버를 사용하기 위해 requests모듈로 세션을 할당해주고,

동작마다 딜레이를 넣어주기 위해 time,

그리고 강력한 크롤링 도구 selenium을 사용했습니다.

 

2-2 session

세션 할당 단계는 생략하겠습니다.

 

2-3 chromeedriver

크롬 드라이버를 실행해 줘야겠죠?

webdriver.Chrome('./chromedriver')

.//chromedriver' -> 현재 폴더에서 크롬 드라이버 선택

 

2-4 검색할 단지명 리스트 or배열 준비

arr = ['연지에코팰리스(아)','영통자이','더하이브B타워','LH어반리더스','마곡지구9단지','래미안리더스원']

저는 리스트로 준비했습니다.

 

우선 테스트 및 연습용으로 단지를 리스트 화하여 진행했었는데요,

실전에서는 전 처리된 데이터들이 배열 형식으로 저장되어있었습니다.

각 상황별 대처는 댓글로 문의하세요 ㅎㅎ

 

2-5 기능 코딩

네이버 부동산 크롤링

네 이 부분이 바로 네이버 부동산 크롤링의 주 내용입니다.

기능이라고 할 수 있겠는데요,

 

크게

1. 아파트명(단지명) 검색 / 2. 단지정보 검색 & 예외처리 파악 / 3. 준공 년월, 거래 가능일 검색 / 4. 실행단계 표시 / 5. 반복

5단계가 되도록 설계하였습니다.

 

3. 기능 코딩

3-1 리스트 생성 & 단지 검색

arr_len = len(arr) #단지명 리스트의 길이(반복할 횟수)

jungong_list = [] # 준공 년월을 담을 리스트
ganeng_list = [] # 거래 가능일을 담을 리스트
jungong_ganeng_list = [] # 위 두 리스트를 찾기 위해 사용할 여분의 리스트

 

반복문 시작을 알리고,

여분의 리스트는 계속해서 초기화를 진행해고,

네이버 부동산 페이지에 접속하 단지 명을 순차적으로 

검색창에 검색해 주려고 합니다.

elem_search = driver.find_element_by_class_name("search_input")

elem_search.clear()

elem_search.send_keys(danjiname)

elem_search.send_keys(Keys.RETURN)

네이버 검색창의 class name이 search input이네요, 해당 요소를 선택하여

초기화를 진행해주고,

단지명을 적어준 후 엔터키를 눌러주는 기능입니다.

 

3-2 단지정보 검색 & 예외처리 파악

제가 이 크롤링을 하면서 가장 애를 먹었던 부분입니다.

 

네이버 부동산 지도형 크롤링

 

우선 위 사진처럼 그냥 단지를 검색했을 때와(왼쪽), 잔 지정보를 클릭했을 때(오른쪽)의 소스코드가 상이하더라고요.

그러니까 단지정보를 클릭하여야 나오는 정보들은 '히든'으로 숨김 처리가 되어있고,

단지 정보 클릭을 해주는 액션을 취해주어야 정보가 표시되는 '동적' 자료였습니다.

 

동적 자료들을 긁어오기 위해, bs4가 아닌 selenium을 사용했습니다.

하나 xpath 등등으로 자료를 불러오려 했으나, 몇 가지 오류 및 예외 사항들을 처리하기 복잡하여

더 간편하고 확실한 방법을 선택했습니다.

 

button = driver.find_element_by_class_name("complex_link"). click()

바로 단지 벙 보 버튼을 클릭해주는 함수를 추가해 주었습니다.

 

그 후 순차적으로 제가 원하는 정보를 추출하는 코딩을 작성하고, 끝이 난 줄 알았으나,

예외 처리가 필요한 부분들이 속속들이 발견되었습니다.

 

제가 이 지도형 네이버 부동산 크롤링을 할 때

앞서 말씀드렸던 5단계로 진행하지 않았습니다.

1. 아파트명(단지명) 검색 / 2. 단지정보 검색 & 예외처리 파악 / 3. 준공 년월, 거래 가능일 검색 / 4. 실행단계 표시 / 5. 반복

이 5단계는 코딩이 끝난 후 정리하는 과정에서 이렇게 하면 편할 것이다~라는 가이드라인으로 제시한 것입니다.

 

실제론

1. 아파트명 검색 / 2. 단지정보 검색 / 3. 준공 년월 거래 가능일 검색 / 4. 예외처리 파악 / 5. 반복

이였는데요,

즉 2, 와 4가 조금 다릅니다.

 

코딩 작업 후반이 아닌 초반에 미리 발견하여 조치하면 더 좋을 것 이기 때문에 예외처리 파악을 2단계로 변경하여 포스팅을 합니다.

네이버 부동산 지도형 크롤링

우선 큰 예외 범주는 위 사진처럼 제가 가진 단지 이름을 검색 시

왼쪽처럼 표시되냐, 오른쪽처럼 표시되느냐입니다.

 

제가 가진 데이터가 전처리가 된 데이터임에도 불구하고 네이버에서 검색이 안 되는 경우가 있습니다.

여기서 데이터를 다룰 때 필요한 것 중 하나가 바로,

데이터에 대한 이해라고 생각합니다.

 

저는 검색이 안 되는 저 단지가 왜 목록에 존재했는지, 왜 검색이 안되는지

몇 가지 이유를 추론할 수 있었고, 어떻게 처리할 것인지 판단을 할 수 있었습니다.

데이터에 대한 이해가 없었다면 할 수 없었을 것입니다.

 

이외에도 전매제한이 이미 해제된 단지, 부분 전매인 단지, 준공 년월은 표시되어있지만 거래 가능일은 표시 안된 단지 등등의

오류를 파악하였고,

파이썬 예외처리 구문인 try, 그리고 if문을 활용하여 처리하였습니다.

 

3-3 준공 년월&거래 가능일

이제 정말 필요한 자료인 준공 년월과 거래 가능일을 크롤링해야 합니다.

위에서 단지 정보를 클릭했었는데요,

 

단지 정보를 클릭 시 요소 id 가 detailContents1인 것이 있습니다.

상위 요소를 선택하여 하향식으로 정보를 찾는 방법은 생략하겠습니다.

 

우선 제가 원하는 정보는 표에 있습니다.

표의 구성은 표 속성 th(세대수, 준공 년월)과 그에 할당되는 td value(100세대, 2020년 10월)들입니다.

즉 td값은 th에 종속되어있는 것을 알 수 있습니다.

 

detail = driver.find_element_by_id("detailContents1") 

deep1 = detail.find_elements_by_class_name('table_th') # 요소 detailContents1에서 클래스 name이 tableth인 것들을

deep1에 저장해 줍니다.

 

그 값들을 앞서 미리 여분으로 만들어둔 빈 리스트에 집어넣어주는데요,

 

이때 [.text]를 붙이냐 안 붙이냐가 차이가 큽니다.

 위와 같은 이유 때문에 text처리를 해주고 여분 리스트에 th값들을 반복문을 사용해 모두 집어넣어줬습니다.

그 후 빈 리스트에서 '준공 년월' , '거래 가능일'의 인덱스 번호를 각각 jungong_num, ganeng_num에 할당해 주고,

td정보가 들어있는 deep에서 각각의 인덱스에 맞는 값들을 불러옵니다.

 

ex

th(세대수, 준공 년월)의 정보가 들어있는 deep1을 텍스트 처리하여 빈 리스트에 저장하였고,

[0 : 세대수 , 1: 준공 년월  , 3 : 건설사.... ]에서 '준공 년월에 해당되는 인덱스 1을 불러와 jungong_num에 저장

 

td(200세대, 2020년 3월)의 정보가 들어있는 deep2

[0 : 200세대 , 1 : 2020년 3월 , 2 : 네이버 건설]에서  인데스 1의 값인 2020년 3월의 값을 불러옴

 

3-4. 실행단계 표시

테스트 용으로 6개만 하였지만, 실제로 크롤링은 대량으로 합니다.(최소 200개)

아래와 같은 이유로 크롤링에 딜레이를 넣었습니다.

 

1. 네이버에서 초 대량의 크롤링으로 인한 트래픽(요청) 증가 차단

2. 인터넷 속도 감안

3. 파이썬 셀레늄의 크롤링 속도 감안

 

따라서 자동으로 크롤링하는 시간이 발생합니다.

기다리는 사람으로 하여금 진행사항을 파악을 위해 print문을 활용하였습니다.

 

3-5 반복

현재 코드를 반복 문안에서 해주었기 때문에(설계단계부터 반복으로 했기 때문에)

따로 반복 처리를 하진 않습니다.

 

4. 후처리

네이버 부동산 지도형 매물 크롤링

DataFrame으로 방금 긁어온 자료들을 정돈하였습니다.

정돈된 DataFrame을 오늘 날짜 전매제한이라는 엑셀 파일에

sheet이름이 전매로 저장하였습니다.

 

네이버 부동산에서 전매제한 단지의 준공 년월과 전매 가능일을 크롤링을 해보았습니다.

여러 경우의 수를 감안하는 것을 끊임없이 생각하기 위해 노력했습니다.

 

질문은 댓글을 통해 남겨주세요.

응원과 격려 부탁드립니다.