質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.64%

WEBスクレイピングでログインが必要なサイトの場合どのような方法がありますか?

解決済

回答 5

投稿

  • 評価
  • クリップ 7
  • VIEW 12K+

standard-soft

score 141

こんにちは。

Webスクレイピング(データダウンロード)についての質問があります。

スクレイピングを、
GoogleSpreadSheet の GAS あるいは
Windows Excel VBA での IE コントロール
によって、何回か行ったことがあります。

GoogleSpreadSheet の GAS はWebで動くので
Mac環境などのユーザーでも動くため便利なのですが

あるWEBショップのデータダウンロードなどのときに
ログインが必要になる場合があります。

そうすると、普通のURL指定したダウンロードだけではなくなります。

Excel の IE 操作の場合は、
ブラウザの入力欄に文字を埋め込み
特定のボタンを押し、そして、データダウンロード
という操作ができるものの、

GoogleSpreadSheet の GAS では、
そのような操作ができるのかどうかわからず、困っています。

やり方をご存知の方、おられましたら
教えていただけると助かります。

自分の書いた記事ですが、GASでの通常のスクレイピングはこの内容のようにやっています。
Google SpreadSheet のGAS(JavaScript)でスクレイピング(Webデータゲット) - Qiita

繰り返しになりますが、
ExcelVBAではそれはできるのですが、

GAS では、
ブラウザの入力欄に文字を埋め込み
特定のボタンを押し、そして、データダウンロード
という操作ができるものでしょうか?

また、
スプレッドシート使わない、node.jsを使ったJavaScriptや
Python Ruby PHP などでは、
そのようなブラウザ操作系のスクレイピングは
できるものでしょうか?

最初のとっかかりのやり方やテクニックサイトなどを教えていただけましたら助かります。
よろしくおねがいします。

Windows の Excel ではできるのですが
IEを操作するというやや不安定な動作になることと
IEの将来性などを考えると、違う方法を模索したいと思っております。

GoogleChrome の非表示モードと
Selenium Web Driver を使うというやり方は
どうやらできるらしいという程度しかしらないのですが
他にもやれる方法があるかもしれないと思って質問しております。
Selenium Web Driver でのやり方のサイトも、入力欄への文字の配置やwebページ上のボタンを押すやり方が存在すれば教えていただきたいです。

今のところ対象なのは、"ふるせる"というところなのですが
そこに限らず、一般的なWEBショップ、
あるいは、ブログなどのログインができるようになりたいと
思っております。

長々とすいません。
よろしくおねがいします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

checkベストアンサー

+3

GAS でのログイン処理は以下が参考になりました。
Google Apps Scriptでクレジットカード利用明細を毎月自動で奥さんにメール送信する

スクレイピングする際にログイン有無の違いは、簡単に言うと「Cookieの有無」です。

  1. ログインページに対して必要なパラメータをセットして POST リクエストを行い、Cookie を取得する
  2. 取得した Cookie を用いて取得したいページに GET リクエストを行う

大まかに説明するとこれだけですが、1.の「必要なパラメータ」はサイト毎に異なりますので、どういった値を渡す必要があるかはサイト毎に調査する必要があります。
(ID、パスワードは必ず必要と思います)

単純な Web サイトであればログインも簡単だと思いますが、スクレイピング対策をしているようなサイトではパラメータも多くなるなど、難易度は高くなるでしょう。

IE や Chrome 等のブラウザ操作ならログイン処理時の(画面上にない)パラメータを気にする必要がないため比較的容易にログインを実現できますが、GAS ではブラウザ操作ができずサイト毎に調査する必要があるため、別物と考えたほうが良いかと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/16 11:45

    なるほど。そういうふうになっているのですね。
    よくわかりました。ありがとうございます。
    POSTリクエストでCookieに何らかの値を入れてるわけか。
    そこでJSなどでいろいろやれるということか。
    なるほどなるほど。

    キャンセル

  • 2017/10/16 11:48

    補足ですが、GAS をそのまま使うだけではJSのサイトは対応できません。
    PhantomJS Cloud を利用するなど JS の解析を行う必要がありますので、ご注意ください。
    https://phantomjscloud.com/

    キャンセル

+3

phpのスクレイピングについてだけ解答します。

