Growth Marketing/GM4

[TIL-260417] 멋쟁이사자처럼 그로스마케팅 4기 - 데이터분석 개론 day27 | 동적 크롤링

pamsyra 2026. 4. 17. 17:24
▼오늘 배운 사항들
1. 동적 크롤링
- selenium

Part 1. 동적 크롤링 

[크롤링의 중요성]

  • 크롤링 할 줄 알면, 필요한 데이터 수집을 엄청 빠르게 끝낼 수 있음
경쟁사 가격 모니터링 경쟁사 쇼핑몰에서 가격 자동 수집
키워드 리서치 검색 결과 상위 노출 콘텐츠 자동 수집 및 분석
리뷰 분석 앱스토어, 쇼핑몰 리뷰 대량 수집 후 감성 분석
광고 소재 리서치 경쟁사 광고 문구, 랜딩 페이지 자동 수집
트렌드 파악 SNS 해시태그, 커뮤니티 인기 게시글 수집

 

[셀레니움]

  • 브라우저를 코드로 조정하는 도구
  • 요소 찾기 : 요소에 필요한 데이터가 있어서 요소 찾는게 핵심

[크롤링 해보기]

1. 코랩에 셀레니움 설치

2. 요소 찾기 
- driver.get()으로 실행하고나서 driver.quit()으로 멈춰줘야 함(안그러면 계속 실행 ---)

driver = webdriver.Chrome(options=options, service=service)  #request와 유사, 움직일 드라이버
driver.get("https://quotes.toscrape.com/") #움직여야할 곳 입력

from selenium.webdriver.common.by import By #요소 가져올 기준

#첫번째 명언 가져오기-1
quote_first = driver.find_element(By.CSS_SELECTOR, "body > div > div:nth-child(2) > div.col-md-8 > div:nth-child(1) > span.text" )
#-2
quote_first = driver.find_element(By.CSS_SELECTOR, "div.quote span.text" )
#-3
quote_first = driver.find_element(By.CSS_SELECTOR, "div.col-md-8 span.text" )

print(f"첫번째 명언: {quote_first.text}")

  • 명언 하나 가져오기
    - quote 밑에 span - text 태그에 우리가 원하는 명언 내용이 있음

.클래스명 잊지말기

 

상위 태그에서 sapn.text도 가능!

  • 모든 명언 가져오기
    - 리스트라서 안나옴. 반복문을 활용해서 리스트 1개씩 뽑아야 출력이 가능함

 

더보기

모든 명언 가져오기 활용한 모든 태그 가져오기

  • 명언과 저자를 같이 찾아서 리스트에 담기
    - 리스트라서 안나옴. 반복문을 활용해서 리스트 1개씩 뽑아야 출력이 가능함
import pandas as pd  # 이따 데이터프레임 만들거니까

driver = webdriver.Chrome(options=options, service=service) 
driver.get("https://quotes.toscrape.com/")

blocks = driver.find_elements(By.CSS_SELECTOR, "div.quote" ) #import by 위에 해서 코랩이 기억중~ 생략~

#df용
quotes_box = []

for block in blocks:
  text = block.find_element(By.CSS_SELECTOR, "span.text").text
  author = block.find_element(By.CSS_SELECTOR, "small.author").text

  print(f"{author} : {text}")
  
  #df용인 딕셔너리
  quote_dict = {
      "저자" : author,
      "명언" : text
  }
  #df용
  quotes_box.append(quote_dict) #for문 돌리면서 quotesbox에 차곡차곡 넣는다~

 

  • CSV파일 저장하기
    - 리스트라서 안나옴. 반복문을 활용해서 리스트 1개씩 뽑아야 출

 

  • Next 버튼 누르고 다음 페이지도 수집하기
    - 중복값 제거 : set
더보기

* 3페이지까지 태그값 수집

driver = webdriver.Chrome(options=options, service=service) 
driver.get("https://quotes.toscrape.com/")

tag_list =[]

#1페이지에 있는 태그값 모으기
tags = driver.find_elements(By.CSS_SELECTOR, "div.tags a.tag" )
for t in tags:
  print(t.text)
  tag_list.append(t.text)

#다음으로 넘어가기
btn = driver.find_element(By.CSS_SELECTOR, "li.next a")
btn.click()
print("-------------------2페이지 시작----------------")


