데이터 분석/강의 노트

웹 크롤링으로 데이터 가져오기

hyunseo 2024. 7. 7. 17:57

웹 크롤링이란?

웹 크롤링(Web Crawling)은 인터넷 상에서 웹 페이지들을 자동으로 탐색하여 정보를 수집하는 프로세스를 말합니다. 웹 크롤러는 일종의 소프트웨어로, 웹 페이지에 접근하여 그 안에 있는 내용을 추출하고 데이터베이스나 파일에 저장합니다. 주로 검색 엔진이나 가격 비교 사이트에서 제품 정보를 수집하거나, 뉴스 사이트에서 최신 기사를 수집하는 등 다양한 목적으로 사용됩니다.

 

웹 크롤링은 HTTP 요청을 이용하여 웹 서버에 접근하고, HTML 등의 문서 형식을 파싱하여 원하는 정보를 추출하는 과정을 포함합니다. 이러한 기술을 이용하여 대량의 데이터를 자동으로 수집하고 분석할 수 있어, 정보 수집과 처리에 효율적인 방법으로 활용됩니다.

 

selenium 불러오기

import 키워드로 selenium을 불러옵니다. 잘 불러와졌는지 확인하려면 __version__을 이용해 버전을 확인해줍니다. 제대로 selenium을 제대로 가지고 왔다면 selenium의 버전이 출력됩니다.

 

만약 버전 확인에서 오류가 난다면 설치가 안 된 것이기 때문에 설치해줍니다.

!pip3 install selenium

 

import selenium

selenium.__version__

 

크롬 웹 드라이버 설치하기

selenium으로 크롤링을 하기 위해 웹 드라이버 매니저와 크롬 웹 드라이버도 함께 설치해 주어야 합니다. 아래의 코드를 순서대로 진행해주세요.

 

ChromeDriverManager().install()을 실행했을 때 /Users/.../chromedriver/ 처럼 설치 경로가 출력되면 설치가 완료된 것입니다.

!pip3 install webdriver-manager

 

from webdriver_manager.chrome import ChromeDriverManager
ChromeDriverManager().install()

 

브라우저 열기

selenium과 웹 드라이버를 설치했다면 브라우저를 열 수 있습니다. selenium에서 webdriver를 import한 후, 크롬 창을 열어줍니다.

from selenium import webdriver
driver = webdriver.Chrome()

 

브라우저가 잘 열렸다면 특정한 url로 이동해봅시다. 특정 사이트로 이동하기 위해서는 get() 함수를 사용합니다.

driver.get('https://www.naver.com')

 

네이버 부동산 데이터 가져오기

예시로, 네이버 부동산에서 데이터를 가져와 보도록 하겠습니다. selenium으로 특정한 HTML 요소를 선택하기 위해서 By를 먼저 import합니다.

from selenium.webdriver.common.by import By

 

HTML 요소를 선택할 때는 find_element() 함수를 이용합니다. HTML 요소의 특성을 고려하여 적절한 방법으로 HTML 요소를 선택해줍니다. 자세한 사항은 selenium 문서를 확인하세요.

 

클래스 이름을 사용해서 아파트 매매 실거래가를 가져와보도록 하겠습니다.

 

개발자도구 요소 탐색기
개발자도구 요소 탐색

data = driver.find_element(By.CLASS_NAME, 'complex_price--trade')
data
# <selenium.webdriver.remote.webelement.WebElement (...)>

 

data를 확인해보면 selenium의 웹 엘리먼트로 가져와진 것을 알 수 있습니다. 텍스트만 가져오고 싶다면 .text를 사용합니다.

data.text
# '최근 매매 실거래가\n16억 3,000\n2024.06.09, 6층, 152㎡'

 

위의 이미지에서 파란색 박스가 쳐진 부분의 텍스트가 가져와진 것을 볼 수 있습니다. 가격만 확인하고 싶다면 split() 함수로 줄바꿈을 기준으로 텍스트를 나눠준 뒤 두 번째 요소를 가져옵니다.

