コードを書かずに大量のWebサイトから内容を抽出する

業務・趣味問わず発生する「Webページから値を拾ってきてExcelシートにコピペする」という仕事をなんとか省力化出来ないかを検討してみる。 自分は怠惰なので出来るのであればコードも書きたくない。

前提条件

  • 1つのECサイトの商品ページURLが50程度与えられる
  • それぞれの価格情報を取得してExcel等に出力する

Google Spreadsheet

よくネット記事でも紹介されている IMPORTXML 関数を利用する方法。 この関数は引数にURLと、抽出する対象の位置情報を指定する。

例えば以下のように入力すると、洗濯機のページから商品名を抽出できる。

=IMPORTXML("https://kakaku.com/item/K0001373907/","//*[@id=""titleBox""]/div[1]/h2")

web scraping without programming 2022 10 31 22 31 23

位置情報XPathという文字列を使う。 これはChromeのDeveloper Toolsを利用することで簡単に調査が可能。

まず、Chromeでサイトを開き、調べたい文字あたりを右クリックして「検証」をクリック。

web scraping without programming 2022 10 31 22 33 35

新しく開いたウインドウで青くハイライトされた箇所を右クリックし、「Copy」→「Copy XPath」をクリック。

web scraping without programming 2022 10 31 22 34 40

" が含まれたりするXPathをSpreadsheetに貼り付けるのは少し面倒だ。 今回は //*[@id="titleBox"]/div[1]/h2 がコピーされた。 セルに入力するときは最初に ' 文字を入れた '//*[@id="titleBox"]/div[1]/h2 と入力する必要がある。 また、関数の引数として渡すときには、以下のように " の部分を "" と書き換える必要がある。

=IMPORTXML("https://kakaku.com/item/K0001373907/","//*[@id=""titleBox""]/div[1]/h2")

"あいうえお" のように " で囲まれた箇所が文字列として認識されるけど、その中に " があったらどこが終わりか分からなくなるので、終わりじゃなくて文字の " ですよと言いたいときは "" と続けて2回タイプする必要がある。

これを応用すれば複数のページから色んな情報もすぐに取れそうだ。早速試してみよう。

web scraping without programming 2022 10 31 22 40 54

見事に日本語タイトルが文字化けしているし、4行目の商品は若干ページの構成が違って取得が出来なかった。 IMPORTXMLで日本語を取得したい場合は、文字コードが UTF-8 のサイトで有る必要がある。 まだ国内のECサイトの多くは Shift-JIS なので、対応しておらず文字化けしてしまった。 これを修正するためにはプログラミングが必要になる。

値段が変わったときにデータの再取得を行いたいときはどうすればよいか。 便利な更新ボタンはなく、関連するセルの値が変わった時にだけ再取得が行われる。 なので、URLを全部消してから Ctrl+Z で戻せばデータの再取得が行われる。

メリット

  • Googleアカウントさえあれば他に何も要らない
  • ある程度高速に実行される

デメリット

  • サイトのデザインや構成が変わると取得できなくなる
  • 日本語ページは文字化けが発生するケースも多々ある
  • 再取得させるのは少し手間
  • SPA(Twitter Webのようなリッチな作りのやつ)など凝ったサイトでは動作しない
  • 編集履歴機能にウェブページから取り込んだ内容は記録されない

Microsoft Power Automate Desktop

Windows上のいろんなソフトを自動操作してデータを取り出したりぶっこんだりするツール。 コードは書かないけど、少しプログラミング。

インストールするにはWindows 10以上が必要。 Microsoft Storeアプリで「Power Automate」と調べるとインストールできる。 途中でChromeの拡張機能も自動でインストールされるので許可しておく。

インストールが完了するとこんな感じの画面になるので、新しいフローをクリック。 自動化する手順の一連の流れを「フロー」として定義する。

web scraping without programming 2022 10 31 22 58 00

