본문 바로가기

Toy Project/Web Crawling

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

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


목차

 

소개

 1. Library 선언 

MySQL Library 선언

  MySQL과 연동하기 위해 파이썬 모듈중에 하나인 MySQLdb 모듈을 선언하여 준다.

import MySQLdb

 

 

 2. Database와 연결 

Database Connect

  모듈과 Database를 연결시켜 주기 위해, 파이썬의 MySQLdb 객체를 통해 MySQL과 연결시켜준다. 이 때 각 Parameter는 MySQL을 연결 할 때와 동일한 Parameter 이다.

conn = MySQLdb.connect(
    user="userName",
    passwd="password",
    host="hostName",
    db="database schema",
)

MySQLdb.connect 의 Parameter와 해당 사진의 Parameter는 동일하다.

 

 

 3. Cursor 생성 

Cursor 생성

  Query를 실행하기 위해 앞서 만들어진 Connect 객체의 cursor() method를 이용해 Cursor을 생성하여준다.

cursor = conn.cursor()

 

 

 4. 파이썬에서 Query 실행 

Query 실행

  파이썬에서 크롤링한 데이터를 넣기 위해 cursor의 execute method를 통해 Query를 실행시켜준다.

def input_crawl_data(c_data):
    global cursor,conn
    for univ in c_data:
        if " " in univ:
            name,campus = map(str,univ.split())
            cursor.execute(f"INSERT INTO University(name,campus) VALUES(\"{name}\",\"{campus}\")")
        else :
            cursor.execute(f"INSERT INTO University(name) VALUES(\"{univ}\")")

이 때 ex)연세대학교 서울캠퍼스와 같이 분교가 존재하는 학교는 " " 으로 구분되어 있어, 만약 " "가 있다면 캠퍼스를 구분시켜 Database에 저장해주도록 한다.

 

 

 5. 입력된 데이터를 확인 

 

입력된 Data 출력
cursor.execute("SELECT * FROM University")
rows = cursor.fetchall()
for row in rows:
    print(row)

Data가 성공적으로 Database에 들어갔음을 알 수 있다.

 

 

 6. DB 연결 종료 

DB 연결 종료

  원하는 정보를 확인 후  Database와의 연결을 해제 시켜준다.

conn.commit()
conn.close()

 

 

 7. 전체 소스 코드 

import cloudscraper
import requests
import MySQLdb
from bs4 import BeautifulSoup

conn = MySQLdb.connect(
    user="userName",
    passwd="password",
    host="hostName",
    db="database schema",
)

def input_crawl_data(c_data):
    global cursor,conn
    for univ in c_data:
        if " " in univ:
            name,campus = map(str,univ.split())
            cursor.execute(f"INSERT INTO University(name,campus) VALUES(\"{name}\",\"{campus}\")")
        else :
            cursor.execute(f"INSERT INTO University(name) VALUES(\"{univ}\")")
    
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 and '관련' 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()

cursor = conn.cursor()
input_crawl_data(univ_list)
cursor.execute("SELECT * FROM University")
rows = cursor.fetchall()
for row in rows:
    print(row)
conn.commit()
conn.close()