💭

Yahoo!検索で企業名で検索した結果をGASでスクレイピングして、企業のWebサイトのURLを取得する

2023/06/27に公開

前回主にコスト面で惨敗した別部署のお手伝いについて、その後いろいろ調べてみた。

https://zenn.dev/agdm/articles/65e9f4d1cebef7

調べていくうちに、なんとYahoo!検索は検索クエリをそのまま叩いてもエラーにならないことが判明した。しかし帰ってくるのは当然ながらHTMLなので、これをGASスクレイピングできるようにするにはちょっと工夫が必要になる。

やり方はいろいろあるが、わたしはこういう時Cheerioというnpmパッケージを使う。GASで使えるようにライブラリ化されているものがあるので、詳しくはこちらを。

https://github.com/tani/cheeriogs

これを使って公開APIのないジョブカンをゴニョゴニョして労務と仕事をしたこともあった。セッションIDをうまいこと抽出できれば、ログインも突破できたりする。ただしこの場合はMFAをかけられないので、長めのパスワードを定期的に交換してあげる配慮は必要になる。

Cheerioの設定方法

GASのエディタのライブラリに以下のIDを追加してあげればOK。かんたん。
1ReeQ6WO8kKNxoaA_O0XEQ589cIrRvEBA9qcWpNqdOP17i47u6N9M5Xh0

Cheerioのつかいかた

使い方は超ざっくり、以下の通りだ。なお、個人的にはこれで毎回うまくいっているのだけど、この解釈には正直言って全く自信はない。もし親切にも正しいCheerioの使い方を教えてくれる人がいたら喜んで書き直します。

1. bodyの内容をCheerioに読み込ませる
2. 作用させたい繰り返し要素を指定する
3. 2で指定した繰り返し要素内の値を順繰りに抽出する

とりあえず、検索結果のbodyをCheerioに読み込ませよう。を変数名として使うのは、JQueryライクに使う名残りらしい。ここではいったん作法に則っておく。

const encodeWord = encodeURI(str);
const url = 'https://search.yahoo.co.jp/search?p='+encodeWord;
const res = UrlFetchApp.fetch(url).getContentText('UTF-8');
const $ = Cheerio.load(res);

次にYahoo!検索の検索結果のHTMLを確認するために、例によってトヨタ自動車株式会社で検索して、上でレスポンスをgetContentText()させた結果を表示させてみる。普通にログに出すと全部は表示されないので、Docsあたりに吐き出すのがオススメです。

ここから、お目当てのURL(https://global.toyota)を探してみると...

<li>
  <a href="https://global.toyota/" ping="(省略)" rel="noreferrer">
    <b>トヨタ自動車株式会社</b> 公式企業サイト
  </a>
  <div>
    企業情報、投資家情報、ニュースルーム、モビリティ、サステナビリティ、採用情報等、トヨタの企業情報全般を提供する<b>トヨタ自動車</b>の公式企業サイトです。
  </div>
  <em>https://global.toyota</em>
</li>

リストを表現するliタグとその中にあるaタグまでを繰り返し要素として指定する。最後に、そのaタグの中にあるURL文字列が取れればOKだ。先程のコードに続きを書くと以下のようになる。

function url(str){
  const encodeWord = encodeURI(str);
  const url = 'https://search.yahoo.co.jp/search?p='+encodeWord;
  const res = UrlFetchApp.fetch(url).getContentText('UTF-8');
  const $ = Cheerio.load(res);
  //URL文字列を入れておくための配列
  const arr = [];
  //繰り返し要素を指定して
  $('li a').each((i,elem) => {
    //繰り返し要素の中にあるhrefの値を取得する
    arr[i] = $(elem).attr('href');
  });
  //欲しいのは最初の検索結果のみ
  return arr[0];
}

これでURL文字列が取れた。やったね!

最後の最後に罠にハマる

これで技術的なところはクリアできたので、あとは元気よくオートフィルで取得するぞー!と意気込むも、なんかやっぱりポツポツとエラーが出る。特に気前よく1000件単位で実行すると肌感で4割程度はエラーとなる。

大量のリクエストを浴びせているのだからそれは仕方ない。なんなら、BANされない幸運に感謝すべき。心なしか、ヤフー株式会社様の方角に首を垂れつつ10000件以上の会社リストにURL文字列を揃えていった。

また、うっかりスプレッドシートを閉じてしまった時の悲劇も共有したい。もうなんとなくわかると思うが、開き直した瞬間に数千件の実行が再度走り始めてしまったのだった。シートは固まるし、エラーしか返ってこねえし、もう本当に最悪だった。この時は結局ふたたび最初から数百件程度ずつ、結果がシートに返ってきたらそれをコピーして文字列でセルに貼り直すということを地道にやった。オレはなんて無駄な時間を...。

Discussion