반응형

2021.10.04 - [Python/Web Crawling] - 파이썬으로 여러 페이지에 있는 정부 보도자료 크롤링하기_페이지네이션

우리나라의 사회/산업/경제 전반적인 상황을 보기위해 신문도 참고할 자료 중 하나이긴 하지만,

 

각 정부 부처에서 제공하는 보도자료가 사실에 근접해서 보기에 훨씬 유용한 자료라 생각한다.

 

하지만, 매번 정부의 모든 부처들에 방문해 보도자료를 찾아보기는 번거롭다.

 

이를 해결하기 위해서 정부 부처 보도자료의 제목들을 가져오는 크롤링 프로그램을 한번 생각해봤다.

 

  1. 각 정부 부처의 보도자료 관련 주소를 리스트를 만들고,
  2. 주소 리스트의 순서대로 보도자료의 제목들을 찾아 내가 원하는 제목리스트에 저장한다.

사실 실제로 사용하기 위해서는 위 과정보다 더 나아가야 하지만, 내가 원하는 보도자료 제목리스트를 만들기만 해도 유용하게 사용할 수 있으리라 생각한다.

(초보자라 모든 의견은 감사히 받습니다.)

 

우선, python에서 크롤링에 많이 사용하는 BeautifulSoup을 import한다.

import urllib.request
from bs4 import BeautifulSoup

 

그 다음 우리가 찾고 싶은 부처의 홈페이지에 방문한다. 

(여기서는 기획재정부랑 산업통상자원부를 활용할 예정이다.)

 

방문해서 F12를 눌러서 우리가 원하는 보도자료 제목이 어디에 저장되어 있는지 찾아보자.

 

 

기획재정부 보도자료 홈페이지

 

 

 

산업통상자원부 보도자료 홈페이지

 

 

기획재정부 보도자료 제목은 h3 밑의 a에 저장되어있고, 산업부 제목은 div의 "ellipsis"란 클래스 밑에 a에 저장되어 있음을 확인할 수 있다.

 

이걸 확인하고, 각 선택자(selector)를 마우스 우클릭해서 Copy > Copy Selector 로 복사하자.

 

각 홈페이지로 이동해서 주소(url)을 복사해 url_list에 요소로 만들고, 복사한 셀렉터들을 slect_list에 추가해 준다.

 

그리고 우리가 저장하고 싶은 보도자료 제목들을 넣어둘 titles 리스트도 만들어주자.

 

def main():

    titles = []	
    url_list = ["http://www.moef.go.kr/nw/nes/nesdta.do?bbsId=MOSFBBS_000000000028&menuNo=4010100",
                "http://www.motie.go.kr/motie/ne/presse/press2/bbs/bbsList.do?bbs_cd_n=81", 
                ]   
    slect_list = ["h3 > a",
                  'td.al > div > a']

 

복사한 셀렉터를 slect_list에 추가해주는데, 실제 복사 붙여넣기를 하면 위의 코드보다는 길게 입력이 된다. 이는 각 타이틀의 셀렉터를 특정해주기 때문에 그 경로가 세부적으로 추가되는 것이다.

 

(만약 복사한 그대로 쓰게 된다면 1페이지의 맨 위 혹은 특정 위치에 있는 제목만 긁어오게 된다.)

 

하지만, 우리는 페이지에 있는 특정 위치 뿐만 아니라 모든 보도자료 제목을 긁어오고 싶기 때문에 특정 경로의 셀렉터를 선택하는 게 아니라 위에 리스트처럼 만들어서 사용하기로 한다.

 

    for i in range(len(url_list)):                      #url_list 리스트 모든 요소 내에서
        url = url_list[i]                               #url_list 중 i번째를 url에 저장한다. 
        sourcecode = urllib.request.urlopen(url).read() 
        soup = BeautifulSoup(sourcecode, "html.parser")
        
        #저장된 url을 BeautifulSoup에 따라 html 구조를 분석. 사실 위에 2줄은 그냥 암기해도 됨
        
        selector = slect_list[i]                        #slect_list 중 i번째를 selector에 저장

        for j in soup.select(selector):
            titles.append(j.text)                       
            
        #저장된 selector를 찾아서 text를 추출한다음 titles 리스트에 첨가(append)한다

    print(titles)
    #titles에 잘 들어갔는지 확인한다.

#로 설명된 구문을 실제 print를 해보면 아래와 같이 나온다.

 

 