#2페이지 태그값 모으기
tags = driver.find_elements(By.CSS_SELECTOR, "div.tags a.tag" )
for t in tags:
  print(t.text)
  tag_list.append(t.text)

#다음으로 넘어가기
btn = driver.find_element(By.CSS_SELECTOR, "li.next a")
btn.click()

#3페이지 태그값 모으기
tags = driver.find_elements(By.CSS_SELECTOR, "div.tags a.tag" )
print("-------------------3페이지 시작----------------")
for t in tags:
  print(t.text)
  tag_list.append(t.text)


print(tag_list)

 # set : 중복 제거된 값만 보기 
 print(set(tag_list))

 

더보기

*반복문으로 태그값 수집

태그값 위에 for range해서 돌릴 페이지 수 설정

import time

driver = webdriver.Chrome(options=options, service=service) 
driver.get("https://quotes.toscrape.com/")

all_tags = []

for act in range(1,4) : #가장 큰 카테고리 page부터 반복문 시작 - 1,2,3페이지 하겠다 - 10페이지까지면 (1,11)
  print(act, "--------------------------------------------")

  # 1) 태그값 찾기
  tags = driver.find_elements(By.CSS_SELECTOR, "div.tags a.tag" )
  for t in tags:
    print(t.text)
    
    #태그값 모으기
    tag_list.append(t.text)

  if act == 3:      #act 값이 3일 때 = act 3번째 했을 때
    break           #가장 가까운 for문 탈출한다.

  # 2) 버튼 찾고 누르기
  btn = driver.find_element(By.CSS_SELECTOR, "li.next a")
  btn.click()
  print("--------------버튼 눌렀따")
  time.sleep(2)

중복값이 22개나!

  • if act , break 로 비효율 활동 처리
    - 마지막 버튼 누를 필요가 없는데 누르는 비효율 활동 발견 

 


Part 2. 네이버 블로그 내용 크롤링 하기

1. 브라우저 열기

2. 링크 방문

3. frame 전환 - iframe인 경우, ex 네이버

import requests
import pandas as pd

client_id = "YOUR_ID"
client_secret = "YOUR_SECRET"

url = "https://openapi.naver.com/v1/search/blog.json"

headers = {
    "X-Naver-Client-Id": client_id,
    "X-Naver-Client-Secret": client_secret}

params = {
    "query": "SQLD 합격후기",
    "display": 10}

response = requests.get(url, headers=headers, params=params)
data = response.json()

links = []
for item in data["items"]:
    links.append(item["link"])

df_links = pd.DataFrame(links, columns=["url"])
df_links
driver = webdriver.Chrome(options=options, service=service) 

title_list = []
content_list = []

for url in df_links["url"] : 
  driver.get(url) 
  driver.switch_to.frame("mainFrame") #frame 전환 : 네이버의 경우, 프레임을 안쪽으로 한 번 더 들어가야함

  title = driver.find_element(By.CSS_SELECTOR, "div.se-title-text span").text
  content = driver.find_element(By.CSS_SELECTOR,"div.se-main-container").text
  #print(title, content)

  title_list.append(title)
  content_list.append(content)

  driver.switch_to.default_content()  #메인프레임으로 들어갔었으니 새로운 url로 들어가야하니 나가는거 명시하기
df_links["title"] = title_list #컬럼만들어주기
df_links["content"] = content_list
df_links

df_links.to_csv("result.csv", index=False, encoding="utf-8-sig")

요소찾고 넣고
네이버블로그의 코드 꺼내오는게 생각보다 헷갈렸음 se-title도 잇고 se-module 웅앵도 있고... 근데 실습한 멜론보다는 깔끔한 것 같다;

 

더보기

앞선 파이썬으로 하는 데이터 시각화에 비해 크롤링이 얼마나 중요한지 와닿지가 않아서 집중력이 흐려지긴 했다.

크롤링만 전문으로 해서 크몽으로 팔기도 한다는데 역시 돈버는 방법은 무궁무진하다.

 

앗싸 주말엔 내가 계획한대로 공부하고 실습하고 과제하고 내 멋대로 할 수 있어

sqld 자격증 공부하고 스터디 과제하고 대출기한 얼마 남지 않은 마케팅 서적읽고 개인과제 제출하고 채용공고 확인해보고 커리어로드맵 생각하고...

아! 고등학교 때는 어떻게 새벽7시부터 자정까지 학교에 있었을까