Initial Site

Initial Site

Initial Site

スプレッドシートを使って簡単なスクレイピングをしてみよう

  • ヨシモト  2018/04/24 18:51
webScraping_boy

営業部 ヨシモトです。

WEBサイトにある情報を手動(コピペ)で集めている人 or しようとしている人にとって、もしかしたら役に立つかもしれない内容です。

※この記事は非エンジニアや、プログラミングの知識に自信のない方のためのものなので、用語の説明なども正確さよりも理解しやすさを重視しました。

 

スクレイピングとは

とても簡単に言うと、WEBサイトの中の何かしらの情報を取得するようなニュアンスのことです。
規模は大小様々です。

例えば「指定したブログ記事の中にスプレッドシートという文字が含まれているか」ということから、
世の中に存在するWEBサイトの内容を取得する(Googleなどの検索エンジンがこんな感じのことを行っています)といったことまで。

日常生活の中のちょっとしたことから大きなビジネスまで広く活躍するスクレイピングって素晴らしいですね。

 

スプレッドシートだけでやってみる

大きくやろうとするとそれなりに大変ですが、ちょっとしたことでしたらスプレッドシートだけでできます。

今回は弊社で運営をしているYAZIUPでやってみましょう。

 

用意するもの

Google Chrome …ブラウザ(Chromeの機能を使って説明しているので)

スプレッドシート…スプレッドシート独自の関数を使うので(Excelではできません)

 

スプレッドシートだけでスクレイピングする方法

今回はたった2つの関数を使って実践します。

使う関数

IMPORTXML

“XML、HTML、CSV、TSV、RSS フィード、Atom XML フィードなど、さまざまな種類の構造化データからデータをインポートします。”

IMPORTXML – ドキュメント エディタ ヘルプ

CONCAT

“2 つの値の連結を返します。& 演算子と同じです。”

CONCAT – ドキュメント エディタ ヘルプ

何を取得するか

今回はYAZIUPから、

指定したキーワードが含まれている記事の

記事のタイトル

記事へのリンク

掲載日

これらを取得してみようと思います。

 

 

手順の確認

PCからYAZIUPにアクセスした際、右上に検索用のウィンドウがあります。

yazss

こちらにキーワードを入力すると、このワードを含む記事の一覧が表示されます。

searchResult

ここでURLを見てみると

resultURL

この「新幹線」の部分を変更すれば他のワードでも同じような結果が得られそうなことがわかりますね。

ということでスプレッドシートにて行う手順としては

1.検索結果のURLを作る

2.検索結果に表示されている記事一覧のタイトルとURLを取得する

3.取得した記事のURLにアクセスして記事の掲載日を取得する

ざっくりとこんな手順になります。

 

ここからはスプレッドシートを開いてやってみましょう。

1.検索結果のURLを作る

まずA1に「検索ワード」と書き、B1にキーワードが入るようにしておきます。

次にA2に検索結果URLの「キーワード以外の部分」を入れます。

createUrlBefore

ここでB2にCONCAT関数を使います。

CONCATは第一引数に「検索結果URLからキーワード部分を除いたもの」(A2)、第二引数にキーワード(B1)を入れると
この二つが合体して検索結果URLが出来上がります。URLをクリックして確認しましょう。

※かっこの中に入れる値を半角コンマで区切った時に前から第一引数、第二引数となります。

createUrlAfter

B2のキーワードを入れ替えてみましょう。同じくURLをクリックして検索結果ページを確認しましょう。

otherKeyword

これで検索結果URLが作れるようになりました。

