들어가며
파이썬 특히 django를 이용해서 해당 웹페이지의 게시글들을 크롤링하고 , db에 저장하도록 하겠습니다.
Crawling 은
- 웹 페이지를 그대로 긁어와서 데이터를 추출하는 행위
- 원하는 데이터를 전부 가져옵니다.
개요
아무대로 임의의 사이트보다도 현재 웹사이트라고하면 대표적으로 커뮤니티 사이트를 예시로 들수있습니다. 커뮤니티 사이트는 많은 사용자들의 일상생활이나 유머글 등등 많은 정보를 가지고있습니다만 이러한 사용자가 많은 커뮤니티 특성상 모든 글을 읽는 것에 시간적 여유가 부족할 경우를 대비해서 많은 추천(공감, 좋아요 등)을 받은 게시글 위주로 보는 기능들이 존재합니다.
저는 특정 커뮤니티 사이트의 갤러리에서 인기글을 크롤링하려고합니다. 그래서 어느정도 조건이 필요하다고 생각합니다.
- 해당 커뮤니티의 인기글 탭의 게시글만을 크롤링 할 것
- 크롤링 버튼 클릭시 1페이지의 게시글만을 가져올 것
- 가져온 게시글의 제목만을 보여주면서 제목 클릭시 해당 url로 보낼것
일단은 가볍게 게시글만을 버튼을 누르면 가져오는것을 시작으로 해보려고 합니다. 기본 앱 같은 경우는 미리 준비해 놓았다고 가정하고 views.py 를 적겠습니다.
Views.py
def crawl():
url = '해당 주소'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'}
try:
current_time = datetime.now()
new_posts_count = 0
# 1페이지만 요청
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
# 게시글 찾기
posts = soup.select('div.li')
# 제목과 URL 추출 및 저장
for post in posts:
title_elem = post.select_one('h3.title a.hotdeal_var8')
if not title_elem or not title_elem.get('href'):
continue
# 제목 그대로 가져오기 (댓글 수 포함)
title = title_elem.get_text().strip()
# URL 처리
url = title_elem.get('href')
full_url = f"해당 주소" if url.startswith('/') else url
# 중복 체크
if not PopularPost.objects.filter(url=full_url).exists():
# 데이터베이스에 저장
PopularPost.objects.create(
title=title,
url=full_url,
original_url=url,
popular_time=current_time,
crawled_at=current_time
)
new_posts_count += 1
return f"크롤링 완료: {new_posts_count}개의 새 게시글이 저장되었습니다."
except Exception as e:
return f"크롤링 오류 발생: {str(e)}"
✔️ url : 크롤링하고싶은 웹페이지의 url을 지정합니다.
✔️ headers : Http 요청 헤더를 적습니다. 웹사이트가 봇이 아닌 일반 브라우저를 인식하도록 합니다.
✔️ response : requests를 통해 get요청(url과 headers)을 받고 응답을 받습니다.
✔️ soup : 응답받는 html 텍스트를 BeautifulSoup 객체를 파싱합니다. 이를 통해 해당 웹의 정보를 쉽게 탐색할 수 있습니다.
✔️ posts : 해당 웹페이지에서는 제가 원하는 정보가 div.li에 있어 선택했습니다. (관리자 도구로 판별)
✔️ for구문 : 게시글을 한개만이 아닌 여러개를 가져와야하므로 반복문인 for문을 선택하엿습니다.
✔️ title_elem : 인기글의 제목을 포함하는 요소를 찾습니다. 이것 또한 관리자 도구를 통해 마찬가지로 직접 알아야합니다.
✔️ title : 제목 요소를 찾으면 제목만을 남기 부가적인 요소를 제거합니다.
✔️ if not : 혹시 재 크롤링 할 경우 중복되는 데이터가 있을 가능성이 있어서 filter를 통해 url이 중복되면 db에 추가로 저장되지 않도록 하엿습니다.
✔️ PopularPost.objects.create : 새 객체를 생성해서 이를 db에 저장합니다
후기
이렇게 지금은 제목과 url 과 시간만을 가져와서 간단한 형태의 크롤링을 보여드렸습니다. 후에는 이러한 정보 뿐만 아니라 해당게시글의 시간, 추천(좋아요 등) 수, 정렬, 특정시간마다 크롤링과 같은 더 자세한 기능을 보여드리고 싶습니다.
'Django 연습' 카테고리의 다른 글
| 17. Django 알림 시스템 구현 (0) | 2025.04.08 |
|---|---|
| 16. Django 대댓글 기능 구현 (0) | 2025.04.01 |
| 14. Django 쪽지 기능 구현 (0) | 2025.03.19 |
| 13. Django 게시글 북마크 기능 (0) | 2025.03.12 |
| 12. Django 게시글 이미지 추가 (0) | 2025.03.11 |