スプレットシートでIMPORTXML関数を使ってみた所感
とある仕事で簡易的にスクレイピングする必要があり、IMPORTXML関数を使用してみましたので、備忘録を兼ねたレポートです。(かなりざっくりです)
IMPORTXML関数を使うと、特別なプログラミングを書かなくても簡単なスクレイピングができてしまうので、大変便利な関数です。
IMPORTXML関数を使って実現できたこと
①とあるページのテキスト情報を取得する
<記載例>
※A3に取得したいページのURLが入れた場合
=IMPORTXML(A3,"//*[@id='sampletable']/div/ul/li/p[3]")
最も基本的な使い方だと思います。
静的なページ、あるいは商品情報のような動的なページでも、問題なく取得できました。
ただしページによってはHTML構造が複雑なのか、取れない・または取りづらいケースがありました。
②複数ページ(10ページ程度)のテキスト情報を取得しシート内に列挙する
①と同じIMPORTXML関数を、シート内に複数設置するというものです。10ページ程度でしたら設置可能でした。
③とある商品一覧ページ内の商品ごとのURLを取得する
まず考え方ですが、たとえばある商品ページURLが、https://●●●.com/shouhin/001/の場合、すべての商品ページが/shouhin/002/、/shouhin/003/・・・という規則があることが推測できます。
そこで、まず以下のようなIMPORTXML関数で/shouhin以下のURLを取得します。
<記載例>注意:このままコピペでは使えません。使用するには、取得サイトのXMLパスを正確に取ってくる必要があります。
=IMPORTXML(A3,"//*[@id='sampletable']//li[@class='sampletable_img']/a/@href")
こんな感じで/shouhin/001 などの連番が自動で取得できました。
※XMLパスの取得方法※
「shift+ctrl+C」でデベロッパーツールを開き、取得したい箇所のタグの上にカーソルを合わせる→右クリック→Copy→CopyXPathをクリック
次に、「https://●●●.com」と「/shouhin/001/」を連結して商品ページのURLを生成します。TEXTJOIN関数を使います。
<記載例>
=TEXTJOIN("",TRUE,"http://●●●.com",G4)
これで、とあるページ内に掲載されているすべての商品の、個別URLが取得できました。
IMPORTXML関数では実現できなかったこと
今回、実現できなかった、というか、できるんだけど、実質限界があるなーと感じたことは以下です。
①IMPORTXML関数で取得したページのURLから、更にその中のテキスト情報をIMPORTXML関数で取得しシート内に列挙する
このような、IMPORTXML関数にIMPORTXML関数をネストする?みたいなやり方は、1,2個に絞ってもLoadingに時間がかかりました。
②1シート内にIMPORTXML関数を大量に設置する
情報を取得することはできるのですが、単純にLoadingに時間がかかりすぎるため、実務上使えないということがわかりました。(あるときは30分くらいかかりました。)
また、そういったときは「シート内のIMPORTXML関数を減らしてください」みたいなアラートが表示されます。
個人的結論
1シートに使用するIMPORTXML関数は~10個程度にとどめ、入れ子にしない。大量に使いたい場合は別途、プログラミングを書く必要がある。
ただしスクレイピングは相手のサーバーに負荷を与えるものなので、ルールを守って使わなければならない。
ちょっとだけ使うならIMPORTXML関数で十分だけど、やっぱり本格的にスクレイピングしたいならばやっぱりプログラムを書く必要があるのですね。
ただ、様々な観点で注意が必要な技術なので、非エンジニアが知識なくこのプログラムを書いたり作成を依頼したりするのは、慎重になる必要がありそうです。少なくとも、以下の点は頭に置いておきたいところです。
非エンジニアでも知っておきたい、スクレイピングに関わるルール
①取得した情報を、著作権に抵触するような使い方をしない
②取得先の「robots.txt」ファイルに記載のある制限内容を守る
③取得先の利用規約にスクレイピング禁止項目があったら、使用しない
④取得先のサーバーに過度に負荷をかけるようなプログラムを書かない
最後まで読んで頂きありがとうございました。
いつもありがとうございます💖 よろしければサポートお願いします!とても励みになります✨