반응형
1. 대한민국 정책브리핑
정부에서는 매년 수많은 정책들을 발표하는데,
이를 국민들에게 널리 알리기 위해
각 부처마다 홈페이지 및 SNS채널을
운영하고 있습니다.
또한 이러한 정보들을
한곳에 모아둔 사이트가 바로
'대한민국 정책브리핑' 이라는 웹사이트입니다.
각 부처, 지방자치단체 등에서 발행하는
행정 자료들을 열람할 수 있으며,
최신화된 언론보도 또한 확인 할 수 있습니다.
대한민국 정책브리핑
문화체육관광부 국민소통실 운영, 정책뉴스, 정부 보도자료, 해명자료, 국정과제, 대한민국 정부 소개 등 제공
www.korea.kr
이러한 국가 정책정보포털로서
주요뉴스와 보도자료를 파이썬 크롤링 작업으로
좀더 쉽고 빠르게 보고 싶었습니다.
지난 게시글에서 네이버 뉴스 크롤링 연습을,
대한민국 정책브리핑 사이트에
적용하는 시간을 갖도록 하겠습니다.
제가 자주 열람하는 곳은
'브리핑룸'과 '사실은 이렇습니다.'
두 군데가 있습니다.
이번엔 크롤링할 브리핑룸은
실시간으로 나오는
기사들의 진위여부를 알 수 있고,
그 기사의 원초 자료가 되는 공간입니다.
내가 수집할 키워드에 대한
최근 1주일간의 보도자료를 수집하겠습니다.
2. 보도자료 크롤링 환경설정
📌 이전 글 확인하기
- 브리핑룸 보도자료 크롤링(스크래핑)에 관한 모듈을 가져오도록 하겠습니다.
➜ selenium, BeautifulSoup4, Pandas, datetime, math, time, warnings
#Part 1. 모듈 가져오기
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup
import pandas as pd
import datetime
import math
from time import sleep
import warnings
warnings.simplefilter(action='ignore', category=FutureWarning)
- warnings 모듈을 사용해 불필요한 경고표시를 없앴습니다.
➜ 모든 경고표시가 없어지므로 파일이 정상 작동 했을 때 넣어주시기 바랍니다.
3. 키워드 수집 및 설정
- 단계 설정
➜ 첫 번째 단계: 키워드
➜ 두 번째 단계: 저장 파일 - 수집은 최근 1주일 기사를 가져오므로
따로 수집 기사 건수 설정은 하지 않았습니다.
#Part 2. 키워드 수집 설정
Keyword = input('1. 수집 검색어는 무엇입니까?: ')
ft_name = input('2. 결과를 저장할 txt형식의 파일명을 쓰세요(예: 파일명.txt): ')
fx_name = input('3. 결과를 저장할 xlsx형식의 파일명을 쓰세요(예: 파일명.xlsx): ') # [c:\\py_temp\\파일명.xlsx] 절대경로 지정방법
4. 셀레니움 & BeautifulSoup4를 이용한 Chrome 제어
- 셀레니움
➜ 키워드를 검색하기 위해 사이트로 진입합니다.
▪︎ 순서1. 대한민국 정책브리핑 사이트
순서2. 뉴스
순서3. 브리핑룸
순서4. 보도자료(전체보기)
▪︎ 최근 1주 기간의 키워드를 검색합니다. - BeautifulSoup4
➜ 키워드가 검색된 페이지의
html 소스 코드를 받아옵니다.
#Part 3. 셀레니움 & BS4 크롬 제어
options = webdriver.ChromeOptions()
options.add_argument('start-maximized')
driver = webdriver.Chrome('/Users/kaz/Desktop/Project/chromedriver', options=options)
driver.implicitly_wait(5)
driver.get('https://www.korea.kr/news/pressReleaseList.do')
driver.find_element(By.ID, 'srchKeyword').click()
driver.find_element(By.ID, 'srchKeyword').send_keys(Keyword + Keys.ENTER)
sleep(1)
driver.find_element(By.XPATH, '//*[@id="period"]/option[2]').click() #최근 1주 검색
sleep(1)
driver.find_element(By.XPATH, '//*[@id="container"]/div/article/div[1]/div[2]/div[1]/button/span').click()
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
Result_Articles = int(soup.select_one('div.result > strong').text) #검색 결과 000건
ArticlePages = math.ceil(int(Result_Articles) / 20) # 브리핑룸은 20개 단위로 늘어남
PageNum = 1
print('=' *80)
print('3초 후에 시작합니다.')
sleep(3)
- math 모듈의 ceil함수를 이용합니다.
▪︎ 수집할 기사 건수로 자동으로
몇 페이지까지 수집할지 계산합니다.
▪︎ 계산된 페이지는 ArticlePages에 넣어줍니다.
5. 키워드 수집 데이터 추출
데이터 수집 기준
- 연번, 날짜, 부처, 기사 제목, 링크
➜ 이전 네이버뉴스 크롤링에서는
(연번, 기사 제목, 링크)세 가지만 가져왔지만,
이번엔 총 5 가지로 나누어 수집합니다.
수집된 데이터를 터미널에 print해주고,
텍스트파일에 저장하는 코드입니다.
#Part 4. 각 항목별 데이터를 수집하여 리스트에 저장
sn2 = [ ] #연번 저장
date2 = [ ] #날짜 저장
ogz2 = [ ] #부처 저장
title2 = [ ] #기사제목 저장
url2 = [ ] #링크 저장
no = 1
for a in range(1, ArticlePages + 1) :
html_2 = driver.page_source
soup_2 = BeautifulSoup(html_2, 'html.parser')
content_2 = soup_2.select('div.list-type > ul > li')
for b in content_2 :
try :
title = b.select_one('strong').text
except :
continue
else :
f = open(ft_name, 'a' , encoding="UTF-8")
print('1. 연번:',no)
sn2.append(no)
f.write('\n'+'1. 연번:' + str(no))
date = b.select_one('a > span > span.source > span:nth-child(1)').text
print('2.날짜:',date)
date2.append(date)
f.write('\n'+'2. 날짜:' + date)
ogz = b.select_one('span.source > span:nth-child(2)').text
print('3. 부처:',ogz)
ogz2.append(ogz)
f.write('\n' + '3. 부처:' + ogz)
print('4. 기사 제목:',title)
title2.append(title)
f.write('\n' + '4. 기사 제목:' + ogz)
korea = 'https://www.korea.kr'
url = korea + b.select_one('a').attrs['href']
print('5. 링크:' , url)
url2.append(url)
f.write('\n' + '5. 링크:' + url + '\n')
f.close( )
no += 1
print("\n")
if no > Result_Articles :
break
sleep(0.05) # 페이지 변경 전 1초 대기
a += 1
b = str(a)
try :
driver.find_element(By.LINK_TEXT ,'%s' %b).click()
except :
break
print('\n' + "요청된 데이터 수집이 완료되었습니다!" + '\n')
6. 수집된 데이터 엑셀 저장하기
Pandas, OpenPyXL 모듈을 이용하여
엑셀에 저장합니다.
#Part 5. 수집된 데이터 저장
df = pd.DataFrame({'연번': sn2, '날짜': date2 ,'부처': ogz2, '제목': title2, '링크': url2})
df.to_excel(fx_name,index=False, encoding="utf-8" , engine='openpyxl')

01

01
반응형
'Python > 크롤링(스크래핑)' 카테고리의 다른 글
| [Python] 네이버뉴스 크롤링 2 (셀레니움, BS4, pandas) (0) | 2022.12.03 |
|---|---|
| [Python] 네이버뉴스 크롤링 1 (셀레니움, BS4) (0) | 2022.11.02 |
| [Python] 파이썬 Selenium(셀레니움) 설치(for.Mac) (0) | 2022.10.14 |
| [Python] 파이썬 BeautifulSoup4 설치(for.Mac) (0) | 2022.10.14 |