본문 바로가기
TIL _Today I Learned/2024.08

[DAY 25] Django 웹 애플리케이션 개발, 웹 크롤링

by gamdong2 2024. 8. 14.
[천재교육] 프로젝트 기반 빅데이터 서비스 개발자 양성 과정 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 개론