Goutteというライブラリが有名です。
実際、とても使い勝手が良いです。
単純なスクレイピングならGoutteでサクッと出来てしまいます。
ただこのライブラリの欠点として、ソースコードの中に直接クローリングと解析(取得?)手順を書くので、コードが汚くなってしまうというのがあります(Google Apps Scriptより猥雑)。
保守性は落ちるかもしれません。
そしてもう1つ大きな問題があって、javascriptを使った動的なページは扱えないんです。
たぶんこれはrubyやpythonのスクレイピングライブラリでも同じだと思います。

動的ページのスクレイピングツールはSeleniumが有名ですが、他にPhantomJSがよく使われています。
PhantomJSはヘッドレスブラウザとよばれる画面表示のないブラウザで、画面がないだけ環境を選ばずに使えます。
私はPhantomJSを便利に扱えるCasperJSというユーティリティ経由で使用しています。

しかし今年6月、ついにChromeがヘッドレスモードを搭載しました。
これによってPhantomJSの開発が終了してしまいました。
今後はHeadless Chromeがスクレイピングの中心になるはずです。
まだまだHeadless Chromeの情報は少ないですが、macとlinux版のChromeで使えるので、少しでも触っておくといいと思いますよ。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/16 11:51

    PhantomJSのこと、耳にしたことがある、程度でした。
    Headless Chrome がこれからきますよね。技術的な幅が広がります。

    そう、JavaScriptで動的生成されたデータは難しいですよね。
    ExcelVBAのIEコントロールだと、
    ロードして待機してたら、なんかDOM上でデータが取れてるようだから、そのようにプログラム組んだらなんとか操作できる。
    みたいな、可能だけれども不安定、というプログラムでなんとかやっておりました。

    JSで動的生成されるページも今後増えてくると思うので
    Selenium の Headless Chrome のコントロール。とても学ぶ価値のある技術ですね。

    大変ためになりました。情報ありがとうございます。助かりました。

    キャンセル

+1

ブラウザの入力欄に文字を埋め込み
特定のボタンを押し、そして、データダウンロード

上記の操作もWebサーバとの通信ではHTTPプロトコルでの通信として行われることに変わりはありません。
そして、ぷろぐらむからGETリクエストとPOSTリクエストが発行できるのであれば、通常のブラウザアクセスはほぼ行うことができると考えて良いかと思います。

Google Apps ScriptのUrlFetchAppはGET、POSTの両方に対応できますので、ご質問の内容は可能と思われます。

Class UrlFetchApp  |  Apps Script  |  Google Developers

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/15 15:13

    なるほど、GETとPOSTという考えがあまりわかっていませんでした。
    フォームから操作するときに、GETかPOSTで何をどうしているのか、
    っていうのを、見抜くわけですね。
    単純なHTMLのsubmitとかなら、すぐにわかるわけか。

    ありがとうございます。

    キャンセル

0

あれからいろいろ調べましたので、記載しておきます。

ログインの必要なページをスクレイピングする際に
ExcelVBA IE のコントロールと同等の操作を行うためには、

アドバイスいただいた PhantomJS でも可能かと思いますが
開発の先がなさそうなので、
node.js 上で chromy というライブラリを使って
Google Chrome のヘッドレスモードでコントロールする
という方法がやりやすいと感じました。

また、GoogleSpreadSheetからのスクレイピングでは
ブラウザコントロールは難しいので
Postなどでユーザー/パスワードを送ることになり
HTMLの解析がけっこう手間がかかるかもしれません。
PhantomJSCloudについては調べきれていません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

あれからいろいろ調べましたので、記載しておきます。

ログインの必要なページをスクレイピングする際に
ExcelVBA IE のコントロールと同等の操作を行うためには、

アドバイスいただいた PhantomJS でも可能かと思いますが
開発の先がなさそうなので、
node.js 上で chromy というライブラリを使って
Google Chrome のヘッドレスモードでコントロールする
という方法がやりやすいと感じました。
サンプルを幾つか作ってみましたが、これは使えるという実感しました。

WebDriverをインストールしてSelemiumでブラウザコントロールしてもいいかもしれません。
こちらはほとんど試していません。

また、GoogleSpreadSheetからのスクレイピングでは
ブラウザコントロールは難しいので
Postなどでユーザー/パスワードを送ることになり
HTMLの解析がけっこう手間がかかるかもしれません。
PhantomJSCloudについては調べきれていません。

アドバイス、回答くださったみなさま、ありがとうございます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.64%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る