이번 학기에는 "데이터 시각화" 라고 하는 수업을 듣고 있다. "그건 왜 들어요?" 하는 질문을 두 차례 정도 받아본 적 있지만, 기본적으로 재밌을 것 같아서 듣는 거다. 데이터와 관련된 내용을 한 번쯤 듣고 싶은 마음이 있었다. 게다가, 아무리 생각해도 대학원 졸업 후 내가 실용적으로 쓸 수 있는 것은 웨어러블 메커니즘 제작에 관련된 기술 보다는 신체 지표 (심박, 활동량 등) 모니터링일 것 같은 생각에, 대학원 과정 동안 해당 데이터 처리기술을 익혀야겠다 마음 먹은 것이다.
이번에 나온 과제는 서울대 데이터사이언스 대학원 교수진(링크)의 인적사항을 크롤링 하는 것이었다. python에 대한 강의는 최소한으로 진행된 상태였고, 심지어 BeautifulSoup는 언급만 되었을 뿐 실제 사용 예시는 본적도 없었다. 그럼에도 불구하고, 상당히 재미있게 과제를 할 수 있었다.
import requests
from lxml import html
from bs4 import BeautifulSoup
import csv
import pandas as pd
import numpy as np
response = requests.get('https://gsds.snu.ac.kr/faculty/',timeout = 5)
# 사이트의 반응이 늦어 timeout을 설정했지만, 딱히 필요치 않다.
content_html = response.content.decode("utf-8")
# response.content 는 byte형식의 결과물을 내뱉어주므로, utf-8로 decoding이 필요하다
bs = BeautifulSoup(content_html, 'lxml')
# Beautiful Soup는 html을 분석해주는 도구인데, 어떤 규칙에 따를 것인지 설정해줄 수 있다.
# 대표적으로 'lxml'과 'html.parser'가 있는데 lxml이 좀 더 빠르다고들 한다
# 내가 필요로 하는 것은 빠른 속도가 아니기 때문에 어느 것을 써도 상관은 없다.
위와 같이 코드를 돌리면 아래와 같은 결과를 얻을 수 있다. 원본 html 소스페이지와 비교해보았다.
html을 잘 가져온 것을 확인했으니, 본격적으로 필요한 정보를 빼올 차례다. Beautiful Soup의 find 함수가 아주 요긴하게 잘 쓰였다. find 함수를 통해서는 찾고자 하는 태그, class 정보만 있으면 포함된 내용을 가져올 수 있다. 같은 태그/클래스가 여러 차례 반복된다면, 제일 앞에 것만 가져오기 때문에, 모두 보고 싶다면 find_all 함수를 사용해야 한다.
result = bs.find('div', class_ = "ecs-posts")
# class 명이 "ecs-posts"를 포함하는 div 태그 중 첫번째를 찾는다.
urls = ['url']
for tag in result.find_all('a', class_ = 'elementor-button-link elementor-button elementor-size-sm'):
urls.append(tag.get('href'))
# result 안에서 href 속성값을 찾는다.
# tag.text 를 활용하면 텍스트를 모두 긁어올 수도 있다.
urls = pd.DataFrame(urls)
위 코드를 거치고 나면, 아래처럼 예쁜 표를 얻을 수 있다. 바로 교직원 개개인에 대한 상세 url 주소이다. url은 태그 안에서 href 속성값으로 주어지기 때문에, tag.get('href') 함수를 활용했다.
seq = ['seq']
seq.extend(range(1, len(urls)))
seq = pd.DataFrame(seq)
file = pd.concat([seq, urls], axis = 1)
file.to_csv('urls.csv', index = False, header = False)
결과를 csv 파일로까지 저장해주면, 과제를 33% 해결한 셈이 된다. 생각보다 간단하지만, 처음 접하는 문제였기 때문에 상당히 신선했다. 게다가, 주어진 문제가 위 내용 뿐인 것은 아니었고, 다른 문제의 경우 상당히 지저분한 방식으로 풀어야 했던 것도 있었다. 결과적으로는 신체 모니터링을 위한 지표를 분석하는 것과는 영 관련이 없는 연습이라고 할 수 있겠지만, 막 그렇게 필요 없는 지식까지는 아니라고 할 수 있다.
'트렌드 한눈에 보기 > 학계 트렌드' 카테고리의 다른 글
내가 하루 종일 걸려서 디자인을 하고 있는 이유 - 솔리드웍스 (0) | 2021.09.29 |
---|---|
스스로 애자일로 성장하는 방법 - 함께 자라기, 애자일로 가는 길 [자라기 편] (0) | 2021.09.25 |
좋은 TA가 되는 법 - 동역학 (0) | 2021.09.13 |
[경영학과 / 기계공학부] 팀플 망하는 세 가지 방법 (0) | 2021.09.08 |
근골격계 보조 슈트를 개발하기 위해 필요한 것들 1편 (0) | 2021.08.12 |