본문 바로가기
Python

[python] 엑셀 파일 내 자격증 게시판 파일 url 다운로드 해보기

by 퍼포먼스마케팅코더 2022. 9. 18.
반응형

python 엑셀 파일 내 자격증 게시판 파일 url 다운로드 해보기

 

어떤 자격증 사이트가 있어요. 자격증 게시판이 있는데 아주 유용한 사이트입니다. 여러분도 들어가서 보시면 아시겠지만 여기 밑에 url이 있어요. url에 들어가보면 각종 자격증과 관련된 모든 기출문제가 많을 것 같습니다. 하지만 몇 가지만 저에게 해당하는 자격 정보만 얻고 싶어서 수동으로 다운로드가 너무 귀찮아서 자동으로 파이썬 코딩을 통해 파일을 다운로드하는 이 방법을 선택했습니다. 천성적인 것 같아요. ㅋㅋ

 

자동으로 파이썬 코딩을 통해서 저에게 필요한 이 부분만 다운받아 보았습니다. 이 코딩을 많이 사용할 거라고 생각하지 않아요. 각각의 자격증 게시판에 있던 기출문제 등도 다양하고 다른 부분들이 많이 있어서 수동 노가다식으로 2~30번 클릭만 해도 거의 끝나는 문제거든요. 귀찮아하시는 분들을 위해 만들어놓은 파이썬 코딩입니다.

 

여기 게시판의 이름과 자격증만 적으면 폴더가 자동으로 생성되고 페이지가 어느 정도까지 페이지인지까지 입력할 수 있습니다. 한글파일이면 한글파일로 다운로드 되고 게시판url에 들어가 웹페이지 링크를 다운로드합니다. 모두 자동으로 출력됩니다. 아주 간단하게 만들어 놓았기 때문입니다.

 

아래에 코딩을 사용할 때 폴더를 생성했을 때 폴더 이름 디렉토리에 주의하시기 바랍니다. 여러분 임의대로 설정하지 않으면 파일을 다운로드 할 수 없습니다. 주의해서 사용만 해보면 될 것 같아요. 어차피 게시판에 있는 특정 파일만 내려받을 수 있게 해놨기 때문에 그렇게 어려운 부분은 없습니다. 그런데 사용할 때 한 가지 오류가 발견되는 부분이 있습니다.

 

엑셀 파일 등을 사용할 때 오류가 있을 수 있는데, 이는 한글 문자열인 경우가 대부분입니다. 만약 csv 엑셀 파일을 열었을때 만약 열리지 않는 것이 있다면 100% 그것은 인코딩 문제입니다. 인코딩 문제는 보통 세 가지 형식에서 다 해결됩니다. 

 

대표적인 예는 제가 밑에다가 써놓을 테니까 인코딩 하셨을 때 부분만 참고만 하셔서 집어넣어주시면 될 것 같습니다. 이외에는 크게 어려운 상황은 없을 것 같네요. 오늘은 여기까지입니다. 오늘 봐주셔서 감사합니다.

 

해결방법:

encoding = cp949, euc-kr, utf-8-sig 

 

import requests
from bs4 import BeautifulSoup
import re
import time
import os
import  urllib.request


mid = 'cey' #게시판
folder_name = '정보통신기사'  #자격증명





############# 최대 페이지 알기


url = 'https://www.comcbt.com/xe/{}'.format(mid)  #URL 입력

headers = { 'Accept-Language' : 'ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7,zh-TW;q=0.6,zh;q=0.5',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36',
            'Accept-Encoding': 'gzip'
}


raw = requests.get(url=url, headers=headers)

html = BeautifulSoup(raw.text, 'html.parser')
page_num = html.find_all('a', {'class' : 'frst_last'}) #페이지네이션 긁어오기

for last in page_num :
    last = last.text  #max 페이지 알기

max_page = int(last) + 1 #+1 해두기



############# 폴더 생성

directory = 'C:/Users/user/raw/down/자격증/{}/'.format(folder_name) 
try:
    if not os.path.exists(directory):
        os.makedirs(directory)  #폴더 없으면 생성
