웹 크롤링으로 데이터 가져오기
웹 크롤링이란?
웹 크롤링(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