[11/3~11/18] 전국 고등학교 공립/사립 나누기

2017. 11. 19. 20:10프로젝트 기록

-개요-

동기

회사에서 요구한 전국 고등학교 리스트를 수집, 엑셀 파일로 정리해 본 결과, 이때 사용했던 '단순 키보드와 마우스 매크로' 프로그램으론 막대한 양의 데이터를 수집하는데 한계를 느꼈다. 앞으로 회사에 필요한 많은 양과 복잡한 데이터들을 더욱 쉽고 빠르게 수집, 처리하고 싶다는 욕구가 생겼다.

그러던 중, 형이 택배를 대신 받아달라고 부탁한, '머신러닝, 딥러닝 실전 개발 입문 (파이썬을 이용한, 웹 크롤링과 스크레이핑부터 머신러닝,딥러닝까지 체계적으로 배우기)'이란 기술도서를 우연히 접하였고(11/3), 그 날 새벽까지 책을 훑어본 결과, 파이썬이라면 내가 원하는 자동화 스크롤을 쉽고 빠르게 할 수 있겠다고 확신했다.


구체적인 목표

1. 전국 고등학교 리스트를 사립, 공립으로 나누어 엑셀로 정리.

2. 파이썬과 크롤링에 대한 기초 지식 획득.

3. 막대한 양의 데이터 수집과 처리를 자동화시키기.


통념

새로운 기술을 습득할 땐, 기초부터 탄탄히, 즉 선생 또는 교수에게 제도권 교육 속 커리큘럼을 배우는 것이 가장 효과적이다.


통념 깨기

- 파이썬에 대한 1 부터 10 까지의 항목 중, 내가 원하는 것은 3.

- 지금 당장 내가 원하는 3을 위해 나머지 관심 없는 9개 항목을 습득할 필요도 없을뿐더러 시간과 돈이 아깝다.

- 3을 위해 1과 2가 필요하다면, 학교,학원, 인강 듣지 않고 현재 가지고 있는 기술 도서 (앞부분 약 70p)와 구글링, 카카오톡 오픈 채팅으로 충분히 습득할 수 있다.


전략 설정

1. 해야만 하는 것

-파이썬에 대한 기본 지식 습득

-코딩 및 실행, 오류 수정

2. 하면 좋은 것

-예외 처리 (나중에 피드백 받음)

-코딩 간결화 ("")

3. 해도 되고 안 해도 되는 것

4. 하면 좋지 않은 것

5. 해서는 안 되는 것


위의 다섯 가지 항목을 토대로 설정

1. 책과 구글링을 통한 언어 환경 구축

2. 책을 통해 지금 당장 필요한 최소한의 지식 습득 & 응용

3. 구글링을 통한 원하는 코드 수집 및 코딩 실행

- 위키피디아에서 원하는 데이터 가져오기

- 엑셀에서 원하는 데이터 가져오기

- 엑셀에서 가져온 데이터를 파이썬을 통해 크롤링할 페이지 접속하여 원하는 데이터 추출

- 가져온 데이터를 다시 엑셀에 정리, 저장하기


기간 설정

~11/19


전략 실행(실천)

아래 항목 참조


실제 걸린 기간

~11/18


피드백(반성)

코딩의 간결화는 재밌을 뿐더러 미래를 위해 정말 좋은 일이다.

그러니 간결화 할 수 있는 방법을 많이 생각하자.

항상 지금의 코딩이 완벽하다 생각하지 말자.

코딩의 예외처리와 주석을 다는 것은 공유를 할 때 남을 위한 것 뿐만 아니라 미래의 '나'를 위한 일이기도 하다.


얻은 능력

파이썬과 BeautifulSoup4를 이용한 기본적인 웹 크롤링 능력 + 엑셀 연동


다음 목표

대학 동기들을 위해 카카오톡 챗봇을 이용한 대학교 학식 알림 서비스 제작


-도식화-

워렌 버핏 사고법


-구체적인 실천 과정-

(11/4)

-환경 구축

https://tutorial.djangogirls.org/ko/python_installation/

위 사이트를 참고하여 파이썬 설치

http://shaeod.tistory.com/900

위 사이트를 참고하여 BeautifulSoup4 설치


(~11/11)

위키피디아에서 원하는 데이터 가져오기

import requests

from bs4 import BeautifulSoup


response = requests.get('https://ko.wikipedia.org/wiki/사곡고등학교')


html = response.text


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


zz = soup.select('#mw-content-text > div > table.infobox > tr:nth-of-type(5) > td')


print(zz)


결과>

파이썬 크롤링


(~11/14)

엑셀에서 원하는 데이터 가져오기

import openpyxl


filename = "학교 리스트.xlsx"

book = openpyxl.load_workbook(filename,data_only=True)


sheet = book.worksheets[0]


data = []

for row in sheet.rows:

    data.append([

        row[1].value

        ])


del data[0]

del data[0]

del data[0]


data2 = []

for row2 in sheet.rows:

    data2.append([

        row2[0].value

        ])



for i in data:

    if i == data2[0]:

        print("값 없지롱")


    else:

        print(i)

x = 5

sheet.cell(row=2,column=4).value = x

book.save("학교매크로.xlsx")

book.close()


결과>

파이썬 크롤링

파이썬 크롤링


(~11/15)

엑셀에서 가져온 데이터를 파이썬을 통해 크롤링할 페이지 접속하여 원하는 데이터 추출(1)

import openpyxl

import requests

from bs4 import BeautifulSoup

filename = "학교 리스트.xlsx"

book = openpyxl.load_workbook(filename)

sheet = book.worksheets[0]

data = []

for row in sheet.rows:

    data.append([

        row[1].value

        ])

