개인적으로 웹 크롤링은 가장 배우고 싶은 부분 중에 하나였다. 프로젝트 하는 중에 크롤링이 필요한 부분도 있고 해서 시간이 난 김에 배워보기로 했다.
먼저 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라는 단어를 포함시켰기 때문에 나는 그것을 이용해서 불러온 것이다.
'TIL > Python | Django' 카테고리의 다른 글
2021.11.18 TIL : [Python] 비동기 프로그래밍 (0) | 2021.11.18 |
---|---|
2021.8.25 TIL : [Python] 웹 크롤러 - 2 (0) | 2021.08.24 |
2021.8.23 TIL : [Python] 기초 문법9 - super() (2) | 2021.08.23 |
2021.8.9 TIL : [Django] DRF 4 - View Sets & routers (0) | 2021.08.09 |
2021.8.7 TIL : [Django] DRF 3 - authentication (0) | 2021.08.07 |
댓글