1

私がメンバーになっているphpBBフォーラムからいくつかのデータをクロールしたいと思います。ただし、そのためにはログインが必要です。cURLを使用してログインできますが、cURLを使用してログインした後にデータをクロールしようとすると、そのページを表示する前にログインする必要があることが示されます。cURLを使用してログインし、そのセッションを保持してさらに作業を行うことは可能ですか?

もう1つ、そのフォーラムでは通常、ログイン後に確認ページが表示され、5秒後に自動的にインデックスページにリダイレクトされます。そして、cURLを使用してログインすると、スクリプトもそのヘッダーの場所に従い、そのページを表示します。

これの回避策はありますか?

4

2 に答える 2

2

これは通常私のために働くものです


$timeout=5;
$file='cookies.jar';
$this->handle=curl_init('');
curl_setopt($this->handle, CURLOPT_COOKIEFILE,  $file);
curl_setopt($this->handle, CURLOPT_COOKIEJAR,   $file);
curl_setopt($this->handle, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($this->handle, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($this->handle, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($this->handle, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($this->handle, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6 (.NET CLR 3.5.30729)");
curl_setopt($this->handle, CURLOPT_TIMEOUT, round($timeout,0));
curl_setopt($this->handle, CURLOPT_CONNECTTIMEOUT, round($timeout,0));

そして私は一般的にこのようにそれを使用します


$now=grab_first_page();
if(not_logged_in($now)) {
   send_login_info();
}
if(not_logged_in()) { end_of_script_with_error(); }
// rest of script

このようにして、Cookieはセッション間で保持され、スクリプトは何かを実行するたびにログインする必要がありません。

---以下の説明----

オブジェクトを使用していますが、$ this->handleを$mycurlという名前の単純な変数に置き換えることができ、行は次のようになります。


$mycurl=curl_init(''
curl_setopt($mycurl, CURLOPT_COOKIEFILE, $file)

以下のコードは次のとおりです。-「curlインスタンス」を初期化します(単純にするため)(3行目)-4行目と5行目:Cookieをファイルに保存します。Curlはブラウザと同じように機能するため、curlを使用してページにログインすると、認証データを含むCookieがメモリに保持されます。スクリプトを2回実行したときに同じCookieが使用され、再度認証する必要がないように、ファイルに保存するように指示しています。または、同じCookieファイルを使用して複数のスクリプトを作成し、24時間ごとまたはログアウトするたびに実行するログイン用のスクリプトを1つだけ作成することもできます...-その他の設定:* followlocation-curlがhttpリダイレクトを受信すると、リダイレクトされたページであり、リダイレクトコードではありません*useragent-curlはfirefoxとして表示されます*timeout-接続が確立されるまでどのくらいの時間を待つ必要がありますか

私はここで使用する簡単なクラスを置きましたhttp://pastebin.com/Rfpc103X

このように使用できます



// -- initialize curl
$ec=new easyCurl;

// -- set some options
//if the file you are in right now is named file_a.php it will create a file_a.jar cookie file
$ec->start(str_replace('.php','.jar',__FILE__));
$ec->headersPrepare(false);
$ec->prepareTimeOut(20);

$url='http://www.google.com/';

// --- set url
$ec->curlPrepare($url);

// --- get the actual data
$page=$ec->grab();

echo $page;

// to send GET data
$get_data=array('id'=>10);
$ec->curlPrepare($url,$get_data);

// and to post data
$post_data=array('user'=>'blue','password'=>'black');
$ec->curlPrepare($url,array(),$post_data);

POST/GETや私が通常遭遇する他のオプションの設定を自動的に処理します。上記の例がお役に立てば幸いです。幸運を。

于 2010-10-05T14:54:17.920 に答える
0

はい、Cookieを保存する必要があります。これを行うには、ログイン時にCookie jarを作成し、後でフォーラムにアクセスするたびに再利用します。

curl --cookie-jar cjar -d "somelogindata" http://example.com/phpbb/login.php

これにより、cjarCookie jarファイルが作成され、後のリクエストで再利用できます。

curl --cookie-jar cjar --cookie cjar http://example.com/phpbb/viewforum.php?foobar

この--cookie-jarオプションは、Cookieが保存されるファイルを指定します。それらを使用するには、--cookieオプションを使用します。Cookieを更新するには、常に--cookie-jarオプションも提供する必要があります。

于 2010-10-05T14:55:32.273 に答える