메뉴 닫기

파이썬 BeautifulSoup 기본 크롤링 레시피 한 줄 코드로 시작하는 웹 스크래핑

파이썬 BeautifulSoup 기본 크롤링 레시피 한 줄 코드로 시작하는 웹 스크래핑

📌 한 번에 이해하는 requests와 BeautifulSoup 실전 패턴으로 링크 리스트 수집하기

웹 데이터를 처음 모을 때 가장 헷갈리는 지점은 무엇부터 건드려야 하는가 하는 부분입니다.
설치부터 셀렉터까지 단계가 길어 보이지만 실제로는 패턴을 익히면 손에 익는 루틴이 됩니다.
특히 requests로 페이지를 가져오고 BeautifulSoup으로 원하는 요소를 뽑아내는 흐름만 제대로 잡으면 복잡한 사이트가 아니라면 대부분의 리스트형 데이터를 빠르게 수집할 수 있습니다.
이 글은 검색 노출과 실전 활용을 모두 고려해 핵심 동작을 가장 짧은 레시피로 정리하고, 실수하기 쉬운 옵션과 셀렉터 작성 요령을 친근한 예시로 풀어냅니다.

핵심은 다음 한 줄 레시피를 정확히 이해하는 것입니다.
res=requests.get(url,timeout=); soup=BS(res.text,’lxml’); items=soup.select(‘ul li>a’) 라는 형태로 요청, 파싱, 선택이 연속적으로 이어집니다.
여기서 timeout은 안정성을 높이고, ‘lxml’ 파서는 속도와 호환성을 챙기며, ul li>a 선택자는 목록의 링크 텍스트와 주소를 깔끔하게 모으는 데 초점을 둡니다.
이 패턴을 기반으로 환경 준비, 코드 구조화, 예외 처리, 실전 팁을 차근차근 담아 누구나 따라 할 수 있는 가이드를 제공합니다.



🧩 기본 개념과 준비물

웹 크롤링을 시작하기 전에 가장 먼저 이해해야 할 점은 크롤링과 스크래핑의 차이입니다.
크롤링은 여러 웹페이지를 탐색하며 데이터를 모으는 과정이고, 스크래핑은 특정 페이지에서 원하는 정보를 추출하는 작업을 의미합니다.
이번에 다룰 BeautifulSoup 기본 레시피는 웹페이지 한 곳에서 필요한 데이터를 뽑아내는 데 중점을 둡니다.

환경 준비로는 Python 3.7 이상과 몇 가지 필수 패키지가 필요합니다.
대표적으로 requestsbeautifulsoup4, 그리고 빠른 파싱을 돕는 lxml 라이브러리를 설치해야 합니다.
이는 pip를 통해 간단히 해결됩니다.

  • 📦pip install requests 실행
  • 📦pip install beautifulsoup4 실행
  • 📦pip install lxml 실행

모듈 설치가 끝나면 크롤링의 기본 흐름을 머릿속에 넣어두는 것이 좋습니다.
흐름은 크게 ① 웹페이지 요청 → ② HTML 파싱 → ③ 원하는 요소 선택 세 단계로 나뉘며, 이를 한 줄 코드로 정리하면 다음과 같은 형태가 됩니다.

CODE BLOCK
res = requests.get(url, timeout=5)
soup = BeautifulSoup(res.text, 'lxml')
items = soup.select('ul li > a')

위 코드가 바로 이번 글의 핵심 레시피입니다.
짧지만 크롤링의 시작과 끝을 모두 담고 있으며, 이후 다양한 응용 역시 이 구조를 바탕으로 확장됩니다.
다만 웹사이트마다 구조가 다르기 때문에 CSS 선택자를 올바르게 이해하는 것이 중요합니다.

💡 TIP: 크롤링은 합법적인 범위에서만 진행해야 하며, 사이트의 robots.txt 정책을 반드시 확인하는 습관이 필요합니다.

🛠️ requests로 HTML 가져오기

웹 크롤링의 출발점은 원하는 웹페이지의 HTML을 불러오는 것입니다.
이를 위해 requests 라이브러리를 사용합니다.
파이썬 표준 라이브러리로도 가능하지만, requests는 단순하고 직관적인 API로 인해 크롤링 입문자에게 가장 추천되는 방법입니다.

가장 기본적인 문법은 다음과 같습니다.

CODE BLOCK
import requests

url = "https://example.com"
res = requests.get(url, timeout=5)

print(res.status_code)
print(res.text[:500])

여기서 status_code는 요청 성공 여부를 확인하는 데 중요합니다.
200이면 정상, 404는 페이지 없음, 500은 서버 오류를 의미합니다.
또한 timeout 옵션은 서버가 응답하지 않을 때 무한 대기 상태에 빠지지 않도록 안전 장치 역할을 합니다.

