[천재교육] 프로젝트 기반 빅데이터 서비스 개발자 양성 과정 9기
학습일 : 2024.08.14
📕 학습 목록
- Local Library 웹 애플리케이션 기능 구현
- 웹 크롤링
📗 프로젝트 작업 내역
1. 프로젝트 기능 구현
1) 도서 및 저자 정보 관리
- 도서 목록 페이지 구현: BookListView 클래스 기반 뷰를 사용해 Book 모델의 모든 도서를 조회하고, paginate_by = 5 설정으로 페이지네이션을 제공
class BookListView(LoginRequiredMixin, generic.ListView):
model = Book
paginate_by = 5
- 도서 상세 페이지: BookDetailView 클래스를 사용하여 각 도서의 세부 정보를 표시
class BookDetailView(generic.DetailView):
model = Book
- 저자 목록 및 상세 페이지: AuthorListView 및 AuthorDetailView를 통해 저자 목록과 상세 정보를 제공
class AuthorListView(generic.ListView):
model = Author
paginate_by = 5
class AuthorDetailView(generic.DetailView):
model = Author
2) 검색 및 필터링 기능
- 키워드 기반 검색: index 함수형 뷰에서 키워드를 통해 도서 목록을 필터링
def index(request):
keyword = request.GET.get("keyword")
num_books_by_keyword = Book.objects.filter(title__exact=keyword).count()
context = {
"num_books_by_keyword": num_books_by_keyword,
}
return render(request, "index.html", context=context)
3) 사용자 인증 및 권한 관리
- 사용자 로그인 및 로그아웃: Django 기본 인증 시스템을 사용하며, LoginRequiredMixin을 통해 특정 페이지 접근을 제한
class BookListView(LoginRequiredMixin, generic.ListView):
model = Book
paginate_by = 5
- 관리자 권한 설정: PermissionRequiredMixin을 통해 관리자만 특정 페이지에 접근할 수 있도록 제한
class AllBorrowedBookListView(LoginRequiredMixin, PermissionRequiredMixin, generic.ListView):
permission_required = "user.is_staff"
4) REST API 제공
- 도서 목록 API: BookListAPIView 클래스에서 모든 도서 정보를 JSON 형식으로 반환
class BookListAPIView(APIView):
def get(self, request):
books = Book.objects.all()
serializer = BookSerializer(books, many=True)
return Response(serializer.data)
- 도서 인스턴스 API: BookInstanceAPIView에서 특정 도서의 인스턴스를 JSON으로 제공하며, GET 및 POST 요청을 지원
class BookInstanceAPIView(APIView):
def get(self, request):
book_id = request.GET["book_id"]
copy_list = BookInstance.objects.filter(book__id=book_id)
serializer = BookInstanceSerializer(copy_list, many=True)
return Response(serializer.data)
5) UI 및 CSS 스타일링
- CSS 스타일 적용: styles.css에서 사이드바 및 버튼 스타일을 설정하여 UI를 구성
.sidebar-nav {
margin-top: 20px;
padding: 0;
list-style: none;
}
#logout-form {
display: inline;
}
2. 웹 크롤링
1) 정의
- 자동화된 스크립트를 사용해 웹 페이지의 내용을 탐색하고, 필요한 데이터를 추출하여 수집하는 과정
- 크롤링 대상은 웹 페이지의 텍스트, 이미지, 링크 등 다양한 요소가 될 수 있음
2) 필요성
- 데이터 수집: 웹에 공개된 데이터를 수집하여 데이터베이스로 구축하거나 분석 자료로 사용
- 정보 제공: 최신 정보를 모니터링하고 사용자에게 실시간으로 제공하는 서비스에 활용
- 시장 조사: 가격 비교, 경쟁사 분석, 트렌드 분석 등을 위해 유용
3) 주요 구성 요소
- 크롤러(Crawler): 웹 페이지를 자동으로 방문하는 프로그램으로, 목표 웹 사이트의 링크를 따라가며 데이터를 수집
- 파서(Parser): HTML 구조에서 필요한 데이터 요소를 추출하는 모듈로, 주로 BeautifulSoup 같은 라이브러리가 사용됨
- 저장 모듈: 추출된 데이터를 구조화하여 CSV, 데이터베이스 등 다양한 포맷으로 저장
4) 웹 크롤링 절차
① 목표 설정: 수집할 웹 사이트와 데이터의 종류를 정의
② HTML 요청: HTTP GET 요청을 통해 웹 페이지의 HTML 소스를 가져옴. 주로 requests 라이브러리가 사용됨
③ HTML 파싱: HTML 구조에서 필요한 데이터를 찾기 위해 파서를 사용(BeautifulSoup, lxml 등)
④ 데이터 저장: 추출한 데이터를 구조화하여 저장하고, 필요한 경우 후속 분석을 위해 데이터베이스로 전송
⑤ 반복 및 링크 탐색: 웹 페이지의 링크를 추출하여 크롤링을 반복하며 데이터 범위를 확장
5) 웹 크롤링 종류
- 정적 웹 크롤링: 페이지의 HTML 구조가 고정되어 있는 경우, 단순히 HTML을 요청하고 데이터를 추출
- 동적 웹 크롤링: 자바스크립트로 동적 생성된 콘텐츠를 처리해야 하는 경우로, Selenium 같은 브라우저 자동화 도구를 사용해 렌더링된 페이지에서 데이터를 수집
6) 웹 크롤링 도구 및 라이브러리
- Requests: HTTP 요청을 쉽게 할 수 있는 라이브러리로, GET, POST 등의 요청 메서드를 지원
- BeautifulSoup: HTML과 XML 파싱을 위한 파이썬 라이브러리로, 필요한 데이터 요소를 쉽게 추출할 수 있음
- Selenium: 웹 브라우저를 자동으로 조작할 수 있는 라이브러리로, 동적 웹 페이지의 크롤링에 주로 사용됨
- Scrapy: 대규모 크롤링을 위해 설계된 프레임워크로, 데이터를 효율적으로 수집, 관리, 저장할 수 있도록 지원
7) 코드 실습
import requests
from bs4 import BeautifulSoup
# 1. HTML 요청
url = "https://example.com"
response = requests.get(url)
# 2. 파싱 및 데이터 추출
soup = BeautifulSoup(response.text, "html.parser")
titles = soup.find_all("h2") # h2 태그로 된 제목 추출
# 3. 데이터 저장
for title in titles:
print(title.text)
[tip] 웹 크롤링 vs 파싱 vs 스크롤링
크롤링(Web Crawling) | 파싱(Parsing) | 스크롤링(Scrolling) | |
정의 | 웹 페이지를 자동으로 탐색하며 데이터를 수집하는 프로세스 |
HTML이나 XML 구조에서 필요한 데이터를 추출하는 과정 |
웹 페이지의 내용을 아래로 이동하여 추가 데이터를 불러오는 동작 |
목적 | 필요한 데이터가 포함된 여러 페이지를 자동으로 방문하고 수집 | 수집한 HTML 등에서 특정 데이터 요소를 식별하고 추출 |
페이지에 표시되지 않은 데이터까지 불러와 더 많은 데이터를 볼 수 있게 함 |
사용 도구 | Requests, Scrapy, BeautifulSoup, Selenium | BeautifulSoup, lxml, 정규표현식 | Selenium, Puppeteer |
주요 단계 | 1. 웹 페이지 요청 2. HTML 소스 코드 수신 3. 다음 페이지 링크 탐색 4. 데이터 수집 |
1. HTML 소스 코드 준비 2. 요소 검색 및 추출 3. 텍스트 정제 및 데이터 저장 |
1. 페이지 로드 2. 스크롤 이동 및 데이터 추가 로딩 3. 페이지 끝까지 반복 이동 |
사용 예시 | 여러 페이지의 뉴스 기사나 블로그 게시물 자동 수집 | HTML에서 제품 가격, 이름 등을 추출하여 데이터화 | 무한 스크롤 페이지에서 전체 상품 목록 확인 |
주요 활용 | 대규모 데이터 수집, 트렌드 분석, 데이터베이스 구축 | 웹페이지에서 특정 정보만 추출, 데이터 정제 | 동적 콘텐츠 로딩 페이지에서 추가 콘텐츠를 불러옴 |
한계 | 데이터 과다 수집 시 IP 차단 가능, robots.txt 준수 필요 | HTML 구조가 변경되면 추출 코드 수정 필요 | 무한 스크롤은 서버 부하 증가 가능성 |
주요 특징 | 여러 링크를 따라가며 다양한 웹 페이지 데이터를 탐색하고 수집 | HTML 트리 구조에서 필요한 부분을 지정하여 데이터를 변환 및 정제 | 페이지의 끝까지 내려가며 데이터를 추가로 로딩하여 전체 정보를 수집 |
📙 내일 일정
- Machine Learning 개론
'TIL _Today I Learned > 2024.08' 카테고리의 다른 글
[DAY 27] 분류 / 회귀 모델 (0) | 2024.08.20 |
---|---|
[DAY 26] Machine Learning 개론 (1) | 2024.08.19 |
[DAY 24] Django 웹 애플리케이션 개발 (0) | 2024.08.13 |
[DAY 23] Django 웹 애플리케이션 개발 (0) | 2024.08.12 |
[DAY 22] Flask (0) | 2024.08.09 |