data.text.split('\n')[1]
# '16억 3,000'

 

같은 클래스를 가진 여러 개의 엘리먼트 가져오기

find_element() 함수는 똑같은 클래스의 요소가 여러 개 있으면 처음의 한 개만 가져옵니다. 만약 같은 클래스명을 가진 여러 개의 엘리먼트를 가져오고 싶다면 find_elements() 함수를 사용합니다.

datas = driver.find_elements(By.CLASS_NAME, 'item')
datas
# [<selenium.webdriver.remote.webelement.WebElement (session="aad7ff8afa8d25ddbd54467940363647", element="f.67AB6627B9C879BA3E25AF5DEC200DD5.d.1DF2E857CC08D0AE5EC761C81AE8E6E0.e.360")>, <selenium.webdriver.remote.webelement.WebElement (session="aad7ff8afa8d25ddbd54467940363647", element="f.67AB6627B9C879BA3E25AF5DEC200DD5.d.1DF2E857CC08D0AE5EC761C81AE8E6E0.e.361")>,...]

 

보시는 바와 같이, find_elements()를 사용하면 리스트의 형태로 데이터가 리턴됩니다. 그러면 datas를 for문을 이용해서 필요한 데이터를 뽑아줍니다.

data_list = []
for data in datas:
    name = data.find_element(By.CLASS_NAME, 'item_title').text
    price = data.find_element(By.CLASS_NAME, 'price_line').text
    info = data.find_element(By.CLASS_NAME, 'info_area').text
    size = info.split('\n')[0]
    desc = info.split('\n')[1]

    data_list.append({
        '동정보': name,
        '가격': price,
        '평형': size,
        '소개글': desc
    })

 

데이터 CSV 파일로 저장하기

저장한 데이터는 어딘가에 저장해놓지 않으면 사라집니다. 위의 코드를 활용하기 위해서는 어딘가에 저장을 해야 합니다. 이번에는 CSV 파일로 저장해보겠습니다. 저장을 위해서, pandas의 to_csv() 함수를 사용합니다.

import pandas as pd

df = pd.DataFrame(data_list)
df.to_csv('부동산_데이터.csv', encoding="utf-8-sig")

 

이렇게 하면 수집한 데이터를 파일로 저장할 수 있습니다.

 


 

드디어 기초적인 문법 수업을 마치고 웹 크롤링 실습을 해보았습니다. 패스트캠퍼스가 시작되고 처음으로 제대로 하는 실습이라 그런지 재미도 있고 신기하기도 했습니다. 강사님께서 코드를 보여주는 사람 중에 비효율적으로 코드를 짜는 사람이 있다고 했는데 그게 왠지 저인 것 같고 그러네요. 사실 페이지 조작 없이 그냥 있는 데이터를 가져오기만 하는 거라 객관적으로 보자면 이번 수업이 난이도는 그다지 높지는 않았던 것 같은데 왜 제가 봐도 제 코드가 뭐랄까, 개선의 여지가 많은 코드처럼 느껴졌습니다. 그래도 뭔가 조금만 하면 더 잘할 수 있을 것 같은 느낌이 들기도 합니다. 진도는 계속 나가고 웹 크롤링에만 모든 시간을 쏟을 수 없으니 이 기회에 제대로 복습해서 제 것으로 만들고 넘어가야 겠다고 생각했습니다.

 

 

 

웹 크롤링: 구글 플레이스토어에서 리뷰 데이터 가져오기

저번 시간에 크롤링에 대해서 배웠습니다. 이번 시간에는 조금 더 복잡한 작업을 수행하는 방법에 대해 배웠습니다. input에 텍스트 입력하기, 스크롤하기 등을 통해 구글 플레이스토어에서 리뷰

dararium.tistory.com