⚠️ 주의: timeout을 설정하지 않으면 특정 사이트에서 응답이 지연될 경우 프로그램이 멈춘 것처럼 보일 수 있습니다.

🔑 헤더와 요청 제어

일부 웹사이트는 기본적인 요청을 차단하거나, 브라우저에서 접속한 것처럼 보이는 요청만 허용합니다.
이때는 headers를 추가하여 User-Agent를 설정해 주는 것이 좋습니다.

CODE BLOCK
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0 Safari/537.36"
}
res = requests.get(url, headers=headers, timeout=5)

이렇게 하면 브라우저에서 접속하는 것처럼 위장할 수 있어 정상적으로 HTML을 가져오는 확률이 높아집니다.
대부분의 실전 크롤링에서 이 기법은 거의 필수라고 할 수 있습니다.

💎 핵심 포인트:
requests.get()은 단순한 코드이지만, status_code 확인, timeout 설정, 헤더 추가 세 가지를 습관처럼 적용해야 안정적인 크롤링이 가능합니다.



🥣 BeautifulSoup 파싱과 선택자

웹페이지에서 가져온 HTML은 단순 문자열 형태라 사람이 읽기 어렵습니다.
이때 BeautifulSoup을 사용하면 구조화된 트리 형태로 파싱하여 원하는 요소를 쉽게 다룰 수 있습니다.
특히 lxml 파서를 활용하면 빠른 속도와 안정성을 동시에 얻을 수 있습니다.

CODE BLOCK
from bs4 import BeautifulSoup

soup = BeautifulSoup(res.text, "lxml")
print(soup.title.text)   # 페이지 제목
print(soup.p)            # 첫 번째 p 태그

위 예제처럼 soup 객체는 HTML 요소에 바로 접근할 수 있는 편리한 기능을 제공합니다.
soup.title은 문서의 제목 태그를, soup.p는 첫 번째 단락을 반환합니다.
그러나 실제로는 여러 개의 동일 태그가 존재하므로 find(), find_all(), select() 같은 메서드를 주로 활용합니다.

🔍 주요 메서드 비교

메서드 설명
find() 조건에 맞는 첫 번째 요소 반환
find_all() 조건에 맞는 모든 요소 반환 (리스트)
select() CSS 선택자를 사용한 유연한 요소 추출

실무에서는 대부분 select()를 사용하는 편이 효율적입니다.
왜냐하면 브라우저의 개발자 도구에서 바로 CSS 선택자를 복사해 적용할 수 있기 때문입니다.
이 덕분에 코드 작성 속도가 훨씬 빨라지고 오류 가능성도 줄어듭니다.

💡 TIP: 크롬 브라우저에서 원하는 요소를 우클릭 후 Copy → Copy selector를 선택하면 해당 요소의 정확한 CSS 선택자를 바로 얻을 수 있습니다.

🧪 CSS 선택자 실전 패턴 ul li>a

웹 크롤링에서 가장 자주 접하는 구조 중 하나는 리스트 형태의 링크 모음입니다.
예를 들어 게시판 글 목록, 뉴스 기사 타이틀, 상품 리스트 등이 이에 해당합니다.
이 경우 CSS 선택자 ul li > a를 사용하면 리스트 안의 모든 링크 요소를 한 번에 가져올 수 있습니다.

CODE BLOCK
items = soup.select("ul li > a")
for item in items:
    print(item.text, item["href"])

이 구문은 모든 ul 태그 내부의 li에 포함된 a 태그를 선택합니다.
따라서 뉴스 목록에서 제목과 링크 주소를 일괄 수집할 때 매우 유용합니다.
특히 item.text로는 링크 텍스트를, item[“href”]로는 링크 주소를 얻을 수 있습니다.

📌 선택자 패턴 확장

실제 사이트마다 HTML 구조가 다르기 때문에, 기본 패턴을 변형해야 할 때가 많습니다.

  • 🔎ul.news-list li a.title : 특정 클래스가 붙은 링크만 선택
  • 🔎div.product-list > ul > li > a : 특정 컨테이너 내부 링크만 추출
  • 🔎ul li > a[href^=”/article”] : 특정 경로로 시작하는 링크만 추출

이처럼 CSS 선택자를 자유자재로 활용하면 사이트 구조가 달라져도 원하는 데이터를 손쉽게 추출할 수 있습니다.

💎 핵심 포인트:
ul li > a 패턴은 리스트 형태 데이터를 수집하는 가장 기본적이고 강력한 도구이며, 클래스, 속성 선택자와 조합해 확장성을 높일 수 있습니다.



레시피 통합 코드와 예제

