少し前までログイン機能付きサイトのスクレイピングをしていたのですが、フォームを送信するページでは結構つまづいたものです。
というのもpostでデータを送信するときに以下の3点にかなり悩まされたからです。
- 自分が送信したデータに送らなくてもいい余分なデータが含まれていた
- 逆に送らないといけないのに送っていない不足しているデータがあった
- そもそも送っているデータの値が妥当なものではなかった
もちろんデータに過不足があったり、データの値が間違っているものだと、大体の場合エラーが出てしまいます。
本記事ではPOST通信時に陥りがちなトラブルと、それを防ぐために簡単にPOST通信時に送るデータの確認方法を解説していきます。
僕自身がそもそもプログラミング初心者ですので、解説や言葉遣いに至らぬ点があるかもしれません。ご了承ください。
また説明がくどい場合もあるかとおもいます、随時必要のない所は読みとばしてください。
そもそも、記事自体が自分が同じ過ちを繰り返さないための備忘録だったりします(笑)
環境
Python 3.6
あまりPythonのコードはのっけていませんが念のため、環境を書いておきます。
また、スクレイピングには主にrequestsとBeautifulSoupを使いました。
スクレイピングでフォーム送信時につまづく点
僕はスクレイピングでPOSTするとき、例えば以下の点で詰まりました。どのように詰まったのかを簡単に説明していきます。
以下で紹介するトラブルはすべて、次の章「デベロッパーツールでPOST通信時に送ったデータも確認可能」で紹介する方法で解決することができます。
隠しデータを送信しないといけない場合
僕がスクレイピングしたサイトで解説します。
これはある列車予約サイトのログインページなんですが、ブラウザで普通に見る限り、こちらから送る情報はIDとパスワードだけに見えます。
<input type="text" size="30" name="id" maxlength="12" class="checkBox"> <input name="password" type="password" size="30" maxlength="12" class="checkBox">
ページのHTMLをデベロッパーツールで確認すると実際にはこのようになっており、これらがIDの入力欄、パスワードの入力欄に該当します。
なので、以下のように送信するデータにIDとパスワードを指定してやりましょう。
import requests session = requests.session() ID = '1234567891011' PW = '***********' url = 'http://~~~~~' login_info = {'id':ID,'password':PW} session.post(url,data=login_info)
しかし、残念ながらこれでは次のページにアクセスしようとしてもエラーページが表示されてしまいます。
デベロッパーツールではサイトのHTMLを見ることができるので確認してみましょう。
<input type="hidden" name="JRSSID" value="0409"> <input type="hidden" name="RTURL" value="https://www.jr-odekake.net/"> <input type="hidden" name="NTURL" value="https://e5489.jr-odekake.net/e5489/cspc/CBTopMenuPC"> <input type="hidden" name="LIVSID"> <input type="hidden" name="LIVVID"> <input type="submit" id="formHiddenSubmitJSButton" name="sbmtok" value="確認">
HTMLを確認すると上のようなtype=”hidden”となったinputタグ見つかります。これを隠しデータといいます。
隠しデータはブラウザで普通に見る分には見えないinputタグですが、実はクリックした際にはこの値もしっかり送信されているんです。
なので、上記のコードのlogin_infoを次のように変更します。
login_info = {'id':ID, 'password':PW, 'JRSSID':'0409', 'RTURL':'https://www.jr-odekake.net/', 'NTURL':'https://e5489.jr-odekake.net/e5489/cspc/CBTopMenuPC', 'LIVSID':'', 'LIVVID':'', }
こうやって、隠しデータもきちんと含めて送信してやると基本的にはエラーなく次のページへ移ることができます。
ただし、隠しデータを見落としたりしてしまうとエラーが出てしまいます。
隠しデータの値がアクセス毎に変わる
隠しデータがあったので、そのタグのvalueになっている値をデータとして何度送ってもエラーが出る…
おかしいな…と悩んでいたのですが、隠しデータで値がアクセス毎に変わるものがありました。
アクセス毎に値が変わるということは、もちろんブラウザで見ているときとスクレイピング時で値が変わるということ。
つまり、ブラウザからデベロッパーツールで確認した値をそのまま送信すると、エラーが出てしまいますので気を付けてください。
僕は、取得したhtmlのデータからアクセス毎に変動する隠しデータを取得する関数を作って対処しました。
送っているデータに過不足があった
デベロッパーツールでHTMLファイルを見て何回も確認したし、値もしっかり正しいものをpostしているのになぜか、次のページにうまく遷移できないことがありました。
コードをよく読んでみると、
「送信ボタンをクリックすると、JavaScriptの関数が作用し、新しい隠しデータを作り、そしてそれを送信する」
という仕組みになっていることに気づきました。
なるほど、だからHTMLファイルに書いてある全てのinputデータを送ってもエラーが出るわけです。
送信している値がそもそも間違っていた
これは単純に僕のケアレスミスなのですが、データを送る用の辞書を作るときに、値を間違えたりすることもありました(笑)
また、ミスでなくても、○○の時は隠しデータを△△に変更、××の時は隠しデータの値を□□に変更といったように、場合によってデータの値が変わるものもあります。
デベロッパーツールでPOST通信時に送ったデータも確認可能
スクレイピングは自分がブラウザでwebをいじるときの操作を忠実にコードで再現してやれば、たいていの場合はうまくいきます。
ですので、ログイン時のIDやパスワードの送信・フォームに何かを入力しそのデータを送信する時は、以下のことを必ず実行しましょう。
- コードを書く前に自分でブラウザでその操作を実行
- 操作実行時にの隠しデータを含め、どのようなデータをPOSTしているのか確認
POSTで送信する情報は各ブラウザに備わっているデベロッパーツールを使って確認することができます。
デベロッパーツールとは
前章ですでに登場してますが、念のために少し説明。
デベロッパーツールは開発者むけのツールでブラウザが読み込んでいるHTMLファイル、CSSファイル、JavaScriptのファイルを見たりすることができます。
もちろん、紹介した以外にも様々な機能があります。
ブラウザの種類は主にGoogle ChromeやInternetExplorer、FireFox、Safariなどがあり、各ブラウザにデベロッパーツールは備わっていますが、ブラウザごとに機能が少し異なります。
本記事では機能も豊富で使っている人数が多い、Google Chromeのデベロッパーツールを使って解説していきます。
で、POST通信時のデータはどうやって見るの?
まず、デベロッパーツール開いてください。念のためですが、
- WindowsならF12ボタンもしくはCtrl+Shift+I
- MacならCommand+Option+Iボタン
で開くことができます。
デベロッパーツールを開いたら、
①Networkタブをクリックし、
②必要な情報(この例だとIDとパスワード)を入力し、次のページへ移ってください
ログイン後のページに遷移すると、デベロッパーツールの画面も切り替わります。
「Name」という欄がでてくるので、それの一番上をクリックすると、ログイン後のページへ遷移するときにブラウザとサーバーでどのようなやり取りがされたかを確認できます。
「Name」欄の1番上をクリックすると、新たにウィンドウが開くので、これを一番したまでスクロールしてください。
すると「From Data」と題された枠が出てきます。
ここから自分がブラウザでログインする時など、フォームに何かを入力して送信するときに、サーバーにPOSTしているデータが全部、隠しデータを含めて知ることが出来ます。
ので、ここを確認しながらPOSTデータを作成することで、「送るデータに過不足がある」や「送っている値が間違えていた」などのトラブルは簡単に防ぐことが出来るはずです。
コメント