except OSError:
    print("Error: Failed to create the directory.") 


for n in range(1, max_page) : #페이지 개수
    url = 'https://www.comcbt.com/xe/index.php?mid={}&page='.format(mid) + str(n)  #URL 입력

    headers = { 'Accept-Language' : 'ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7,zh-TW;q=0.6,zh;q=0.5',
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36',
                'Accept-Encoding': 'gzip'
    }


    raw = requests.get(url=url, headers=headers)

    html = BeautifulSoup(raw.text, 'html.parser')

    results = html.find_all('a', {'class' : 'hx'})

    for url in results : #게시판 URL 들어가기
        url = url['href']
        headers = { 'Accept-Language' : 'ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7,zh-TW;q=0.6,zh;q=0.5',
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36',
                'Accept-Encoding': 'gzip'
        }

        raw = requests.get(url=url, headers=headers)

        html = BeautifulSoup(raw.text, 'html.parser')

        down_results = html.find('article')

        down_results_2 = down_results.find_all('a')

        ############# 웹페이지 링크 다운로드            
        for i in down_results_2 :
            try :
                title = i.text #제목 
                i = i['href'] #다운로드 링크
                #print(title)
                #print(i)
                #print(i)
                if not i.find("procFileDownload") == -1 :  #해당 문자를 포함할 경우(url기준)
                    print(i)
                    print(title)
                    try :
                        urllib.request.urlretrieve(i, str(directory)+str(title)+".hwp")   #png 아닌 jpg 파일로 저장
                    except :
                        pass
                else :
                    pass
            except :
                pass
    print(str(n) + "의 페이지 다운로드 완료되었습니다.")
    time.sleep(1) #1초
print("최종 완료")

 

 

 

 

import requests
from bs4 import BeautifulSoup
import re
import time
import os
import  urllib.request
import pandas as pd

certificates= pd.read_csv('C:/Users/user/raw/down/keyword.csv', encoding='cp949') #엑셀파일화

for num in range(211, len(certificates)) : 
    mid = certificates.loc[num, 'no'] #게시판
    folder_name = certificates.loc[num, 'keyword']  #자격증명

    ############# 최대 페이지 알기

    url = 'https://www.comcbt.com/xe/{}'.format(mid)  #URL 입력

    headers = { 'Accept-Language' : 'ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7,zh-TW;q=0.6,zh;q=0.5',
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36',
                'Accept-Encoding': 'gzip'
    }


    raw = requests.get(url=url, headers=headers)

    html = BeautifulSoup(raw.text, 'html.parser')
    page_num = html.find_all('a', {'class' : 'frst_last'}) #페이지네이션 긁어오기

    for last in page_num :
        last = last.text  #max 페이지 알기

    max_page = int(last) + 1 #+1 해두기



    ############# 폴더 생성

    directory = 'C:/Users/user/raw/down/자격증/{}/'.format(folder_name) 
    try:
        if not os.path.exists(directory):
            os.makedirs(directory)  #폴더 없으면 생성
    except OSError:
        print("Error: Failed to create the directory.") 


    for n in range(1, max_page) : #페이지 개수
        url = 'https://www.comcbt.com/xe/index.php?mid={}&page='.format(mid) + str(n)  #URL 입력

        headers = { 'Accept-Language' : 'ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7,zh-TW;q=0.6,zh;q=0.5',
                    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36',
                    'Accept-Encoding': 'gzip'
        }


        raw = requests.get(url=url, headers=headers)

        html = BeautifulSoup(raw.text, 'html.parser')

        results = html.find_all('a', {'class' : 'hx'})

        for url in results : #게시판 URL 들어가기
            url = url['href']
            headers = { 'Accept-Language' : 'ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7,zh-TW;q=0.6,zh;q=0.5',
                    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36',
                    'Accept-Encoding': 'gzip'
            }

            raw = requests.get(url=url, headers=headers)

            html = BeautifulSoup(raw.text, 'html.parser')

            down_results = html.find('article')

            down_results_2 = down_results.find_all('a')

            ############# 웹페이지 링크 다운로드            
            for i in down_results_2 :
                try :
                    title = i.text #제목 
                    i = i['href'] #다운로드 링크
                    #print(title)
                    #print(i)
                    #print(i)
                    if not i.find("procFileDownload") == -1 :  #해당 문자를 포함할 경우(url기준)
                        print(i)
                        print(title)
                        try :
                            urllib.request.urlretrieve(i, str(directory)+str(title)+".hwp")   #png 아닌 jpg 파일로 저장
                            time.sleep(1) #1초
                        except :
                            pass
                    else :
                        pass
                except :
                    pass
        print(str(n) + "의 페이지 다운로드 완료되었습니다.")
        time.sleep(1) #1초
    print("최종 완료")
    
