GAS로 스크래핑을 기본 동작 해 본다. 해설 첨부.

3118 단어 스크래핑gas
스프레드시트에 항목을 추가합니다.
왼쪽 상단에서 [파일], [편집], 라는 느낌으로 [스크립트 실행]이라는 항목이 나타납니다. onOpen 함수는 스프레드 시트를 열 때 실행되는 이벤트 처리기입니다.

코드.gs
function onOpen() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [
    {
      name : "タイトルを取得する",
      functionName : "update"
    }
  ];
  sheet.addMenu("スクリプト実行", entries);
}

그리고 기본적인 흐름이군요. 시트의 셀 정보를 2차원 배열에 저장합니다.
스프레드시트의 API 작업은 상당히 느립니다.
그러므로
①【셀 정보를 시트로 정리해 취득한다】
②【GAS측에서 정리해 배열 처리한다】
③【배열을 시트에 정리해 격납한다】
하고 있습니다.

코드.gs
function update(){
  var urls = [];
  var titles =[];

  var sheet = SpreadsheetApp.getActive().getSheetByName('シート1');
  var sheet_data = sheet.getDataRange().getValues();    // シート全体のデータを取得する。dataにはシートのデータが2次元配列で入る

  Logger.log("data.length:", sheet_data.length);

  urls = getUrls(sheet_data);
  sheet_data = getTitles(sheet_data, urls);
  setSheet(sheet_data, sheet);
}

배열에서 URL 데이터를 추출하는 곳입니다.

코드.gs
function getUrls(sheet_data){

  var urls = [];                                  // URL列のURLを格納する
  const urlColumnIndex = 0;                         // URL列を指定する
  Logger.log("sheet_data.length:" + sheet_data.length);

  for (var i = 0; i < sheet_data.length; i++) {
    urls.push(sheet_data[i][urlColumnIndex]);
    Logger.log("url:", urls[i]);
  }
  return urls;
}

여기가 이번 키모군요.
스크래핑합니다.
추출하려는 부분을 [beginning_tag]와 [ending_tag] 사이에 끼워 지도록 지정합니다. 아래의 예는 【호냐라라】를 꺼냅니다.

코드.gs
function getTitles(sheet_data, urls) {

  // <title> ほにゃらら</title>;

  var beginning_tag = "<title>";
  var beginning_index;

  var ending_tag = "</title>";
  var ending_index;

  var html;
  var url;
  var titles = [];
  const titleColumnIndex = 1;     // タイトル列を指定する

  for (var i = 0; i < urls.length; i++) {
    url = urls[i];

    if (i==0 && url == "URL"){
      titles[i] = "タイトル";
    }
    if (url !== "URL"){
      html = UrlFetchApp.fetch(url).getContentText('UTF-8');
      beginning_index = html.indexOf(beginning_tag);
      ending_index = html.indexOf(ending_tag);        
      if (beginning_index !== -1 && ending_index !== -1) {
        titles[i] = html.substring(beginning_index + beginning_tag.length, ending_index);
      }
    }
    Logger.log("title:", titles[i]);
  }

  for(i=0; i<titles.length; i++){
    sheet_data[i][titleColumnIndex] = titles[i];
  }

  return sheet_data;
}

마지막으로 시트에 스크래핑한 문자열을 저장하는 작업입니다.
여기도 시간을 줄이기 위해 배열을 함께 스프레드 시트에 저장합니다.
코드도 보기 쉬워지네요.

코드.gs
function setSheet(sheet_data,sheet){

  const LastRow = sheet.getDataRange().getLastRow();  
  const LastCol = sheet.getDataRange().getLastColumn();  

  sheet.getRange(1,1,LastRow,LastCol).setValues(sheet_data);
}

URL이 A열, 타이틀이 B열이군요.

좋은 웹페이지 즐겨찾기