python

[혼자하는 파이썬] 중기부 보도자료 파일 다운로드 크롤링

알세지 2024. 3. 7. 12:21

혼자한다.

아니다. 지피티와 함께 한다.


중기부 홈페이지에 있는 '보도자료' 게시판에서 첨부문서인 보도자료를 다운 받는 파이썬 코드

아래 이미지 첨부를 참고하면 된다. 

한 페이지만 크롤링 가능하다.

 

파일을 모아놓을 별도의 폴더를 생성하게 했고,

폴더명은 코드 실행시간을 넣었다.

목록은 CSV 파일로 저장하게 했다.

 

 

[20240329] 일부 수정

보도자료 파일명에 특수한 문자가 포함될 때 생기는 오류를 점검해 코드를 업데이트 했다.

 

아래는 코드 전문

 

import os
import requests
from bs4 import BeautifulSoup
import csv
from datetime import datetime

def create_download_folder():
    now = datetime.now()
    folder_name = now.strftime("%Y%m%d") + "_mss_press_list"
    folder_path = os.path.join("C:/down_p", folder_name)
    if not os.path.exists(folder_path):
        os.makedirs(folder_path)
        print(f"'{folder_path}' 폴더가 생성되었습니다.")
    else:
        print(f"'{folder_path}' 폴더가 이미 존재합니다.")
    return folder_path

def sanitize_filename(filename):
    invalid_chars = '<>:"/\\|?*\n'
    for char in invalid_chars:
        filename = filename.replace(char, '')
    return filename

def download_press_releases(download_dir):
    url = "https://www.mss.go.kr/site/smba/ex/bbs/List.do?cbIdx=86"
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'html.parser')

    title_elements = soup.find_all('td', class_='subject bss-sub-text')
    file_link_elements = soup.find_all('td', class_='attached-files')
    date_elements = soup.find_all(lambda tag: tag.name == 'td' and tag.text.strip().startswith('2024'))

    press_release_details = []

    for title_element, file_link_element, date_element in zip(title_elements, file_link_elements, date_elements):
        press_release_title = title_element.find('a').text.strip()
        file_link = "https://www.mss.go.kr" + file_link_element.find('a')['href']
        date = date_element.text.strip().replace(".", "-")
        file_name = sanitize_filename(f"{date}_{press_release_title}.pdf")
        file_path = os.path.join(download_dir, file_name)
        
        with open(file_path, 'wb') as f:
            f.write(requests.get(file_link).content)
        
        press_release_details.append([date, file_name, file_link])
        print("Press release title (Korean):", press_release_title)
        print("Date:", date)
        print("File downloaded and saved as:", file_path)

    return press_release_details

def write_details_to_csv(download_dir, press_release_details):
    csv_file_path = os.path.join(download_dir, 'press_list_csv.csv')
    with open(csv_file_path, 'w', newline='', encoding='utf-8') as csvfile:
        writer = csv.writer(csvfile)
        writer.writerow(['Date', 'File Name', 'Link Address'])
        writer.writerows(press_release_details)
    print(f"Press list saved as: {csv_file_path}")

download_dir = create_download_folder()
press_release_details = download_press_releases(download_dir)
write_details_to_csv(download_dir, press_release_details)