그로스 마케팅/학습 기록

웹 크롤링이란? | 마케터를 위한 Python 웹 크롤링 기초 #1 [멋쟁이사자처럼 부트캠프 그로스 마케팅 5기 day 15]

shushu26 2026. 6. 6. 15:53

"그로스 마케터 채용공고를 하루 종일 보다 보면 이런 생각이 듭니다."

 

SQL은 얼마나 나올까?

GA4는 얼마나 중요할까?

기업들은 어떤 역량을 가장 많이 요구할까?

 

예전에는 이런 데이터를 직접 하나씩 정리해야 했습니다.

 

하지만 오늘 배운 Python 웹 크롤링을 활용하면 수백 개의 채용공고도 자동으로 수집할 수 있습니다.

 

오늘은 requests와 BeautifulSoup을 활용해 웹사이트 데이터를 수집하는 웹 크롤링 기초를 실습해 보았습니다.


💡 웹 크롤링(Web Crawling)이란?

 

웹 크롤링은 웹사이트에 있는 정보를 사람이 직접 복사하지 않아도 기계가 자동으로 수집하도록 만드는 기술입니다.

 

 예를 들어

  • 경쟁사 채용공고 수집
  • 업계 뉴스 모니터링
  • 상품 가격 추적
  • 콘텐츠 데이터 수집

등 반복적인 리서치 업무를 자동화할 수 있습니다.

 

 

웹 크롤링 진행 과정

 

1.정보를 가져올 웹사이트에 접속

 

2.HTML 태그와 CSS 선택자를 활용해 원하는 데이터 위치 확인

 

3. Python 코드로 데이터 자동 수집

 

 

GET과 POST, 데이터는 어떻게 주고받을까?

 

웹사이트와 통신할 때는 HTTP 통신 방식을 사용하며,

 

대표적으로 GET과 POST가 있습니다.

 

 

GET 방식

  • 데이터 요청 속도가 빠름
  • URL 주소에 데이터가 노출됨
  • 전송 가능한 데이터 크기에 제한 존재

 

POST 방식

  • 데이터가 URL에 노출되지 않음
  • 보안성이 높음
  • 데이터 크기 제한이 거의 없음

 

마케터 입장에서는 단순히 개념 암기보다,

"내가 보는 웹페이지 데이터도 결국 이런 방식으로 주고받는구나"

를 이해하는 것이 중요합니다.

 


실습 1. requests로 웹사이트 데이터 요청하기

 

웹 크롤링의 첫 단계는 데이터를 요청하는 것입니다.

 

import requests as req

 

 

requests 라이브러리를 활용하면 웹사이트에 데이터를 요청할 수 있습니다.

하지만 일부 사이트는 봇(Bot)의 접근을 차단하기 때문에

사용자 정보를 함께 전달해야 합니다.

 

U_A = {"User-Agent": "Mozilla/5.0 ..."}

 

 

이렇게 User-Agent를 설정하면 일반 사용자가 접속한 것처럼 요청할 수 있습니다.

그리고 실제 요청을 보냅니다.

 

res_in = req.get("웹사이트 주소", headers=U_A)

 

 

결과로

 

<Response [200]>

 

 

이 출력되면 정상적으로 통신이 성공한 것이며,

실무에서는 경쟁사 사이트나 채용공고 데이터를 수집할 때도 동일한 방식으로 데이터를 요청하게 됩니다.

 

실습 2. BeautifulSoup으로 HTML 분석하기

 

데이터를 가져왔다고 끝이 아닙니다.

HTML 구조를 분석해야 원하는 데이터를 찾을 수 있습니다.

 

from bs4 import BeautifulSoup as bs

 

 

그리고 가져온 HTML을 분석 가능한 형태로 변환합니다.

 

soup = bs(res_in.text, "lxml")

 

 

여기서 사용한 lxml은 Python에서 가장 빠른 HTML 파서(Parser) 중 하나입니다.

 

실습 3. CSS 선택자로 원하는 데이터 찾기

 

HTML 전체를 가져오면 정보가 너무 많아서

원하는 데이터 위치를 지정해야 합니다.

 

txt = soup.select("태그")

 

 

select()를 활용하면 특정 태그나 CSS 선택자에 해당하는 데이터만 추출할 수 있고

그리고 반복문을 사용해 실제 텍스트를 출력합니다.

 

for i in txt:
    print(i.text)

 

 

이 과정을 통해 HTML 태그를 제거하고 실제 필요한 데이터만 추출할 수 있습니다.

 

이 기능을 활용하면 경쟁사 콘텐츠 제목 수집, 채용공고 분석, 업계 뉴스 모니터링

키워드 데이터 수집 등 다양한 업무를 자동화할 수 있습니다.

 

실습 4. 수집한 데이터를 리스트에 넣기

 

select()를 이용해 웹사이트에서의 데이터들을 확보했습니다.

하지만 이 데이터들은 아직 정돈되지 않은 상태이기에

이걸 나중에 엑셀 표로 예쁘게 만들려면,

우선 종류별로 각자의 바구니(리스트)에 차곡차곡 담아두어야 합니다.

 

 

① 첫 번째 줄: 빈 바구니(리스트) 준비하기

 

