閲覧に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");
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に変換するだけです(^_^)