(Windows8 / XAMPP上でPHPを実行)
とあるサイトへの自動ログインをPHPのGoutteで行おうと、以下のコードを書きました。
PHP
1<?php 2require_once 'goutte.phar'; 3 4use Goutte\Client; 5 6$ua = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36"; 7// Goutteオブジェクトの生成 8$client = new Client( ['HTTP_USER_AGENT' => $ua ]); 9 10$crawler = $client->request('GET', 'http://(とあるサイト)'); 11//var_dump($crawler); 12 13$loginForm = $crawler->filter('.newLogin')->form(); 14$loginForm['txt_account'] = '(アカウント)'; 15$loginForm['txt_password'] = '(パスワード)'; 16$crawler = $client->submit($loginForm); 17//var_dump($loginForm); 18//var_dump($crawler); 19 20echo $crawler->html();
上記のコードを実行するとログインはできず、ログイン入力画面へ戻ってしまいます。
(echo $crawler->html()の出力がログイン入力画面)
別途request()でPOSTする方法でログインはできたのですが、上記コードではなぜログインできないのか調べていたところ、<form>のactionに注目しました。
html
1<form style="display:none;" class="newLogin" method="post" action="./C1Login.php"> 2(中略) 3<input type="text" size="15" id="id" maxlength="40" name="txt_account" value="" tabindex="1" style="width: 200px;font-family:tahoma;font-size: 20px;/* margin: auto; */"> 4 </div> 5 <div class="login-input"> 6 <span>パスワード</span> 7 <input type="password" size="20" id="pass" maxlength="40" name="txt_password" value="" tabindex="2" style="width: 200px;font-family:tahoma;font-size: 20px;"> 8 </div> 9 <div class="login-btn"> 10 <button type="submit" name="login" tabindex="4" style="padding:0;" value="ログイン">
つまり、actionが相対パスなので実行環境であるローカルホストからのパスになってしまうから、正しいPOST先を参照できないことが原因ではないかと考えました。
この考え方であっているのか、また別の原因があるのか、ご助言いただければ幸いです。
参考までにrequest()でログインできたコードも下記に記載いたします。
PHP
1<?php 2require_once 'goutte.phar'; 3 4use Goutte\Client; 5 6$ua = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36"; 7// Goutteオブジェクトの生成 8$client = new Client( ['HTTP_USER_AGENT' => $ua ]); 9 10$array = [ 11 'txt_account' => '(アカウント)', 12 'txt_password' => '(パスワード)', 13 'chk_save' => '', 14 'login' => 'ログイン', 15]; 16 17$crawler = $client->request('POST', 'http://(とある)/C1Login.php', $array); 18 19echo $crawler->html();
よろしくお願いいたします。
※参考にしたサイト
Goutteでスクレイピングする方法めも
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/01/18 14:32