본문 바로가기

Toy Project/Web Crawling

[Web Crawling] 전국 대학교 이름 크롤링 하여 DB에 저장하기 -1

전국 대학교 이름을 크롤링 하여 DB에 저장하기 -1


개요

  Toy Project에서 사용하기 위해 전국의 대학교를 미리 저장하여 DB에 정리하고, 이를 회원가입시에 저장된 DB를 미리 노출 시켜 통일된 양식으로 소속 학교를 받을 수 있도록 나무위키의 전국 대학교가 나와있는 html 페이지를 크롤링 하여 DB에 저장하여본다.

 

목차

 

소개

 1. 해당하는 페이지의 Robots.txt 

나무위키의 Robots.txt 확인하기

  나무위키의 대학교가 나와 있는 페이지를 크롤링하기 위해 먼저 나무위키의 robots.txt를 확인해 주어야 한다.

namu.wiki/robots.txt

조회하려는 url은 아래와 같다.

대학교학교 정보를 나타내는 url

  이 때 나무위키의 robots.txt는 /w 경로를 Allow 하고 있음을 확인 할 수 있으므로, 크롤링을 계속하여 진행해 나가도록 한다.

 

 2. html page의 tag 목록 

추출하려는 값의 tag를 확인하기

  내가 추출하고자 하는 data의 tag 정보를 확인한다.

필요로 하고자 하는 정보의 태그 정보

이 때 대학교의 이름이 나와 있는 태그는 <a> 태그의 class = "wiki-link-internal"임을 확인 할 수 있다. 그리고 해당하는 내용의 대학교 정보는 <a> 태그 안의 title 값과 일반 text에서 살펴 볼 수 있다.

 

 3. 파이썬 크롤링 코드 

정보를 가져오고자 하는 html page를 추출
def get_html(url):              #html 페이지 가져오기
    scraper = cloudscraper.create_scraper()
    html = ""
    g_html = scraper.get(url)
    if g_html.status_code == 200:
        html = g_html.text
        
    return html

페이지를 읽어와 상태 코드가 200으로 통과한 html 페이지를 return 하여준다.

 

가져온 html 페이지에서 필요로 하는 정보 추출
def crawl_html(html):           #가져온 html 페이지의 tag 속 정보 가져오기
    u_list = []
    soup_html = BeautifulSoup(html,'html.parser')
    title = soup_html.find_all('a', class_= "wiki-link-internal")
    for t in title:
        tmp = t["title"]
        if '목록' not in tmp:
            u_list.append(tmp)
    s_list = set(u_list)
    return s_list

BeautifulSoup Module을 통해 html 페이지를 객체에 등록한다.

soup_html = BeautifulSoup(html,'html.parser')

 

BeaultifulSoup 객체의 함수인 find_all 함수를 통해 태그의 class="wiki-link-internal"인 정보들을 전부 가져온다.

title = soup_html.find_all('a', class_= "wiki-link-internal")

title 변수에 들어있는 값

위의 값에서 추출하고자 하는 값은 title 값이므로 아래의 코드를 통해 title 값을 추출한다.

for t in title:
        tmp = t["title"]

 

그 후 값을 정렬하면 원하는 값을 가져올 수 있게 된다.

 

전체코드
import cloudscraper
from bs4 import BeautifulSoup

def get_html(url):              #html 페이지 가져오기
    scraper = cloudscraper.create_scraper()
    html = ""
    g_html = scraper.get(url)
    if g_html.status_code == 200:
        html = g_html.text
        
    return html

def crawl_html(html):           #가져온 html 페이지의 tag 속 정보 가져오기
    u_list = []
    soup_html = BeautifulSoup(html,'html.parser')
    title = soup_html.find_all('a', class_= "wiki-link-internal")
    for t in title:
        tmp = t["title"]
        if '목록' not in tmp:
            u_list.append(tmp)
    s_list = set(u_list)
    return s_list

html = get_html('https://namu.wiki/w/%EB%8C%80%ED%95%9C%EB%AF%BC%EA%B5%AD%EC%9D%98%20%EB%8C%80%ED%95%99%EA%B5%90%20%EB%AA%A9%EB%A1%9D')
univ_list = crawl_html(html)
univ_list = list(univ_list)
univ_list.sort()
for univ in univ_list:
    print(univ, end='\n')