기타 개발공부

학교 공지사항 웹 크롤링 하기

땅콩콩 2022. 11. 25. 16:20

학교 정보를 편리하게 제공해주는 웹사이트를 만들면서, 사용자의 전공에 맞춰서 해당학과의 공지사항을 우리 서비스의 메인페이지에서 보여주려고 했다.

그래서 학과별 홈페이지의 공지사항을 크롤링할일이 생겼는데 생각보다 재밌었다!!

아래는 예시 코드이당

import re
import requests
from bs4 import BeautifulSoup as bs
from rest_framework.generics import ListAPIView
from rest_framework.response import Response

# 예술대학 (음악학부, 미술학부, 공연예술학부)
    def arts(self):
        result = []
        baseUrl = 'https://art.kookmin.ac.kr/community/notice/'
        res = requests.get(baseUrl)
        soup = bs(res.content, 'html.parser')
        notice = soup.find_all('li', class_='subject')[1:6]
        for notice_id, n in enumerate(notice):
            notice_title = escape_ansi(n.get_text()).strip()  # 공백제거
            notice_link = baseUrl + n.find('a', href=True)['href']
            notice_obj = {
                'id': notice_id + 1,
                'major': "예술대학",
                'title': notice_title,
                'url': notice_link,
            }
            result.append(notice_obj)
        return {"result": result}
  • import re : 파이썬의 정규표현식 모듈.
  • from bs4 import Beautifulsoup as bs : bs4의 Beautifulsoup 패키지를 bs라는 이름으로 가져온다.

먼저 baseurl에 들어가게 될 링크, 즉 내가 정보를 긁어오고싶은 웹페이지 링크의 소스보기를 한다.

그럼 내가 원하는 정보를 감싸고 있는 수많은 태그들을 볼 수 있다.

위 코드에서 notice라는 변수로 받아오는 다음 코드를 수정해주면 되는데

notice = soup.find_all('li', class_='subject')[1:6]

내가 보고있는 페이지의 경우 <li>태그, 그리고 class속성은 'subject'로 지정된 부분이 공지사항 글의 각 제목부분이다. (맨 처음에 나오는 테이블 칼럼도 포함되기때문에 인덱스를 [1:6]으로 조절해줬다.)

만약 제목이 div태그나 td태그에 들어있다면, 혹은 class속성이 다르다면 자신이 크롤링하고자 하는 웹페이지에 맞게 해당 부분을 수정해주면 된다!

 

그리고 이제 공지의 제목을 받아오는 부분에서 앞뒤공백이 너무 길어서 strip()으로 처리해줬다.

escape_ansi는 escape문자를 제거하는 함수이다.

def escape_ansi(line):
    ansi_escape = re.compile(r'(\xd7|\n)')
    return ansi_escape.sub('', line).replace('\t', '')
notice_title = escape_ansi(n.get_text()).strip()  # 공백제거

이렇게 하고 python파일을 실행해보면 다음과 같이 웹크롤링이 정상적으로 되는 것을 볼 수 있다.

이제 크롤링한 정보들을 어떤 방식으로 유저의 전공과 연결해서 실행시킬지는 이후 포스팅으로 작성하도록 하겠다!