웹 크롤링은 웹사이트에서 정보를 자동으로 수집하는 강력한 기술입니다. 특히 Python은 BeautifulSoup, Requests와 같은 라이브러리 덕분에 크롤링 작업을 매우 간단하게 만들어 줍니다. 이번 포스팅에서는 티스토리 블로그의 카테고리 정보를 크롤링하는 간단한 Python 코드를 알아보겠습니다.
필요한 라이브러리
티스토리 블로그 카테고리를 크롤링하기 위해 다음 라이브러리가 필요합니다:
- urllib: 웹 페이지를 열고 데이터를 가져오는 기본 라이브러리
- BeautifulSoup: HTML/XML 파싱 라이브러리
- re: 정규 표현식 모듈
- time: 크롤링 간 대기 시간 설정을 위한 모듈
코드 예시
다음은 티스토리 블로그의 카테고리를 크롤링하는 간단한 Python 코드입니다:
from urllib.request import urlopen
from bs4 import BeautifulSoup
import time
import re
letTistory = 'https://ioswift.tistory.com'
list5category = []
while True:
html = urlopen(letTistory)
bsObject = BeautifulSoup(html, "html.parser")
# 카테고리 링크 찾기 (정규식 활용)
for link in bsObject.findAll("a", href=re.compile("^(/category/)((?!:).)*$")):
if 'href' in link.attrs:
list5category.append(link.attrs['href'])
time.sleep(10) # 10초 대기
# 각 카테고리 페이지 방문
for link2 in list5category:
html = urlopen(letTistory+link2)
bsObject = BeautifulSoup(html, "html.parser")
# 여기서 필요한 정보 추출 작업 수행
# print(bsObject)
list5category.clear() # 카테고리 목록 초기화
코드 분석
이 코드가 어떻게 작동하는지 한 줄씩 살펴보겠습니다:
1. 필요한 라이브러리 임포트
from urllib.request import urlopen
from bs4 import BeautifulSoup
import time
import re
urlopen
: 웹 페이지에 접속하여 HTML 문서를 가져옵니다.BeautifulSoup
: HTML 문서를 파싱하여 필요한 데이터를 추출합니다.time
: 크롤링 작업 간 대기 시간을 설정합니다.re
: 정규 표현식을 사용하여 특정 패턴의 URL을 찾습니다.
2. 대상 블로그 URL 및 변수 설정
letTistory = 'https://ioswift.tistory.com'
list5category = []
letTistory
: 크롤링 대상 티스토리 블로그 URL입니다.list5category
: 찾아낸 카테고리 URL을 저장할 리스트입니다.
3. 메인 크롤링 루프
while True:
html = urlopen(letTistory)
bsObject = BeautifulSoup(html, "html.parser")
- 무한 루프로 계속해서 크롤링을 수행합니다.
urlopen
함수로 블로그 메인 페이지의 HTML을 가져옵니다.- BeautifulSoup 객체를 생성하여 HTML을 파싱합니다.
4. 카테고리 링크 추출
for link in bsObject.findAll("a", href=re.compile("^(/category/)((?!:).)*$")):
if 'href' in link.attrs:
list5category.append(link.attrs['href'])
findAll
메소드로 모든<a>
태그를 찾습니다.- 정규 표현식(
^(/category/)((?!:).)*$
)을 사용하여 카테고리 URL 패턴만 추출합니다:^(/category/)
: URL이 ‘/category/’로 시작하는지 확인((?!:).)*
: ‘:’ 문자가 포함되지 않은 문자열만 매칭$
: 문자열의 끝
5. 대기 및 각 카테고리 방문
time.sleep(10) # 10초 대기
for link2 in list5category:
html = urlopen(letTistory+link2)
bsObject = BeautifulSoup(html, "html.parser")
# 여기서 필요한 작업 수행
- 서버에 과부하를 주지 않도록 10초간 대기합니다.
- 찾아낸 각 카테고리 페이지를 방문합니다.
- 현재 코드에서는 추가 처리를 하지 않지만, 필요에 따라 여기서 데이터 추출, 저장 등의 작업을 수행할 수 있습니다.
6. 카테고리 목록 초기화
list5category.clear() # 카테고리 목록 초기화
- 다음 크롤링 사이클을 위해 카테고리 목록을 초기화합니다.
활용 방안
이 코드는 다음과 같은 용도로 확장하여 사용할 수 있습니다:
1. 카테고리별 게시물 수집
for link2 in list5category:
html = urlopen(letTistory+link2)
bsObject = BeautifulSoup(html, "html.parser")
# 카테고리 내 게시물 링크 찾기
posts = bsObject.findAll("a", {"class": "post-link"}) # 티스토리 게시물 링크 클래스에 맞게 수정 필요
for post in posts:
post_url = post['href']
post_html = urlopen(post_url)
post_bs = BeautifulSoup(post_html, "html.parser")
# 게시물 제목 추출
title = post_bs.find("h1", {"class": "post-title"}).text # 티스토리 게시물 제목 클래스에 맞게 수정 필요
# 게시물 내용 추출
content = post_bs.find("div", {"class": "post-content"}).text # 티스토리 게시물 내용 클래스에 맞게 수정 필요
# 추출한 정보 저장 또는 처리
print(f"제목: {title}")
print(f"내용: {content[:100]}...") # 내용 일부만 출력
time.sleep(3) # 각 게시물 크롤링 간 3초 대기
2. 특정 키워드 검색
keyword = "Python" # 검색할 키워드
for link2 in list5category:
html = urlopen(letTistory+link2)
bsObject = BeautifulSoup(html, "html.parser")
# 카테고리 이름 추출
category_name = bsObject.find("h1", {"class": "category-name"}).text # 티스토리 카테고리 이름 클래스에 맞게 수정 필요
# 페이지 전체 텍스트 추출
page_text = bsObject.get_text()
# 키워드 검색
if keyword in page_text:
print(f"키워드 '{keyword}'가 '{category_name}' 카테고리에서 발견되었습니다.")
3. 데이터 저장
import csv
# CSV 파일 생성
with open('tistory_categories.csv', 'w', newline='', encoding='utf-8') as csvfile:
fieldnames = ['category_url', 'category_name', 'post_count']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
for link2 in list5category:
html = urlopen(letTistory+link2)
bsObject = BeautifulSoup(html, "html.parser")
# 카테고리 이름 추출
category_name = bsObject.find("h1", {"class": "category-name"}).text # 티스토리 카테고리 이름 클래스에 맞게 수정 필요
# 게시물 개수 추출
posts = bsObject.findAll("a", {"class": "post-link"}) # 티스토리 게시물 링크 클래스에 맞게 수정 필요
post_count = len(posts)
# CSV에 데이터 쓰기
writer.writerow({
'category_url': link2,
'category_name': category_name,
'post_count': post_count
})
time.sleep(3) # 각 카테고리 크롤링 간 3초 대기
주의사항
웹 크롤링을 수행할 때는 다음 사항을 반드시 고려해야 합니다:
- robots.txt 준수: 대상 웹사이트의 robots.txt 파일을 확인하여 크롤링이 허용되는지 확인합니다.
- 크롤링 간격 설정: 서버에 과부하를 주지 않도록 적절한 시간 간격을 두고 요청합니다.
- 개인정보 보호: 개인정보를 포함하는 데이터는 수집하지 않도록 주의합니다.
- 저작권 존중: 수집한 데이터를 사용할 때 저작권 문제가 발생하지 않도록 합니다.
모바일 환경에서의 실행
코드 마지막 부분에 언급된 “당근 모바일에서도 잘 됨”이라는 내용은 이 크롤링 코드가 모바일 환경에서도 실행 가능하다는 것을 의미합니다. Python이 설치된 모바일 앱(예: Pythonista, QPython 등)에서도 이 코드를 실행할 수 있습니다.
또한 WWDC(Apple 개발자 컨퍼런스)에서 발표된 내용을 고려하면, 앞으로 iOS 기기에서도 PyCharm과 같은 개발 도구를 더 쉽게 사용할 수 있게 될 것입니다. 특히 iPad OS의 발전으로 태블릿에서의 코딩 환경이 점점 개선되고 있습니다.
결론
이 포스팅에서는 Python의 urllib와 BeautifulSoup을 사용하여 티스토리 블로그의 카테고리를 크롤링하는 방법을 알아보았습니다. 기본 코드는 간단하지만, 목적에 따라 다양하게 확장하여 더 복잡한 크롤링 작업을 수행할 수 있습니다.
웹 크롤링은 데이터 수집, 분석, 모니터링 등 다양한 용도로 활용될 수 있으며, Python의 강력한 라이브러리 생태계 덕분에 비교적 쉽게 구현할 수 있습니다. 다만, 항상 윤리적이고 책임감 있는 방식으로 크롤링을 수행해야 한다는 점을 명심해야 합니다.
답글 남기기