左側のアクションには色々並んでいる。 その中で選んだものをマウスでドラッグアンドドロップで真ん中に持ってくることによって使えるようになる。

web scraping without programming 2022 10 31 22 57 17

今回は↑の画像でやっているような、Chromeを起動して洗濯機のページにアクセスして、内容を拾ってきてメッセージを表示するというフローを作ってみる。

お試し作成

まぁまぁ手間がかかるので、まずは単純な例から。

アクションの一覧から「ブラウザ自動化」→「新しいChromeを起動」をドラッグアンドドロップで真ん中に持ってくる。

web scraping without programming 2022 10 31 23 05 47

「初期URL」を入れないと怒られるので、適当に https://google.com/ と入れておく。 次に「ブラウザ自動化」→「Webページに移動」を追加する。 URLには洗濯機のページURL https://kakaku.com/item/K0001373907/ を入れておく。

そして次に実際にページから値を抽出する。 「ブラウザ自動化」→「Webデータ抽出」→「Webページからデータを抽出する」を追加する。

web scraping without programming 2022 10 31 23 09 59

そしてこの画面を表示させたらChromeで https://kakaku.com/item/K0001373907/ にアクセスする。 そうすると、こんな画面が出てくるので、目的の値段の部分を「右クリック」して「要素の値を抽出」→「テキスト: ('¥191,000')」をクリック。

web scraping without programming 2022 10 31 23 11 27

そうすると、こんな感じ抽出プレビューに値段が出てくる。 これを確認して「終了ボタン」をクリック。

web scraping without programming 2022 10 31 23 12 51

元の画面に戻ってきたら「生成された変数」を適当に何回かクリックして %kakaku% と入力。 そして保存をクリック。 さっき抽出した ¥191,000 という値は %kakaku% という変数(箱)にぶっこまれる。

web scraping without programming 2022 10 31 23 13 50

次にさっき保存した %kakaku% を表示してみよう。 「メッセージ ボックス」→「メッセージを表示」アクションを追加する。 「表示するメッセージ」に 価格は %kakaku% でした! と入力する。 そして保存。 ちなみに、使える変数は入力欄右側の {x} のアイコンをクリックすると出てくるので、ミスが怖い場合はこれを使うと良い。

web scraping without programming 2022 10 31 23 15 45

そして最後は「ブラウザ自動化」→「Webブラウザーを閉じる」アクションを追加。 特に何もせずに保存。

web scraping without programming 2022 10 31 23 17 49

完成したので上の再生ボタンをクリックして実行。

web scraping without programming 2022 10 31 23 18 33

ブラウザが勝手に開いてガチャガチャやって最終的に値段が出てきたら成功。

web scraping without programming 2022 10 31 23 19 06

1つのURLにアクセスして1つの値だけ持ってくるフローが完成した。 次はこれを複数項目使える形に変形していく。

複数のウェブページをループさせる

こんな感じのテキストファイルをメモ帳で作ってみる。

web scraping without programming 2022 11 01 00 07 21

https://kakaku.com/item/K0001373907/
https://kakaku.com/item/K0001378682/
https://kakaku.com/item/J0000036676/
https://kakaku.com/item/K0001110328/
https://kakaku.com/item/K0001388197/

そして作ったファイルを読み取るために、「ファイルからテキストを読み取る」アクションを先頭に追加してみる。 ファイルパスでさっき保存したファイルを選択し、「内容の保存方法」を「リスト」に変更し、「生成された変数」は %UrlList% としておく。リストに指定することによって、ファイルの一行毎にバラされた文字として扱われる。

web scraping without programming 2022 11 01 00 09 43

そして次に「ループ」→「For each」を選択。 これでさっき作った %UrlList% を指定する。 保存先は何でも良いけど %url% としておく。

web scraping without programming 2022 11 01 00 12 53

そしてループがどう動いているかを確かめるために、「メッセージ ボックス」→「メッセージを表示」アクションを追加する。 「表示するメッセージ」は 今のURL: %url% としておく。