#'utf-8' codec can't decode byte 0xc1 in position 16: invalid start byte 
#오류 발견시 encoding = 'cp949' 로 해주면 된다.

 

 

 

 

 

#실기 페이지 다운로드

import requests
from bs4 import BeautifulSoup
import re
import time
import os
import  urllib.request




mid = 'tongsil'   
folder_name = '실기'

############# 최대 페이지 알기

url = 'https://www.comcbt.com/xe/{}'.format(mid)  #URL 입력

headers = { 'Accept-Language' : 'ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7,zh-TW;q=0.6,zh;q=0.5',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36',
            'Accept-Encoding': 'gzip'
}


raw = requests.get(url=url, headers=headers)

html = BeautifulSoup(raw.text, 'html.parser')
page_num = html.find_all('a', {'class' : 'frst_last'}) #페이지네이션 긁어오기

for last in page_num :
    last = last.text  #max 페이지 알기

max_page = int(last) + 1 #+1 해두기



############# 폴더 생성

directory = 'C:/Users/user/raw/down/자격증/{}/'.format(folder_name) 
try:
    if not os.path.exists(directory):
        os.makedirs(directory)  #폴더 없으면 생성
except OSError:
    print("Error: Failed to create the directory.") 
 
    

############### 페이지 긁기    
    
for n in range(1, max_page) : #페이지 개수  #max_page
    url = 'https://www.comcbt.com/xe/index.php?mid={}&page='.format(mid) + str(n)  #URL 입력

    headers = { 'Accept-Language' : 'ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7,zh-TW;q=0.6,zh;q=0.5',
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36',
                'Accept-Encoding': 'gzip'
    }


    raw = requests.get(url=url, headers=headers)

    html = BeautifulSoup(raw.text, 'html.parser')

    results = html.find_all('a', {'class' : 'hx'})

    for url in results : #게시판 URL 들어가기
        url = url['href']
        headers = { 'Accept-Language' : 'ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7,zh-TW;q=0.6,zh;q=0.5',
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36',
                'Accept-Encoding': 'gzip'
        }

        raw = requests.get(url=url, headers=headers)

        html = BeautifulSoup(raw.text, 'html.parser')

        down_results = html.find('article')

        down_results_2 = down_results.find_all('a')

        ############# 웹페이지 링크 다운로드            
        for i in down_results_2 :
            try :
                title = i.text #제목 
                i = i['href'] #다운로드 링크
                #print(title)
                #print(i)
                #print(i)
                if not i.find("procFileDownload") == -1 :  #해당 문자를 포함할 경우(url기준)
                    print(i)
                    print(title)
                    try :
                        urllib.request.urlretrieve(i, str(directory)+str(title))   #png 아닌 jpg 파일로 저장
                        time.sleep(1) #1초
                    except :
                        pass
                else :
                    pass
            except :
                pass
    print(str(n) + "의 페이지 다운로드 완료되었습니다.")
    time.sleep(1) #1초
print("최종 완료")

#'utf-8' codec can't decode byte 0xc1 in position 16: invalid start byte 
#오류 발견시 encoding = 'cp949' 로 해주면 된다.
반응형

댓글