본문 바로가기
TIL/Python | Django

2021.8.24 TIL : [Python] 웹 크롤러 - 1

by yeon_zoo 2021. 8. 24.

개인적으로 웹 크롤링은 가장 배우고 싶은 부분 중에 하나였다. 프로젝트 하는 중에 크롤링이 필요한 부분도 있고 해서 시간이 난 김에 배워보기로 했다. 

 

먼저 python 과 pip, jupyter, beautifulsoap4 를 깔아줬다. (python과 pip는 이미 있어서 pip만 최신 버전으로 업데이트 해줬다.) jupyter은 IDE는 아니지만, python 코드를 한 줄 한 줄 실행해볼 수도 있고, 시각화도 가능한? 툴이라고 한다. jupyter을 다운로드 받은 후에 jupyter notebook 하면 브라우저에서 확인할 수 있다.

$ pip install jupyter
$ pip install beautifulsoap4
$ jupyter notebook

이제 jupyter에서 python 코드들을 실행해 볼 수 있다.

 

간단하게 먼저 공지사항들을 크롤링 해볼 예정이다. 참고한 유투브에서는 나동빈님 개인 웹사이트를 크롤링했지만, 나는 경영대 웹사이트의 학부 공지사항을 크롤링 해봤다. 

import requests

request = requests.get('https://builder.hufs.ac.kr/user/indexSub.action?codyMenuSeq=134277433&siteId=hufsbizz&menuType=T&uId=2&sortChar=ABE&menuFrame=left&linkUrl=2_1_4.html&mainFrame=right')

html = request.text

print(html)

requests.get을 하면 웹사이트를 get 해 올 수 있다. 이렇게 프린트를 하면 다음과 같은 결과를 확인할 수 있다.

우리 학교 웹사이트 같은 경우는 브라우저에서 우리가 흔히 보는 상단의 URL은 고정되어 있으면서도 내부적으로? URL이 바뀌는 것을 확인할 수 있었다. 이럴 때 해당 링크로 이동하는 부분을 마우스 왼쪽 클릭해서 링크 주소 복사 하면 상세 URL을 알 수 있다.

이렇게 우선 html 전체를 얻어올 수 있었다. 이제 html 내부에서 공지사항 제목에 해당하는 부분들만 따로 가져오면 된다. 

 

import requests
from bs4 import BeautifulSoup

request = requests.get('https://builder.hufs.ac.kr/user/indexSub.action?codyMenuSeq=134277433&siteId=hufsbizz&menuType=T&uId=2&sortChar=ABE&menuFrame=left&linkUrl=2_1_4.html&mainFrame=right')

html = request.text

soup = BeautifulSoup(html, 'html.parser')
links = soup.select('td > a')


for link in links:
    if link.has_attr('href'):
        if link.get('href').find('boardList') != -1:
            print(link.text)

이 때 BeautifulSoup를 import 해주고, html 내부를 파싱(각각의 요소, 태그들로 분해하는 작업) 해준다. links라는 변수에 td 태그 내의 a 태그들을 연결해주고, 각각의 a 태그들 중에 href 속성이 있는 태그들, 그 중에서도 href 속성에 boardList라는 말이 있는 태그들만 프린트 해주게 되면 공지사항의 제목들을 파악할 수 있다. 여기서 td > a 나 boardList 같은 경우는 내가 크롤링 하고 싶은 부분에 따라 달라진다. 경영대에서 공지사항 url들에 boardList라는 단어를 포함시켰기 때문에 나는 그것을 이용해서 불러온 것이다. 

댓글