閲覧にcookieが必須なページの取得

今日も今日とてHTMLScrapingです。


応用編として、閲覧にcookieが必須なサイトのデータを取得してみます。

HTMLScrapingには、pearのHTTP/Requestが同梱されていて、これを使ってデータを取得しています。
HTTP/RequestはCookieに対応しているので、適切にこれを使いこなせばOKみたいです。


▽Manual:: HTTP_Request
 http://pear.php.net/manual/ja/package.http.http-request.php



以下のページがとても具体的で素晴らしい。

▽HTTP_Requestでアクセスする セッション編(Nega Diary)
 http://www.ironhearts.com/diary/archives/001397.html


以下、順に読み解いていく。


example.comの内容を取得する。

$req = new HTTP_Request("http://example.com/");

「メソッドがPOSTかGETかを指定するためにsetMethodメソッドで指定」している。
「POSTデータとかGETデータとか送りたいときは、addPostdataメソッドで送る」
この前提として必要らしい。私は今回使わないので省く。

$req->setMethod(HTTP_REQUEST_METHOD_GET);


エラーがなければ、HTTP レスポンスからクッキーを読み込む。それで、変数cookieにつっこむ。

if (!PEAR::isError($req->sendRequest())) {
$cookie = $req->getResponseCookies();


Cookieが必要なページにアクセスする。

$req = new HTTP_Request("http://example.com/Login");


リクエストにクッキーを追加する

$req->addCookie($cookie[0]['name'],$cookie[0]['value']);


cookieをprint_rして、どういう状態で格納されているか確認します。
配列の状態でcookieのnameとvalueが格納されているから、とりあえず1行に1つの添え字を指定して、添え字分行数を増やせば取りあえずOK。


ちゃんとやるなら発行されたcookieのうちどれが必要不可欠が切り分けないとですね。
ただそこまでやる意味はないだろうなぁ……(あるのかなぁ?)


以上で、HTTP/Requestのcookieの読み込みと追加はOK。





次にHTMLScrapingが、HTTP/Requestを使う際にcookieを追加してリクエストする用に設定します。

getXmlObject ( string $url [, integer $cache_lifetime [, boolean $conditional_request [, array $headers [, array $post]]]] )


▽HTMLScraping->getXmlObject()
 (HTMLScraping Class ReadMe)
 http://www.rcdtokyo.com/etc/htmlscraping/#GETXMLOBJECT


$xml = $s->getXmlObject($url);
を、
$xml = $s->getXmlObject('http://www.example.org/', 3600, false, $headers);
に。3600秒キャッシュ、Last-Modified/Etagヘッダによるキャッシュ更新をしない、HTTPヘッダを連想配列に納めた変数をオプションで指定します。


その上で、$headersにCookieを指定することになります。


Cookie: NAME1=OPAQUE_STRING1; NAME2=OPAQUE_STRING2; ...

▽[Studying HTTP] HTTP Cookies
 http://www.studyinghttp.net/cookies


Cookie仕様 日本語訳 - futomi's CGI Cafe
 http://www.futomi.com/lecture/cookie/specification.html


$headers = array(
'Cookie' => "$cookie[0]['name']=$cookie[0]['value']; $cookie[1]['name']=$cookie[1]['value']; $cookie[2]['name']=$cookie[2]['value']; $cookie[3]['name']=$cookie[3]['value']; $cookie[4]['name']=$cookie[4]['value']; $cookie[5]['name']=$cookie[5]['value'];"
);


と書くと、

Array
(
[Cookie] => Array['name']=Array['value']; Array['name']=Array['value']; Array['name']=Array['value']; Array['name']=Array['value']; Array['name']=Array['value']; Array['name']=Array['value']
)


となってしまいます。


そこで面倒ですが、

$cookie0name = $cookie[0]['name'];
$cookie0value = $cookie[0]['value'];
$cookie1name = $cookie[1]['name'];
$cookie1value = $cookie[1]['value'];
$cookie2name = $cookie[2]['name'];
$cookie2value = $cookie[2]['value'];
$cookie3name = $cookie[3]['name'];
$cookie3value = $cookie[3]['value'];
$cookie4name = $cookie[4]['name'];
$cookie4value = $cookie[4]['value'];
$cookie5name = $cookie[5]['name'];
$cookie5value = $cookie[5]['value'];

$headers = array(
'Cookie' => "$cookie0name=$cookie0value; $cookie1name=$cookie1value; $cookie2name=$cookie2value; $cookie3name=$cookie3value; $cookie4name=$cookie4value; $cookie5name=$cookie5value;"
);


と書きました。面倒ですが、もう少しマシな書き方があるんでしょうね、多分(^^;


これで無事リクエストにcookieが追加され、XMLに変換することができました。
あとはいつもの手順でRSSに変換するだけです(^_^)