無趣味の戯言

三日坊主なので頑張らないように頑張ります

【GAS】ちゃんとしてないECサイトから商品リストを抜き出してみた

お仕事で活用してみた


ASCII Art by: AA変換(アスキーアート生成)|Web便利ツール@ツールタロウ

こんばんは。だいちゃん@最近やっと仕事してる です。

とある怪しい海外ベンチャーの話に乗っかってからというもの色々なんか色々だったのですがまぁそれはさておき、数年更新していないECサイトを作り直すお仕事を絶賛作業中です。

その中で今回ぼく史上初のスクレイピングってやつをやってみたので備忘録も兼ねてメモっておきます。

スクレイピング(クローリング)とは

パソコンちゃんが勝手にサイトを見てきて指示された情報を収集してくれるやつ。

...正確にはそれは「クローリング」って言葉が適切なのかもしれない。スクレイピングはHTMLから情報を抽出することを指すらしい。

今回みたいに、約200件の商品情報をひとつひとつ開いてコピペしてたら大変面倒くさいので、その作業を自動で(しかも早く)済ませてくれるクローリング。パソコン、というか道具は人間がラクするために存在してるんだもんね。

ちなみに、同様のワザのひとつにImportxml関数で情報収集する方法もあって、試してみたんだけどうまくいかず...。XMLファイルを解析出来ない云々言われたので解析出来なかったんだと思います(素直)。

まずその対象のサイト自体がidがあまり振られていない設計だったのでXPathが書きにくかったんです(言い訳)。

そもそもWebに公開してる商品のリストを「自力でまとめてねテヘペロ」ってなっちゃう感じのところですからね...。

実践編 〜HTMLが読めればどうにかなる〜

全然Javascriptが書けるわけでもないし、全然イケメンでもないけど、コピペとちょっとの改変だけでやりたいことは達成できたので簡単だしおすすめです。

ただ、対象のサイトが「http://example.com/xxx/+規則的なIDとか」みたいな作りになってないと難しいかも。今回のスクリプトでは、URLの後ろにスプレッドシートA列に書かれた文字を単純に繋ぎ合わせたURLからしかデータを拾って来れないので...。

でも意外とよく見てみると、色んなサイトの検索結果ページとかもURLの後ろにキーワードくっつけてるだけだったりするから思ったより使える。

必要なのは義務教育レベルの日本語力と楽したい気持ちとGoogleアカウントだけ。

Googleスプレッドシートを開いて「ツール」から「スプリクトエディタ」をクリックして出てきた画面に下記のスクリプトをコピペ。

function onOpen() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('スクレイピング')
    .addItem('実行', 'myFunction')
    .addToUi();
};

function myFunction () {
  var book = SpreadsheetApp.getActiveSpreadsheet();
  var sheetData = book.getSheetByName("シート1");

  var rowEndData = sheetData.getDataRange().getLastRow()

  for (var i = 2; i <= rowEndData; i += 1) {
      var url = 'http://☆★☆検索したいサイトのURL☆★☆' + sheetData.getRange(i, 1).getValue();
      sheetData.getRange(i, 2).setValue(url);
      var response = UrlFetchApp.fetch(url);
      var html = response.getContentText('UTF-8');

/* 抽出ブロックここから */
      var searchTag = '☆★☆抽出直前ワード1☆★☆';
      var index = html.indexOf(searchTag)
      if (index !== -1) {
        var htmlans = html.substring(index + searchTag.length);
        var index = htmlans.indexOf('☆★☆抽出直後ワード1☆★☆');
        if (index !== -1) {
          sheetData.getRange(i, 3).setValue(htmlans.substring(0, index));
        }
      }
 /* ▲抽出ブロックここまで▲ */
 
 
 /* 抽出ブロックここから */
      var searchTag = '☆★☆抽出直前ワード2☆★☆';
      var index = html.indexOf(searchTag)
      if (index !== -1) {
        var htmlans = html.substring(index + searchTag.length);
        var index = htmlans.indexOf('☆★☆抽出直後ワード2☆★☆');
        if (index !== -1) {
          sheetData.getRange(i, 4).setValue(htmlans.substring(0, index));
        }
      }
 /* ▲抽出ブロックここまで▲ */


  }
}

軽く解説

  • スクリプト中の「☆★☆検索したいサイトのURL☆★☆」+スプレッドシートのA列に書かれた文字 が商品の個別URLになるように、URLを書き換えます。

  • サイト中から抽出したい部分の直前にある、キーワードとなるタグを探し出して「☆★☆抽出直前ワード1☆★☆」に書き換えます。

  • このキーワード探しが肝で、どのページでも同じキーワードじゃないとダメ(商品ごとに変わる商品ページへのリンクとかだとダメ)だし、ページの中でここにしか無いキーワードじゃないと失敗する可能性があるので難しいところ...。idとか振られてるタグがあればそれを使うと良いかも。

  • 「☆★☆抽出直後ワード1☆★☆」も同様に、抽出したい部分の終わり付近にある一意のキーワードを見つけ出して書き換え。

  • 抽出したい部分がもっとあるなら「抽出ブロックここから」〜「抽出ブロックここまで」をコピペで増やして、抽出ブロック内の下から3行目あたりにある「sheetData.getRange(i,数字).setValue〜」の数字の部分を1つずつ増やしていけばおk

  • 全部仕上がったら、ちゃんと保存して、スプレッドシートごと一旦閉じて開けばメニューバーのとこに「スクレイピング」ってメニューが増えてるはず。その中の実行を押せば始まる。

この楽しさはわかる人にしかわからないみたい

結局、息をするように彼女を作れる人は女の子とデートの約束出来ただけで心踊る気持ちが薄れているように、息をするようにJSと戯れられる人はこれくらいササッと書いちゃって次の仕事に取り掛かるんだろうなぁって。

でもまぁこういうことの積み重ねで今話題の生産性ってやつをあげて早く帰れるようになろうな!

P.S.

参考にして(というかほぼコピって)使わせていただきました。

qiita.com

GASの過去記事はこんなのがあるよ

udcsk.hateblo.jp