Webスクレイピングでページ処理をやろうとして、さて最初にログインしなきゃいけない場合はどうするんだ?

と思って調べてみました。

いろいろな手法が紹介されていますが、PHPで処理する場合、このページが参考になりました。

PHPプロ!

PHPプロ!はユーザーとして登録すると、IDとパスワードを使ってログインするようになっています。

ただし、上記のページのコード、一部修正しないと動かなかったので修正も含めてご案内します。








まず、PHPでcurlが使えるか、php_info()などで確認しておきます。

該当サイトのログインIDとパスワードを取得しておきます。

以下のロジックはすべてのサイトに対応しているわけではありません。

PHPの具体的な動作はこんな感じ。
○ログインにIDとパスワードを使う。
○POSTを使ってIDとパスワードを送って認証する。
○サイト内の移動でCookieを使う。

(サイトがIISで構成されている場合は除く、https://xxx/xxx.aspみたいなやつ)

まず、IDとパスワードを使ってログインするために2つのURLを確認しておきます。

最初のページのURL。

PHPプロ!の場合は、https://www.phppro.jp/members/login_page.php

IDとパスワードを送る先のURL。

PHPプロ!の場合は最初のページのソースを開いて、以下を探します。

formタグのmethod属性がpostになっているところ。

このaction属性がIDとパスワードを送る先のURLです。/members/login.php

相対パスの場合は絶対パスに直しておきます。https://www.phppro.jp/members/login.php

IDやパスを入れるフィールドのname属性。

ログインは、login-name。

パスワードは、login-password。

これらを使って、PHPでコードを作ります。

ログインしてトップページを開いてみます。

<?php 
    //phpプロ!の場合
    //パラメータをセット
    $params = array( 
        "login-name" => 'あなたのログインID', 
        "login-password" => 'あなたのパスワード', 
        "submit"  => "ログイン"
    ); 
    
    
    //クッキー保存ファイルを作成
    //Cookieを同じ場所に保存しています。
    
    $cookie_path = './cookie.txt';
    touch($cookie_path);
    
    //ログインページへ移動
    
    $URL1 = "https://www.phppro.jp/members/login_page.php";
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $URL1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_path);
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_path);
    $put = curl_exec($ch) or die('error ' . curl_error($ch)); 
    curl_close($ch);
    
    
    //ログインIDとパスワードを転送して認証されればトップページを開く
    
    $URL2 = "https://www.phppro.jp/members/login.php";
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $URL2);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_HEADER, TRUE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_path);
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_path);
    curl_setopt($ch, CURLOPT_POST, TRUE);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
    $output = curl_exec($ch) or die('error ' . curl_error($ch)); 
    curl_close($ch);
    
    
    mb_language("Japanese");
    $html_source = mb_convert_encoding($output, "UTF-8", "auto");
    
     
    echo $html_source;
    
    
    
    //Cookieの削除のタイミングはあなたまかせです
    unlink($cookie_file_path);
    
?>


ページのスクレイピング

<?php
    require_once("simple_html_dom.php");
    $html = str_get_html($html_source);
    
    //この後、$htmlにスクレイピングを実施
?>