ここまでやると、こんな感じになる。

web scraping without programming 2022 11 01 00 13 47

実行ボタンを押してみると、こんな感じでメッセージボックスが5回表示される。

web scraping without programming 2022 11 01 00 14 20

このメッセージボックスを出す代わりに「Webページに移動」「Webページからデータを抽出する」を実行すれば良くね?ということでやってみる。

以下のような形になる。 ループさせたい処理をドラッグアンドドロップで移動させる。 「Webページに移動」をダブルクリックしてURLを https://kakaku.com/item/K0001373907/ から、ループ変数の %url% に書き換える。

web scraping without programming 2022 11 01 00 16 12

そして再生ボタンを押してみると、値段が書かれたメッセージボックスが5回出る。 いい感じじゃん。

web scraping without programming 2022 11 01 00 18 07

結果をファイルに出力する

メッセージボックスに出ているだけだと、使い勝手が悪い。 代わりにファイルに書き出してみよう。

いくつかやり方があると思うけど、まずは「変数」→「新しいリストの作成」アクションを追加してみる。 名前は %Results% みたいな感じで。

web scraping without programming 2022 11 01 00 21 50

「メッセージを表示」が5回表示されるのは鬱陶しいので、一旦右クリックして「アクションを無効化する」をクリックしておこう。

web scraping without programming 2022 11 01 00 23 19

そして、「変数」→「項目をリストに追加」アクションをその下に追加する。 項目の追加が %url% の価格は %kakaku% でした 、追加先リストを %Results% としておく。

web scraping without programming 2022 11 01 00 24 55

そして最後に「ファイル」→「テキストをファイルに書き込む」アクションを追加。 「ファイルパス」保存してほしいファイル名を指定して、「書き込むテキスト」は %Results% を指定する。

web scraping without programming 2022 11 01 00 28 50

そして実行すると、こんなファイルが生成された。

うーん惜しい…! 多分価格の %kakaku% に余計な改行が入っているから変なテキストになっている。

web scraping without programming 2022 11 01 00 30 22

%kakaku% の前後の改行とかを削除するちょうど良さそうなアクションがありそうなので、「テキスト」→「テキストのトリミング」を追加。同じ名前のやつが2つあってややこしいけど、編集画面が↓とおなじになるやつで。 「トリミンするテキスト」と「生成された変数」の両方を %kakaku% にする。 これで前後の改行が消された文字で上書きされる。

web scraping without programming 2022 11 01 00 34 46

完成形

最終的にこんな感じになりました。

web scraping without programming 2022 11 01 00 36 49

実行してみると、無事に意図した内容になっています。

web scraping without programming 2022 11 01 00 37 15

今回は1つの価格だけを抽出しましたが、変数の名前を変えれば複数の値を抽出することも出来ますし、アクションの種類も多いので応用が効きそうです。

また、宗教上の理由でPCにExcelを入れていないので試せなかったですが、Excelの読み書きや、CSVファイルの読み書きも出来るようです。

やっていることは完全にプログラミングですが、簡単なマウス操作でパズル感覚で遊べるのでExcelのマクロ(VBA)等と比べると難易度は低めかなと思います。

メリット

  • Windows 10以上であれば無料で使える
  • 複雑なウェブサイトや日本語のウェブサイトでも正常に実行できる
  • 今回のケース以外にも自動化出来る処理は非常に多い
  • プログラミングをゲーム感覚で学べる

デメリット

  • サイトのデザインや構成が変わると取得できなくなる
  • 新しめのWindowsのマシンが必要
  • コードは書いてないけどプログラミング

デスクトップ版とクラウド版があって、後者は有料のものしかないのでインストール時には要注意。

まとめ

  • Webページの情報取得はGoogle Spreadsheetを使うのが手軽だが、利用できるケースは少ない
  • Power Automateは複雑な処理やSpreadsheetで取得できない内容の取得・ファイル操作なども行えて汎用的だが複雑で少し難しい