본문 바로가기
Python

[Python] 크롤링으로 공공데이터 포털의 파일들 다운받기

by teamnova 2023. 7. 22.
728x90

 

 

 

 

실행결과입니다.

edge 실행화면입니다.

jupyter notebook 실행화면입니다.

 

 

 

전체 코드입니다.

#크롤링시 필요한 라이브러리 불러오기
from bs4 import BeautifulSoup
import requests
from tqdm import tqdm
from selenium import webdriver
from selenium.common import exceptions
from selenium.webdriver.common.alert import Alert
import time

driver = webdriver.Edge('C:\\Users\\qogml\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Python 3.11\\msedgedriver.exe')

# 크롤링할 url 생성하는 함수 만들기(검색어, 크롤링 시작 페이지, 크롤링 종료 페이지)
def makeUrl(start_pg, end_pg):
    if start_pg == end_pg:
        url = "https://www.data.go.kr/tcs/dss/selectDataSetList.do?dType=FILE&keyword="+keyword+"&detailKeyword=&publicDataPk=&recmSe=N&detailText=&relatedKeyword=&commaNotInData=&commaAndData=&commaOrData=&must_not=&tabId=&dataSetCoreTf=&coreDataNm=&sort=_score&relRadio=&orgFullName=&orgFilter=&org=&orgSearch=&currentPage=" + str(start_page) + "&perPage=10&brm=&instt=&svcType=&kwrdArray=&extsn=&coreDataNmArray=&pblonsipScopeCode=";
        return url
    else:
        urls = []
        for i in range(start_pg, end_pg + 1):
            page = i
            url = "https://www.data.go.kr/tcs/dss/selectDataSetList.do?dType=FILE&keyword="+keyword+"&detailKeyword=&publicDataPk=&recmSe=N&detailText=&relatedKeyword=&commaNotInData=&commaAndData=&commaOrData=&must_not=&tabId=&dataSetCoreTf=&coreDataNm=&sort=_score&relRadio=&orgFullName=&orgFilter=&org=&orgSearch=&currentPage=" + str(page) + "&perPage=10&brm=&instt=&svcType=&kwrdArray=&extsn=&coreDataNmArray=&pblonsipScopeCode="
            urls.append(url)
#         print("생성url: ", urls)
        return urls    

# html에서 원하는 속성 추출하는 함수 만들기 (기사, 추출하려는 속성값)
def news_attrs_crawler(articles,attrs):
    attrs_content=[]
    for i in articles:
        attrs_content.append(i.attrs[attrs])
    return attrs_content

#html생성해서 기사크롤링하는 함수 만들기(url): 링크를 반환
def articles_crawler(url):
    #html 불러오기
    original_html = requests.get(i,headers=headers)
    html = BeautifulSoup(original_html.text, "html.parser")

#     url_naver = html.select("div.group_news > ul.list_news > li div.news_area > div.news_info > div.info_group > a.info")
    url_portal = html.select("div.result-list dl > dt > a")
    url = news_attrs_crawler(url_portal,'href')
    return url




# ConnectionError방지
#headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/98.0.4758.102"}
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Edg/114.0.1823.51"}


keyword = input("\n크롤링할 키워드를 입력해주세요.")
#검색 시작할 페이지 입력
page = int(input("\n크롤링할 시작 페이지를 입력해주세요. ex)1(숫자만입력):")) # ex)1 =1페이지,2=2페이지...
print("\n크롤링할 시작 페이지: ",page,"페이지")   
#검색 종료할 페이지 입력
page2 = int(input("\n크롤링할 종료 페이지를 입력해주세요. ex)1(숫자만입력):")) # ex)1 =1페이지,2=2페이지...
print("\n크롤링할 종료 페이지: ",page2,"페이지")   

news_url =[]


#####크롤링 시작#####

# 각 page url 생성.
url = makeUrl(page,page2)

# 각 페이지의 데이터 페이지 url 모으기
for i in url:
    for j in articles_crawler(url):
        news_url.append(j)


# url 최종 형태 만들기. (/data/15069941/fileData.do 형태에서 앞에 https~ 붙이기.)
final_urls = []
for i in tqdm(range(len(news_url))):
    if "data" in news_url[i]:
        final_urls.append("https://www.data.go.kr/" + news_url[i])
    else:
        pass


# url마다 파일 다운로드하기.
for i in tqdm(final_urls):

    # url 접속
    try:
        driver.get(i)
    # alert 창이 뜨면 예외발생. 
    except exceptions.UnexpectedAlertPresentException as e :
        da = Alert(driver)
        driver.get(i)
        time.sleep(5)
    
    
    # 다운로드 버튼이 없으면 넘어가기
    try : 
        title_content = driver.find_element_by_xpath("//a[@class='button just-mb']")
        title_content.click()
        print('버튼 클릭')
        continue
    except exceptions.NoSuchElementException as e : 
        print(i)
        
    try : 
        title_content = driver.find_element_by_xpath("//a[@class='button mb-3 just-mb']")
        title_content.click()
        print('버튼 클릭')
    except exceptions.NoSuchElementException as e : 
        print('버튼 없음.')
        print(i)