del data[0]

del data[0]

del data[0]

data2 = []

for row2 in sheet.rows:

    data2.append([

        row2[0].value

        ])

for i in data:

    if i != data2[0]: #엑셀의 셀 값이 빈값일 아닐 경우에만 작동

        newstr = str(i).replace("[","") #i의 값은 배열이므로 문자열로 치환

        newstr2 = newstr.replace("]","") # i의 값이 ['무슨학교'] 이므로 [ , ' , ] 삭제

        newstr3 = newstr2.replace("'","")

        response = requests.get('https://ko.wikipedia.org/wiki/' + newstr3) #리스트 학교 위키피디아에 검색

        html = response.text

    

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

        zz = soup.select('#mw-content-text > div > table.infobox > tr:nth-of-type(5) > td')

        zz2 = soup.select('#mw-content-text > div > table.infobox > tr:nth-of-type(4) > td')

        for gg in zz:

            if gg.text == "사립":

                print(gg.text)

            elif gg.text == "공립":

                print(gg.text)

            else: # 사립, 공립 말고 다른 값이 나왔다면 다른걸 가져왔다는 의미, 그럴땐 zz2를 사용하

                for gg2 in zz2:

                    print(gg2.text)


결과>

파이썬 크롤링

(~11/16)

가져온 데이터를 다시 엑셀에 정리, 저장하기

import openpyxl
import requests
from bs4 import BeautifulSoup
filename = "학교 리스트.xlsx"
book = openpyxl.load_workbook(filename)
sheet = book.worksheets[0]
for a in range(1, 17):
    data = []
    for row in sheet.rows:
        data.append([
            row[2*a-1].value
            ])
    del data[0]
    del data[0]
    del data[0]
    data2 = []
    k=4
    for row2 in sheet.rows:
        data2.append([
            row2[0].value
            ])
    for i in data:
        if i != data2[0]: #엑셀의 셀 값이 빈값일 아닐 경우에만 작동
            newstr = str(i).replace("[","") #i의 값의 형태가 배열이므로 문자열로 치환
            newstr2 = newstr.replace("]","") # i의 값이 ['무슨학교'] 이므로 [ , ' , ] 삭제
            newstr3 = newstr2.replace("'","")
            response = requests.get('https://ko.wikipedia.org/wiki/' + newstr3) #리스트 학교 위키피디아에 검색
            html = response.text
    
            soup = BeautifulSoup(html, 'html.parser')
            zz = soup.select('#mw-content-text > div > table.infobox > tr:nth-of-type(5) > td')
            zz2 = soup.select('#mw-content-text > div > table.infobox > tr:nth-of-type(4) > td')

            for gg in zz:
                if gg.text == "사립":
                    sheet.cell(row=k,column=2*a+1).value = gg.text
                    k = k+1
                elif gg.text == "공립":
                    sheet.cell(row=k,column=2*a+1).value = gg.text
                    k = k+1
                else: # 사립, 공립 말고 다른 값이 나왔다면 다른걸 가져왔다는 의미, 그럴땐 zz2를 사용하
                    for gg2 in zz2:
                        sheet.cell(row=k,column=2*a+1).value = gg2.text
                        k = k+1
book.save("학교리스트매크로.xlsx")
book.close()

결과>
파이썬 크롤링

(~11/18)

코딩 수정, 예외처리

문제점> 크롤링을 위한 기법 중 select 함수를 사용했는데, 자료의 양이 방대해지니 그만큼 잘못된 데이터를 가져올 확률도 커짐(모든 위키피디아 페이지가 동일하게 구성되있지는 않다는 것.)

해결> select 대신 find 사용

결과> 원하는 데이터를 확실하게 가져올 수 있고, 코딩도 간략해짐


import openpyxl

import requests

from bs4 import BeautifulSoup


filename = "학교 리스트.xlsx"

book = openpyxl.load_workbook(filename)

sheet = book.worksheets[0]

for a in range(1, 17):

    data = []

    for row in sheet.rows:

        data.append([

            row[2*a-1].value

            ])

    del data[0]

    del data[0]

    del data[0]

    data2 = []

    k=4

    for row2 in sheet.rows:

        data2.append([

                row2[0].value

                ])


    for i in data:

            if i != data2[0]: #엑셀의 셀 값이 빈값일 아닐 경우에만 작동

                newstr = str(i).replace("[","") #i의 값의 형태가 배열이므로 문자열로 치환

                newstr2 = newstr.replace("]","") # i의 값이 ['무슨학교'] 이므로 [ , ' , ] 삭제

                newstr3 = newstr2.replace("'","")

                response = requests.get('https://ko.wikipedia.org/wiki/' + newstr3) #학교 리스트를 위키피디아에 검색


                html = response.text


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


                table = soup.find('table', attrs = {'class':'infobox'})


                if table is not None:

                    if "사립" in table.text:

                        sheet.cell(row=k,column=2*a+1).value = "사립"

                        k = k+1

                        print(newstr3 + "는 사립학교입니다.")

                    elif "공립" in table.text:

                        sheet.cell(row=k,column=2*a+1).value = "공립"

                        k = k+1

                        print(newstr3 + "는 공립학교입니다.")

                    else:

                        sheet.cell(row=k,column=2*a+1).value = "학교에 대한 정보가 없습니다."

                        k = k+1

                        print(newstr3 + "데이터가 없습니다")

                else:

                    sheet.cell(row=k,column=2*a+1).value = "위키피디아 페이지 문제"

                    k = k+1

                    print(newstr3 + "의 위키피디아 페이지에 문제가 있습니다.")

book.save("학교리스트매크로.xlsx")

book.close()


결과>

파이썬 크롤링