title_list, company_list, region_list, career_list, edu_list = [], [], [], [], []

 

  • 뜻: 데이터를 종류별로 나눠 담을 빈 상자 5개를 한 번에 준비한 것입니다.
  • 순서대로 공고제목, 회사명, 근무지역, 경력조건, 학력조건을 담을 방입니다.

 

② 두 번째 줄: 10번 반복하기 (for 반복문)

 

for i in range(10):

 

  • 뜻: 컴퓨터에게 "아래 행동을 딱 10번만 반복해!     
  • 수많은 공고 중 상위 10개의 채용 공고만 깔끔하게 수집하겠다는 의미입니다.   

                                               

③ 세 번째 줄: 알맹이만 쏙 빼서 바구니에 넣기 (.append와 .text.strip())

 

 title_list.append(title[i+1].text.strip())
 company_list.append(company[i].text.strip())
 region_list.append(region[i+1].text.strip())  # region으로 변경!
 career_list.append(career[i+1].text.strip())  # career로 변경!
 edu_list.append(edu[i+1].text.strip())        # edu로 변경!

 

 

우리가 쓴 코드는 기본적으로 아래와 같은 뼈대로 이루어져 있습니다.

 

바구니이름.append( 원본데이터[방번호].text.strip() ) 

 

 

이때 괄호 안의 (원본데이터)부터 시작해서 바깥쪽(append)으로 실행합니다.

 

 

1. title : 원본 데이터 주머니

 

  • 뜻: "웹사이트에서 통째로 긁어온 공고 제목들이 잔뜩 든 커다란 주머니"
  • 해설: 앞선 단계에서 soup.select()를 통해 가져온 가공되지 않은 원본 데이터입니다. 이 안에는 채용공고 제목 100개가 한꺼번에 뒤엉켜 있습니다.

 

2. [i+1] : 방 번호 (인덱스)

 

  • 뜻: "그 커다란 주머니 안에서 정확히 i+1번째 방에 있는 데이터 딱 하나만 조준해!"
  • [와 ] (대괄호): 파이썬에서 "몇 번째 방인지 번호를 지정하겠다"는 주소판입니다.
  • i+1: 우리가 for i in range(10):을 썼기 때문에, 첫 바퀴 돌 때 i는 0입니다. 즉, 0+1이 되어 title[1](1번 방)을 정확히 조준합니다.

 

3. .text : 태그 가위질

 

  • 뜻: "조준한 데이터에서 지저분한 HTML 코드는 다 잘라버리고, 인간의 눈에 보이는 순수 '글자(텍스트)'만 남겨!"
  • . (점): 파이썬에서 점은 "~의" 혹은 "~에게 무언가를 시키다"라는 연결 고리입니다.
  • 해설: 웹사이트에서 데이터를 그냥 가져오면 <a>그로스 마케터 채용</a> 처럼 코드가 앞뒤로 덕지덕지 붙어있습니다. .text를 거치면 코드가 싹 잘려 나가고 그로스 마케터 채용이라는 알맹이 글자만 남습니다.

 

4. .strip() : 공백 빗자루질

 

  • 뜻: "방금 뽑아낸 글자 앞뒤로 눈에 안 보이는 엔터(줄바꿈)나 스페이스바 공백 찌꺼기가 있다면 싹 다 쓸어내서 깔끔하게 청소해!"
  • () (소괄호): "이 기능을 지금 당장 실행해라!"라는 뜻의 작동 스위치입니다.
  • 해설: 웹 데이터를 긁어오면 눈에는 그냥 글자처럼 보여도 실제로는 "\n 그로스 마케터 채용 \n" 처럼 공백이 엄청나게 많이 숨어있습니다. 이걸 그냥 두면 나중에 글자 수 세거나 데이터 통계 낼 때 컴퓨터가 오작동합니다. .strip()을 거쳐야 비로소 오차 없는 완벽하고 깔끔한 문자열 데이터가 됩니다.

 

5. title_list.append( ... ) : 바구니에 넣기

 

  • 뜻: "그렇게 가공하고 청소까지 끝난 완벽한 글자를 내가 맨 처음에 준비해 둔 title_list라는 빈 바구니 맨 뒤에 쏙 집어넣어라!"
  • append: 리스트(바구니)의 맨 뒤에 데이터를 하나씩 추가(Append)하라는 파이썬 전용 명령어입니다.

 

④ 마지막 print(len(...)) 줄들/  데이터 개수(len) 확인하며 검수하기

 

데이터가 10개씩 잘 들어갔는지 개수(len) 확인하기
print(len(title_list))    # 출력: 10
print(len(company_list))  # 출력: 10
print(len(region_list))   # 출력: 10
print(len(career_list))   # 출력: 10
print(len(edu_list))      # 출력: 10

 


마무리 

오늘 실습을 통해 데이터 분석의 시작은 분석이 아니라 데이터 확보라는 점을

다시 한번 느낄 수 있었으며,

앞으로는 단순히 주어진 데이터를 보는 것을 넘어, 필요한 데이터를 직접 수집하고

인사이트를 도출할 수 있는그로스 마케터를 목표로 학습을 이어가고자 합니다.

 

🦁 데이터로 증명하는 그로스 마케터가 되고 싶다면?

 

🦁 내 성장의 기회, 멋쟁이사자처럼

데이터 분석부터 마케팅 자동화까지, 현업 중심 실무 역량 강화

나에게 맞는 실무 커리큘럼 확인하기 →