- ヨシモト
総記事本数:17
営業部 ヨシモトです。
WEBサイトにある情報を手動(コピペ)で集めている人 or しようとしている人にとって、もしかしたら役に立つかもしれない内容です。
※この記事は非エンジニアや、プログラミングの知識に自信のない方のためのものなので、用語の説明なども正確さよりも理解しやすさを重視しました。
とても簡単に言うと、WEBサイトの中の何かしらの情報を取得するようなニュアンスのことです。
規模は大小様々です。
例えば「指定したブログ記事の中にスプレッドシートという文字が含まれているか」ということから、
世の中に存在するWEBサイトの内容を取得する(Googleなどの検索エンジンがこんな感じのことを行っています)といったことまで。
日常生活の中のちょっとしたことから大きなビジネスまで広く活躍するスクレイピングって素晴らしいですね。
大きくやろうとするとそれなりに大変ですが、ちょっとしたことでしたらスプレッドシートだけでできます。
今回は弊社で運営をしているYAZIUPでやってみましょう。
Google Chrome …ブラウザ(Chromeの機能を使って説明しているので)
スプレッドシート…スプレッドシート独自の関数を使うので(Excelではできません)
今回はたった2つの関数を使って実践します。
“XML、HTML、CSV、TSV、RSS フィード、Atom XML フィードなど、さまざまな種類の構造化データからデータをインポートします。”
“2 つの値の連結を返します。& 演算子と同じです。”
今回はYAZIUPから、
指定したキーワードが含まれている記事の
記事のタイトル
記事へのリンク
掲載日
これらを取得してみようと思います。
PCからYAZIUPにアクセスした際、右上に検索用のウィンドウがあります。
こちらにキーワードを入力すると、このワードを含む記事の一覧が表示されます。
ここでURLを見てみると
この「新幹線」の部分を変更すれば他のワードでも同じような結果が得られそうなことがわかりますね。
ということでスプレッドシートにて行う手順としては
2.検索結果に表示されている記事一覧のタイトルとURLを取得する
3.取得した記事のURLにアクセスして記事の掲載日を取得する
ここからはスプレッドシートを開いてやってみましょう。
まずA1に「検索ワード」と書き、B1にキーワードが入るようにしておきます。
次にA2に検索結果URLの「キーワード以外の部分」を入れます。
ここでB2にCONCAT関数を使います。
CONCATは第一引数に「検索結果URLからキーワード部分を除いたもの」(A2)、第二引数にキーワード(B1)を入れると
この二つが合体して検索結果URLが出来上がります。URLをクリックして確認しましょう。
※かっこの中に入れる値を半角コンマで区切った時に前から第一引数、第二引数となります。
B2のキーワードを入れ替えてみましょう。同じくURLをクリックして検索結果ページを確認しましょう。
これで検索結果URLが作れるようになりました。
※ここではわかりやすく
CONCAT(A2,B1)としていますが、
CONCAT(“https://yaziup.com/?s=”,B1)でも大丈夫です。
ここからはIMPORTXML関数を使います。
IMPORTXML関数は第一引数に「対象のURL」、第二引数に「XPathクエリ」を入れます。
XPathとは、とてもざっくり言うと「文章の構造を表す」ような感じのものです。
XPathクエリは、ここでは「全体から見て、対象の文章がどのような構造の中にあるか」を示すようなものです。
※これらはググるとちゃんとした説明が読めます。
まずは、検索結果にある記事一覧からタイトルのXPathクエリを取得します。
XPathの取得方法
XPathを取得したい文章にマウスカーソルを合わせて右クリックし「検証」を選択します。
するとChromeのデベロッパーツールが起動し下の図のような画面になります。
取得したい文章の部分が青くなっていると思います。
そこにマウスカーソルを合わせて右クリックし「Copy」→「Copy XPath」を選択してください。
これだけでXPathが取得できました。
試しにスプレッドシートに貼り付けてみましょう。
これがこのページにおけるタイトル部分のXPathです。
今度はIMPORTXMLを使ってタイトルを取得しましょう。
IMPORTXMLの第一引数に検索結果URL(B2)を指定し、第二引数に先ほどのXPathを指定します。
注意点ですが、第二引数は”(ダブルクォート)で囲む必要があり、さっきのXPathをそのまま貼り付けると
//*[@id=“body”]/div[1]/div/div[1]/div[2]/div[1]/div/a …①
bodyを囲む”で引数の指定が崩れるため、bodyを囲む”を'(シングルクォート)に置き換えてください。
//*[@id=‘body’]/div[1]/div/div[1]/div[2]/div[1]/div/a …②
これで引数として指定できます。
するとタイトルが取得できるはずです。
このXPathですが、
//div[@class=’titleInner’]/a …③
と置き換えことができます。
このdivというのはグループ分けのようなもので、そのグループにclass=”~”という名前が付いていることが多いです。
最初のXPath②ではdivがたくさんありますがこれらにもそれぞれ名前がついています。
XPath③は、たくさんあるdivのうち、最後のdivの名前を指定することで短く置き換えられました。
先ほどXPathをコピーした画面を確認すると、青くなっている部分のひとつ上に、
div class=”titleInner”とありますね、これです。
この置き換えたものでIMPORTXMLを展開すると
他のタイトルも取得できました。
「Copy XPath」は指定したピンポイントのXPathを取得します。
div[1]などの数字部分は、そのdivのうち何番目なのかを指定しているためです。
対してXPath③は何番目なのか指定していないため、該当するものを全て取得しています。
これに少し手を加えるとこれらの記事のURLが取得できます。
C2に入れたIMPORTXMLに対して第二引数に/@hrefを加えたもの
//div[@class=’titleInner’]/a/@href …④
これをD2に入れます。
記事のURLが出ました。それぞれリンク先を開いてみるとわかりますが、
きちんとそれらのタイトルの記事へのURLが取得できていますね。
これもデベロッパーツールの画面からも見られますが、hrefにはリンク先のURLが示されているのでそれを取得しました。
※これらの仕組みはHTMLについて調べてみると理解しやすいと思います。
記事の掲載日を取得しましょう。
先ほどのURLの一覧から記事にアクセスします。
記事の上の方に「日付」がありますので、そこで同じようにマウスカーソルを合わせて右クリックし「Copy」→「Copy XPath」を選択しすると
//*[@id=”body”]/div[1]/article/div/div[1]/div[1]/ul/li[1] …⑤
こう取得できますが、
さっきの要領でこうしてみましょう。
//li[@class=’date’] …⑥
IMPORTXMLに記事のURL(D2)と日付のXPathを入れて展開し、
セルの右下をドラッグして他の記事の日付も一気に取得してみましょう。
できました。
これで「指定したキーワードが含まれる記事からタイトルとURLと掲載日を取得するツール」ができました。
試しにキーワードを他のものに変えてみましょう。
これを応用して例えば、
・YouTubeの動画を検索してタイトルとサムネイル、再生数を取得したり
(これはちょっと試してみたところ、私の知識では広告が表示されると位置がずれたりしました)
・Googleの検索結果を取得して集計してみたり
(SEO施策をする時などに役に立つかもしれません)
といったこともできます。
また、今回作ったものはIMPORTXMLが多く(日付の部分が特に)、これが多いとデータの呼び出しが多くなり、結果として取得が遅くなります。
あくまでも簡単にちょっとしたものをスクレイピングしてみるのには良いかと思います。
もう少し実用的なものにチャレンジしたいという方はぜひGASでやってみましょう。
2018/11/02 追記
GASでスクレイピングの記事を書きましたのでぜひご覧ください。
【難しくない】GASでwebスクレイピングして正規表現でデータを集める
その他、スプレッドシートやGASに関する記事はこちらからどうぞ。
【GAS】正規表現を使ってGmailの本文から文章を抜き出す
【簡単】GASでスプレッドシートの送信リストからメールを送る
【GAS】正規表現を使って複数行の文章をGmailから抜き出す
【GAS】Gmailの受信トレイにあるメールの添付ファイルを自動でGoogleドライブへ保存する
【難しくない】GASでwebスクレイピングして正規表現でデータを集める
始めまして、ヨシモト様 北九州在住の76歳 橋本です、1ヶ月前にスプレッドシートと出会いデータの収集が目的で始めましたが、いろいろな参考がサイトがありますが。
手も足も出ない状態がでした。今日初めてスクレーピングでインポートできました。
第一歩が踏み出せた感じです。有難うございました。目的のスクレーピングまでは難問が山積ですが、時間はタップリありますので、ソウデハナイカモ、やる気が出てきました。
これからもヨシモト様の参考文献参考にさせてもらいます。
橋本さん
コメントありがとうございます。
参考にしていただけたようでなによりです。
私も橋本さんと同じように、一歩、また一歩と踏み出せることでやる気が出てきます。
共に頑張りましょう。
コメントをどうぞ