어느덧 인턴 4주차. 시간이 정말 빠르다👍
그럼에도 불구하고 내가 한 일은
1. 밸런스 게임 만들어서 aws를 통해 배포하기
2. 크롤링을 통한 데이터 수집
이게 전부였다
하고 싶은 공부는 많지만 일하는 내 모습조차도 부족해보이고
이런저런 기초공사가 필요해보인다😡
그래서 오늘은 crawling의 필수템 Selenium과 BeautifulSoup에 대해 포스팅 하려고 한다
제가 수업 때 들은 건데요. 데이터분석가의 70% 이상은 데이터 수집이라고 합니다 따단
안그래도 이번에 내가 수집한 자료들 전처리 짝꿍이 해야 해서 엄청 힘들어했다. 고멘.. 근데 나도 힘들어
이 포스팅을 올리고 나서 크롤링에 대한 포스트를 읽었는데, 내가 다루는 내용은 스크래핑에 더 적합한 말 같다. 아주 기초적이고 전문적인 것과는 거리가 먼 포스팅이지만 삐약이니까 봐줘 응애 (내가 본 포스팅은 크롤링이라고 벨로그에 검색하면 나오는 유명한 분의 글이었다. 한번쯤 읽어보면 좋겠다)
개발자 과정을 들으면서 크롤링이란 단어를 처음 접했는데, (심지어 빅데이터분석기사 시험에도 나온다)
쉽게 말하면 인간의 손을 거치지않고 코드가 알아서 웹 상의 정보를 수집해주는 것을 말한다
흔히 긁어온다는 말을 많이 쓰는데 나도 엄청 긁어온다🧹
파이썬을 통해 웹에서 정보를 가져오기 위해선 적당한 라이브러리가 필요한데, 가장 많이 쓰이는게 앞서 말한 두 가지!
셀레니움은 브라우저를 자동화할 수 있는 도구로, 자바스크립트로 동적으로 로드되는 콘텐츠를 포함한 모든 웹 페이지 요소와 상호작용이 가능하다.
이 부분에서 큰 매력을 느꼈는데, 요소마다 클릭도 되고, 마우스 스크롤도 내릴 수 있음😮
from selenium import webdriver
from selenium.webdriver.common.by import By
# 크롬 드라이버 실행
driver = webdriver.Chrome()
# 웹 페이지로 이동
driver.get("https://example.com")
# 웹 페이지에서 특정 요소 찾기
element = driver.find_element(By.ID, "element_id")
# 요소의 텍스트 출력
print(element.text)
# 브라우저 종료
driver.quit()
정적 페이지에 적합하며, HTML을 손쉽게 탐색하고 데이터 추출을 간단하게 수행할 수 있다. 이름의 어원은 이상한 나라의 앨리스에서 따왔다고 한다. 암만봐도 이름이 귀엽단 말이지😄
처음 동기들과 배울 때 스프 끓인다🫕는 농담을 주고 받았던 BeautifulSoup. 확실히 크롤링에 익숙해지는거에 있어 셀레니움보다 편했다.
from bs4 import BeautifulSoup
import requests
# 웹 페이지의 HTML을 가져오기
response = requests.get("https://example.com")
html = response.text
# BeautifulSoup으로 HTML 파싱
soup = BeautifulSoup(html, "html.parser")
# 특정 태그의 내용 추출
title = soup.find("h1").text
print(title)
이렇게 좋은 라이브러리도 단점이 존재하는데,
간단히 말하면 셀레니움은 브라우저를 띄우기 때문에 무겁고 느리며, BeautifulSoup는 동적 페이지에 쓸 수 없다. 그래서 나온 해결책이 둘의 조합을 쓰는거다(그래서 내가 지금 고통받는 거다)
from selenium import webdriver
from bs4 import BeautifulSoup
# 셀레니움으로 브라우저 실행
driver = webdriver.Chrome()
driver.get("https://example.com")
# 페이지의 소스 가져오기
html = driver.page_source
# 뷰티풀스프로 HTML 파싱
soup = BeautifulSoup(html, "html.parser")
# 특정 태그의 내용 추출
title = soup.find("h1").text
print(title)
# 브라우저 종료
driver.quit()
쉽게 말하면, 동적 페이지와의 상호작용(브라우저 실행, 클릭 등)은 셀레니움으로, html 파싱은 BeautifulSoup로 하는 방법이다.
두 라이브러리를 사용하는 방법은 정말 다양한데, 그 중 많이 쓰이는 코드를 적어두려 한다
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.chrome.service import Service from bs4 import BeautifulSoup import time # 크롬 드라이버 경로 설정 chrome_driver_path = '/path/to/chromedriver' # 크롬 드라이버 경로 # 브라우저 실행 service = Service(chrome_driver_path) driver = webdriver.Chrome(service=service) # URL로 이동 driver.get('https://example.com') # 접근할 URL 입력 # 버튼이 로딩될 때까지 기다린 후 버튼 클릭 try: button = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, "//button[@id='button_id']")) # 버튼의 XPATH 입력 ) button.click() print("버튼 클릭 완료!") # 새 창이 열리는 시간을 고려해 약간의 대기 시간을 줌 time.sleep(3) # 열린 모든 창의 핸들 목록 가져오기 all_windows = driver.window_handles # 마지막 창으로 핸들 전환 driver.switch_to.window(all_windows[-1]) print(f"현재 창 핸들: {driver.current_window_handle}") # BeautifulSoup으로 HTML 파싱 html = driver.page_source soup = BeautifulSoup(html, 'html.parser') # 원하는 데이터 추출 (예: 제목 가져오기) title = soup.find('title').text print(f"페이지 제목: {title}") finally: # 브라우저 닫기 driver.quit()
# 페이지를 스크롤하여 모든 공고 로드하는 함수 def scroll_page(driver): # JavaScript를 사용하여 페이지를 맨 아래로 스크롤 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") WebDriverWait(driver, 3).until( lambda d: d.execute_script('return document.readyState') == 'complete' ) # 페이지 로딩 대기 # 페이지가 맨 아래로 스크롤된 후 다시 위로 스크롤 driver.execute_script("window.scrollTo(0, 0);") WebDriverWait(driver, 3).until( lambda d: d.execute_script('return document.readyState') == 'complete' ) # 페이지 로딩 대기
진짜 효자템
크롤링에 대한 보안 이슈는 상당히 많다. 어디서 부터 어디까지가 정당한가? 라고 물어봤을 때 누구든 자신있게 이야기 하기 어렵다. 대표적인 주의사항은 아래와 같다.
로봇 배제 표준(robots.txt): 많은 웹사이트는 robots.txt 파일을 사용해 크롤러가 접근할 수 있는 범위를 지정하고 있고, 크롤러는 이를 준수해야 한다.
법적 이슈: 무단으로 대량의 데이터를 크롤링할 경우 법적 문제에 휘말릴 수 있으므로 주의가 필요하다.
서버 부하: 빈번한 크롤링은 대상 웹 서버에 과도한 부하를 줄 수 있기 때문에 규칙성이 보이면 차단 당한다(DDos라고 의심하지 않을까). 그러니 적당한 타임슬립과 간격으로 정보를 수집해야 한다.
개인적인 생각에 크롤링 하려면 로그 찍는건 필수다. 자세할 수록 좋다. 예제 코드에 간단하지만 실제 크롤링 코드는 상상을 초월하는 줄 수를 자랑한다🤣
그렇게 때문에 로그를 자세히 안찍으면 어디서 틀렸는지 몰라서 한참 찾아야 한다
또, DB와 원활한 연결을 해놓는 게 좋다. 바로 데이터프레임으로 만들어서 작업할 수도 있지만... 데이터가 많아지면 관리가 어렵기 때문에 추천한다.... 이상 데이터 12만 개를 수집하는 사람의 다...이....ㅇ....ㅁ...ㅔ....ㅅ..ㅣ....ㅈ......ㅣ.....
그럼 난 또 크롤링을 하러 이만.........