Status
Done
Summary
Due
Project
Tags
Hacker
갱
참여단체
URL
활용 업무분야: 홍보, 실적측정 작성자: kyungsuk cho 작업 상태: 완료 참여단체: 한국여성의전화 플랫폼: 구글 앱스크립트
👩💻아래 내용에 질문이 있거나 오류가 생기면 슬랙 or 이메일로 알려주세요. 조경숙(갱) kninami@gmail.com
개요
- 네이버 뉴스 사이트에서 조회하고 싶은 특정 기간동안 특정 키워드가 포함된 뉴스 목록을 엑셀 데이터로 자동 수집할 수 있습니다.
준비물
- 구글 드라이브 엑셀
적용하기
- 구글 드라이브에서 Excel 파일을 하나 새로 연다.
- 결과를 저장할 Excel Sheet 이름을 Result 라고 변경한다(혹은 원하는대로 변경 후 아래 코드에서 sheet_name 의 값을 수정해준다).
- 확장 프로그램 > Apps Script 를 클릭한다.
- 좌측 메뉴에서 ‘라이브러리’ 행 옆의 ‘+’ 버튼을 클릭한다.
- ‘라이브러리 추가’ 팝업이 뜨면, 아래 스크립트 ID를 복사한 후 ‘조회’를 누르고, 하단의 ‘추가’ 버튼을 클릭한다 (Cheerio, 버전 14)
- 스크립트 ID
1ReeQ6WO8kKNxoaA_O0XEQ589cIrRvEBA9qcWpNqdOP17i47u6N9M5Xh0
- 기존 코드는 삭제하고, 아래 코드를 복사+붙여넣기한다. 검색하고자 하는 조건들에 맞게 변수를 수정한다(볼드 처리한 부분의 값을 수정)
const sheet_name = "시트1" //결과를 저장할 엑셀 Sheet 이름을 넣어주세요. 예) 시트1
const keyword_array = ['한국여성의전화','가정폭력'] //검색할 키워드를 넣어주세요
const q = keyword_array.join("+|+") //검색어가 둘 다 있어야 하면 "+"로, 둘 중 하나라도 있어도 된다면 "+|+" 로 입력해주세요
const start_date = '2023.01.01' //검색할 기간 (시작날짜)
const end_date = '2023.01.31' //검색할 기간 (종료날짜)
function main(){
const base_url = "https://m.search.naver.com/search.naver";
const params = {
'where': 'm_news',
'query': q,
'sort': 2,
'pd': 3,
'ds': start_date,
'de': end_date
}
let query_string = convertToQueryString(params);
do {
let url = base_url + query_string;
query_string = scraper(url);
} while ( typeof(query_string) !== "undefined" ) //다음 페이지가 없을 때까지 계속 실행
}
function convertToQueryString(params) {
var queryString = "?";
for (var key in params) {
queryString += key + "=" + encodeURIComponent(params[key]) + "&";
}
return queryString.substring(0, queryString.length - 1);
}
function getContent_(url) {
return UrlFetchApp.fetch(url).getContentText()
}
function setSheetData(sheet, data){
var row = sheet.getLastRow() + 1;
const num_rows = 1;
const col = 1;
const num_cols = 4;
for (var datum of data) {
var input = [];
input.push(datum);
sheet.getRange(row, col, num_rows, num_cols).setValues(input);
row++;
}
}
function scraper(url){
let html = UrlFetchApp.fetch(url).getContentText();
let $ = Cheerio.load(html);
let news_array = $('.news_wrap').toArray();
let list_array = []
news_array.forEach((news) => {
let title = $(news).find('.api_txt_lines.tit').text();
let press = $(news).find('.info_group > a.press').text();
let link = $(news).find('a.news_tit').attr("href");
let date = $(news).find('div.info_group > span.info:first').text();
list_array.push([date, title, press, link]);
})
//insert into sheet
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheet_name);
setSheetData(sheet,list_array);
let next_link = $('div.list_page > a.now').nextAll('a.pgn').first().attr("href");
return next_link;
}
- ctrl+s 를 눌러 코드를 저장한 후, 아래와 같이 실행함수를 main() 으로 지정해준다.
- 실행 버튼을 누른다(처음 실행할 때에는 아래와 같이 ‘권한 검토’ alert이 뜨는데, 당황하지 말고 모두 ‘승인’ 또는 ‘확인’을 클릭한다.)
- 다시 엑셀파일로 가보면 데이터가 잘 들어와있는 것을 확인할 수 있다.