※ここではわかりやすく
CONCAT(A2,B1)としていますが、
CONCAT(“https://yaziup.com/?s=”,B1)でも大丈夫です。

 

 

2.検索結果に表示されている記事一覧のタイトルとURLを取得する

ここからはIMPORTXML関数を使います。

IMPORTXML関数は第一引数に「対象のURL」、第二引数に「XPathクエリ」を入れます。

XPathとは、とてもざっくり言うと「文章の構造を表す」ような感じのものです。

XPathクエリは、ここでは「全体から見て、対象の文章がどのような構造の中にあるか」を示すようなものです。

※これらはググるとちゃんとした説明が読めます。

 

まずは、検索結果にある記事一覧からタイトルのXPathクエリを取得します。

 

XPathの取得方法

XPathを取得したい文章にマウスカーソルを合わせて右クリックし「検証」を選択します。

rightClick

するとChromeのデベロッパーツールが起動し下の図のような画面になります。
取得したい文章の部分が青くなっていると思います。
そこにマウスカーソルを合わせて右クリックし「Copy」→「Copy XPath」を選択してください。

copyXPath

これだけで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 …②

これで引数として指定できます。
するとタイトルが取得できるはずです。

getTitlebyimportxml

このXPathですが、

//div[@class=’titleInner’]/a …③

と置き換えことができます。

このdivというのはグループ分けのようなもので、そのグループにclass=”~”という名前が付いていることが多いです。

最初のXPath②ではdivがたくさんありますがこれらにもそれぞれ名前がついています。

XPath③は、たくさんあるdivのうち、最後のdivの名前を指定することで短く置き換えられました。
先ほどXPathをコピーした画面を確認すると、青くなっている部分のひとつ上に、
div class=”titleInner”とありますね、これです。
この置き換えたものでIMPORTXMLを展開すると

titleinner

他のタイトルも取得できました。

「Copy XPath」は指定したピンポイントのXPathを取得します。
div[1]などの数字部分は、そのdivのうち何番目なのかを指定しているためです。
対してXPath③は何番目なのか指定していないため、該当するものを全て取得しています。

これに少し手を加えるとこれらの記事のURLが取得できます。
C2に入れたIMPORTXMLに対して第二引数に/@hrefを加えたもの

//div[@class=’titleInner’]/a/@href …④

これをD2に入れます。

titleinnerhref

記事のURLが出ました。それぞれリンク先を開いてみるとわかりますが、
きちんとそれらのタイトルの記事へのURLが取得できていますね。
これもデベロッパーツールの画面からも見られますが、hrefにはリンク先のURLが示されているのでそれを取得しました。

※これらの仕組みはHTMLについて調べてみると理解しやすいと思います。

3.取得した記事のURLにアクセスして記事の掲載日を取得する

記事の掲載日を取得しましょう。
先ほどのURLの一覧から記事にアクセスします。
記事の上の方に「日付」がありますので、そこで同じようにマウスカーソルを合わせて右クリックし「Copy」→「Copy XPath」を選択しすると

liclass

//*[@id=”body”]/div[1]/article/div/div[1]/div[1]/ul/li[1] …⑤

こう取得できますが、
さっきの要領でこうしてみましょう。

//li[@class=’date’] …⑥

IMPORTXMLに記事のURL(D2)と日付のXPathを入れて展開し、
セルの右下をドラッグして他の記事の日付も一気に取得してみましょう。

classdate

できました。
これで「指定したキーワードが含まれる記事からタイトルとURLと掲載日を取得するツール」ができました。
試しにキーワードを他のものに変えてみましょう。

otherkeywordresult

これを応用して例えば、

・YouTubeの動画を検索してタイトルとサムネイル、再生数を取得したり
(これはちょっと試してみたところ、私の知識では広告が表示されると位置がずれたりしました)

・Googleの検索結果を取得して集計してみたり
(SEO施策をする時などに役に立つかもしれません)

といったこともできます。

また、今回作ったものはIMPORTXMLが多く(日付の部分が特に)、これが多いとデータの呼び出しが多くなり、結果として取得が遅くなります。

あくまでも簡単にちょっとしたものをスクレイピングしてみるのには良いかと思います。

もう少し実用的なものにチャレンジしたいという方はぜひGASでやってみましょう。

 

2018/11/02 追記

GASでスクレイピングの記事を書きましたのでぜひご覧ください。

【難しくない】GASでwebスクレイピングして正規表現でデータを集める

 

その他、スプレッドシートやGASに関する記事はこちらからどうぞ。

GASを使ってGmailから本文の一部を抜き出す

スプレッドシート独自の便利な関数

QUERY関数の便利な使い方

スプレッドシートを使って簡単なスクレイピングをしてみよう

【GAS】正規表現を使ってGmailの本文から文章を抜き出す

【簡単】GASでスプレッドシートの送信リストからメールを送る

【GAS】正規表現を使って複数行の文章をGmailから抜き出す

【GAS】Gmailの添付ファイルを一括でGoogleドライブへ保存する

【難しくない】GASでwebスクレイピングして正規表現でデータを集める


コメントをどうぞ

ツールの記事

  1. dance_shoot_dance
    【難しくない】GASでwebスクレイピングして正規表現でデータを集める
  2. bg_kaitenzushi
    【GAS】Gmailの添付ファイルを一括でGoogleドライブへ保存する
  3. kid_job_boy_programmer
    【GAS】正規表現を使って複数行の文章をGmailから抜き出す
  4. createSSAsan
    【簡単】Google Apps Script(GAS)でメールを送る

おすすめ記事

  1. スギ花粉
    鼻がムズムズ目がカユカユな花粉症についてまとめてみた
  2. 『テレビ観ないんだよね…』と言うのがかっこいいと思っている人に告ぐ!
  3. 出典:無料壁紙:格闘技がテーマの写真やイラスト画像まとめ(格闘家・ブルースリー)
    ブルース・リーの出身地ってどこだかわかりますか?
  4. ハイビスカス
    ウチナーンチュが沖縄に帰った時に必ず行くお店10選+α
  5. イニシャルサイトコーポレートサイト
    コーポレートサイトをリニューアルしました
  6. なんでもQ
    相談Q&Aサイト「なんでもQ」開発中です!
  7. さんぽすフォトコンペ開催中
    今年もさんぽすフォトコンペ開催しました!

人気の記事

  1. クロックスの偽物と本物の違い
    クロックスの本物と偽物の違いを比べてみました
  2. ファミコン
    パズドラ、モンスト、白猫に続く次のゲームは…?
  3. konagaya_20150303
    日常でつい使ってしまう間違えやすい日本語
  4. Doctor scanning mri patient with MRI scanner machine technology
    MRI検査(造影剤付き)の感想と注意点