Python Library/웹 크롤링

[웹 크롤링 - Python] BeautifulSoup(Requests, Selenium)의 응용(1)

바보1 2022. 2. 2. 18:35

 

이번 시간에는 네이버 부동산의 정보를 csv에 저장하는 프로그램을 만들어 보았습니다.

 

아파트 이름을 적으면 알아서 웹 크롤링을 해와서 csv파일에 저장하는 방식입니다.

 

하지만 이 코드의 문제점은 최대 19개밖에 못 가져온다는 것인데, 이는 네이버 부동산의 판매 정보칸이 있는데, 여기서 스크롤을 내려야 GET으로 추가 판매 정보를 가져오더라구요 ..

 

그래서 추가 판매 정보를 가져오는 녀석의 헤더와 쿠키, auth 정보를 따서 재요청하려고 했는데, 이건 제가 아직 지식을 덜 쌓아서 못 했습니다...

 

그래서 아래의 코드는 사이트에 들어가면 바로 나와있는 정보만 가져오는 반쪽짜리 코드라 할 수 있네요 ㅠㅠ

 

from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import csv

# csv파일 생성
f = open('apartment.csv', 'w', encoding="utf-8-sig", newline='')
w = csv.writer(f)
w.writerow(['거래', '면적', '가격', '동', '상세 설명'])

# 아래의 함수를 사용하여 크롬 창을 열지 않고 백그라운드로 실행
option = webdriver.ChromeOptions()
option.add_argument('headless')

# 옵션에 위에서 만든 option을 추가
url = 'http://naver.com'
browser = webdriver.Chrome(options=option)
browser.get(url)

browser.find_element(By.ID, 'query').send_keys("동대구 에일린의뜰", Keys.ENTER)
url = browser.find_element(By.CLASS_NAME, 'api_more_theme').get_attribute('href')
browser.get(url)

# 해당하는 페이지의 HTML 소스를 어서 BeautifulSoup 객체로 만듬
soup = BeautifulSoup(browser.page_source, 'lxml')

browser.quit()

# 아래의 문장은 soup.find('div', attrs={'class': 'item_link'})와 같은 문장임
# 대신 select를 이용하면 아래와 같이 .price_line > .price와 같이 태그간의 이동이 유용함
datas = soup.select('.item_link')

for i,data in enumerate(datas):
    print(f'========== 매물{i} ==========')
    type = data.select('.price_line > .type')[0].string
    print(f'거래 : {type}')
    spec = data.select('.info_area .spec')
    print(f'면적 : {spec[0].string}')
    price = data.select('.price_line > .price')[0].string
    print(f"가격 : {price}")
    where = data.select('.item_title > .text')[0].string.split()[1]
    print(f"동 : {where}")
    print(f'상세 설명 : {spec[1].string}')
    w.writerow([type, spec[0].string, price, where, spec[1].string])

f.close()

 

사실 추가된 내용은 csv와 option, headless, select가 전부인데, 이는 위의 예제를 통해 충분히 따라할 수 있으므로 따로 설명을 추가하지는 않겠습니다!

 

 

참고 : 나도코딩