앞에서 다룬 requests 요청, BeautifulSoup 파싱, ul li > a 선택자를 하나로 합치면 가장 기본적인 크롤링 레시피가 완성됩니다.
이 코드는 리스트 형태의 링크 텍스트와 주소를 동시에 추출할 수 있어 뉴스, 블로그 글, 상품 리스트 등 다양한 사이트에서 곧바로 활용 가능합니다.

CODE BLOCK
import requests
from bs4 import BeautifulSoup

url = "https://example.com/news"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0 Safari/537.36"
}
res = requests.get(url, headers=headers, timeout=5)

soup = BeautifulSoup(res.text, "lxml")
items = soup.select("ul li > a")

for item in items:
    print(item.text.strip(), item["href"])

이 통합 예제는 웹 크롤링의 최소 단위이자 가장 많이 사용되는 패턴입니다.
추가적으로 예외 처리나 저장 기능을 더하면 실제 프로젝트에서도 바로 응용할 수 있습니다.

📝 응용 아이디어

  • 💾추출한 데이터를 CSV 파일로 저장하기
  • ⏱️여러 페이지를 순회하며 페이지네이션 처리하기
  • 🧹strip()을 이용해 공백과 특수문자 정리하기
  • 🔗상대 경로 링크를 절대 경로로 변환하기

💡 TIP: 실무에서는 단순 출력 대신 데이터베이스 저장까지 이어지는 경우가 많습니다.
SQLite나 MySQL 같은 DB를 연동하면 규모가 커져도 데이터를 안정적으로 관리할 수 있습니다.

자주 묻는 질문 (FAQ)

BeautifulSoup과 Selenium은 어떻게 다른가요?
BeautifulSoup은 정적인 HTML 파싱에 특화되어 있고, Selenium은 자바스크립트가 많은 동적 페이지 제어에 적합합니다.
timeout은 몇 초로 설정하는 게 좋은가요?
보통 3~10초 사이를 권장하며, 너무 짧으면 정상 페이지도 실패하고 너무 길면 대기 시간이 늘어납니다.
lxml 대신 html.parser를 써도 되나요?
가능합니다. 다만 lxml은 속도가 빠르고 더 많은 기능을 지원하기 때문에 일반적으로 권장됩니다.
select()와 find_all() 중 무엇을 써야 할까요?
CSS 선택자를 직관적으로 쓰고 싶다면 select(), 태그 이름과 속성으로 직접 지정하려면 find_all()이 적합합니다.
ul li>a 패턴은 어디에 가장 많이 쓰이나요?
뉴스 목록, 블로그 글 리스트, 게시판 글 모음 등 리스트 안의 링크 추출에 가장 자주 사용됩니다.
크롤링 데이터는 어떻게 저장하는 게 좋을까요?
소규모라면 CSV, 대규모라면 MySQL이나 MongoDB 같은 데이터베이스를 권장합니다.
robots.txt를 꼭 확인해야 하나요?
네, 해당 사이트에서 허용하지 않은 영역을 크롤링하면 법적 문제가 될 수 있으므로 반드시 확인해야 합니다.
파이썬 외에 다른 언어로도 BeautifulSoup 같은 기능이 있나요?
네, 자바스크립트에는 Cheerio, PHP에는 Simple HTML DOM Parser 등 유사한 라이브러리가 있습니다.

🚀 파이썬 BeautifulSoup 크롤링 레시피 핵심 정리

파이썬에서 웹 데이터를 다루는 가장 기본적인 패턴은 requests + BeautifulSoup 조합입니다.
requests로 HTML을 가져오고, BeautifulSoup으로 파싱한 후, CSS 선택자를 활용해 원하는 데이터를 뽑아내는 것이 핵심 흐름입니다.
특히 ul li > a 패턴은 리스트 구조에서 링크 텍스트와 주소를 동시에 추출할 수 있어 뉴스, 블로그, 쇼핑몰 등 다양한 환경에서 즉시 활용 가능합니다.

이번 글에서 소개한 레시피는 res = requests.get(url, timeout=5), soup = BeautifulSoup(res.text, ‘lxml’), items = soup.select(‘ul li > a’)라는 세 줄의 코드로 요약됩니다.
단순하지만 강력한 이 패턴은 크롤링 입문자에게는 빠른 성취감을 주고, 실무자에게는 안정적인 기본 구조를 제공합니다.
여기에 예외 처리, 데이터 저장, 페이지네이션 등 확장 기능을 더하면 더욱 강력한 크롤러로 발전시킬 수 있습니다.


🏷️ 관련 태그 : 파이썬크롤링, BeautifulSoup, 웹스크래핑, requests라이브러리, CSS선택자, 데이터수집, 파이썬입문, 웹자동화, 크롤링예제, 파이썬데이터분석