['마스크 등 시장교란행위 방지 추진상황 점검회의(2.21)', "구윤철 차관 '정부 출자기관 간담회' 개최", '세계은행(WB) 한국혁신주간 행사를 통해 한국의 개발 경험 및 최근 주요 정책 등을 공유', '홍남기 부총리, 한러 수교 30주년 제1차 준비위원회 개최', '김용범 기획재정부 제1차관 등 정부대표단, 세계은행(WB) 한국혁신주간 행사 참석을 위해 출국', '홍남기 부총리, 출장계획 변경 및 G20 재무장관회의 참석', '코로나19 관련 긴급 항공 운송물품 관세 인하 지원', '재정혁신 TF 출범회의 겸 제1차 지출구조개혁단 회의', '[보도참고] 2019년말 대외채무 동향 및 평가', '[보도참고]2019년 4/4분기 가계동향조사(소득부문) 결과', '\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(참고자료)제8차 한-일 수출관리정책대화 3...\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n', '\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(설명자료)한전공대 학생들에 대한 장학금은 ...\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n', '\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t무역금융 3.1조원 추가 지원 등 코로나19...\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n', '\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t무역위원회, 「천연가스 압축기 특허권 침해」...\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n', '\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t신학기용품, 아동용 봄철 의류 등 36개 제...\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n', '\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t산업기술 R&D 시스템, 대대적 혁신...\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n', '\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t「제5차 집단에너지 공급 기본계획(안)」공청...\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n', '\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(설명자료)두중은 최근 수년간 세계 석탄화력...\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n', '\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(설명자료)정부는 제9차 전력수급기본계획을 ...\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n', '\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(설명자료)전기차 충전요금 할인특례 개편은 ...\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n']

 


기획재정부 쪽은 제목만 잘 추출되는 것을 확인할 수 있는데, 산업부에서 보도자료 제목에 탭(\t)이나 엔터(\n)가 있는 것을 확인할 수 있다. 

 

이것을 깔끔하게 해결해주기 위해서 strip()함수를 넣어주자. 

 

j.text -> j.text.strip()

    for i in range(len(url_list)):
        url = url_list[i]
        sourcecode = urllib.request.urlopen(url).read()
        soup = BeautifulSoup(sourcecode, "html.parser")
        
        selector = slect_list[i]

        for j in soup.select(selector):
            titles.append(j.text.strip())

    print(titles)

 

이에 대한 프린트 결과는 아래와 같이 깔끔하게 잘 나온 것을 확인할 수 있다.


['마스크 등 시장교란행위 방지 추진상황 점검회의(2.21)', "구윤철 차관 '정부 출자기관 간담회' 개최", '세계은행(WB) 한국혁신주간 행사를 통해 한국의 개발 경험 및 최근 주요 정책 등을 공유', '홍남기 부총리, 한러 수교 30주년 제1차 준비위원회 개최', '김용범 기획재정부 제1차관 등 정부대표단, 세계은행(WB) 한국혁신주간 행사 참석을 위해 출국', '홍남기 부총리, 출장계획 변경 및 G20 재무장관회의 참석', '코로나19 관련 긴급 항공 운송물품 관세 인하 지원', '재정혁신 TF 출범회의 겸 제1차 지출구조개혁단 회의', '[보도참고] 2019년말 대외채무 동향 및 평가', '[보도참고]2019년 4/4분기 가계동향조사(소득부문) 결과', '(참고자료)제8차 한-일 수출관리정책대화 3...', '(설명자료)한전공대 학생들에 대한 장학금은 ...', '무역금융 3.1조원 추가 지원 등 코로나19...', '무역위원회, 「천연가스 압축기 특허권 침해」...', '신학기용품, 아동용 봄철 의류 등 36개 제...', '산업기술 R&D 시스템, 대대적 혁신...', '「제5차 집단에너지 공급 기본계획(안)」공청...', '(설명자료)두중은 최근 수년간 세계 석탄화력...', '(설명자료)정부는 제9차 전력수급기본계획을 ...', '(설명자료)전기차 충전요금 할인특례 개편은 ...']


이런 식으로 환경부, 교육부, 과학기술정보통신부 등 다양한 정부 부처의 보도자료 제목들을 크롤링해올 수 있다.

 

그리고 이번에는 리스트로 저장만 해뒀지만, 이것을 텍스트나 엑셀 등을 활용해 더 유용하게 사용할 수도 있을 것이다.

 

또 크롤링을 할 때 항상 유의해야 할 것은 이것을 긁어올 때, 저작권이나 어떤 문제가 발생할지에 대해 항상 생각하자.

(나같은 경우 이번에 그런 것들을 피하기 위해서 일부러 정부 부처의 보도자료를 선정한 것도 있다.)

 


참고하면 좋을 글:

 

2021.10.04 - [Python/Web Crawling] - 파이썬으로 여러 페이지에 있는 정부 보도자료 크롤링하기_페이지네이션

반응형