PHPプロ!TIPS+

PEAR::HTTP_Clientでサイトの内容取得

他のサイトの内容を取得したいと思ったことはありませんか?PHPで他のサイトの内容を取得する方法はいくつかあります。file_get_contents()を使ったりfsockopen()を使ったりcurlを使ったり。今回はその中からPEARで提供されているPEAR::HTTP_Clientを紹介したいと思います。

このPEAR::HTTP_ClientはHTTP_Requestをラップしたクラスなので、依存しているパッケージがいくつかあります。インストールするときには

pear install --alldeps HTTP_Client

上記のように--alldepsオプションを用いて依存関係にあるパッケージも一緒にインストールすると便利です。

では早速他のサイトの内容を取得してみましょう。ターゲットになるサイトはmixiです。mixiとはもう説明するまでもありませんが、ソーシャルネットワーキングサイトの一つで国内では圧倒的な規模と人気を誇ります。今回はこのmixiにPEAR::HTTP_Clientを使ってアクセスし、マイミクシィ最新日記を取得してみましょう。

下記のスクリプトがそれになります。

<?php
require_once "HTTP/Client.php";

$email "メールアドレス";
$password "パスワード";

$login_params array("next_url" => "/home.pl""email" => $email,
"password" => $password);

$login_url "http://mixi.jp/login.pl";
$new_friend_diary_url "http://mixi.jp/new_friend_diary.pl";

$client =& new HTTP_Client();
$client->post($login_url$login_params);
$client->get($new_friend_diary_url);

$response $client->currentResponse();
preg_match_all("/<td WIDTH=180><img.*?>(.*)<\/td>/"$response['body'],
$date_matches);
preg_match_all("/<td WIDTH=450>(.*)/"$response['body'], $title_matches);

$title "";
foreach (
$title_matches[1] as $key => $value) {
  
$value preg_replace("/view_diary.pl/",
"http://mixi.jp/view_diary.pl"$value);
  
$title .= '<dt>'.$date_matches[1][$key].'</dt><dd>'.$value.'</dd>';
}

print(
'<dl>'.$title.'</dl>');

?>

$emailと$passwordの部分には自身のものをそれぞれ入力してください。実行するとマイミクシィ最新日記が表示されます。

スクリプトの流れを説明すると、まずHTTP_Clientのインスタンスを作成します。次にpost()メソッドでログイン画面のURLとクエリを送信します。次にget()メソッドを使用してマイミクシィ最新日記のURLに飛びcurrentResponse()メソッドでサイトの内容を取得します。後はこの内容をパースして日付とタイトルを取得し表示しています。

以上のように、PEAR::HTTP_Clientを使うと手軽にサイトの内容を取得することができます。この他にもpost()メソッドの第4引数にファイル名等を指定するとファイルのアップロード処理やクッキーのストア、HTTPリダイレクト、リファラの設定等様々なことができます。興味のある方はぜひ使ってみてはいかがでしょ うか。

PEAR::HTTP_Client http://pear.php.net/package/HTTP_Client/

mixi http://mixi.jp/

バックナンバーについて

TIPS-MLは、毎週金曜日に更新され、新しい記事が掲載されます。

Tipsꗗy[W 

Pick Up Q&A

Q
PHPのHTML埋め込み記述について
 このエントリーをはてなブックマークに追加 
A
$_POST["data"] == "男" ? $val = "checked" : $val = "" ; の意味は以下と同じです。 if($_POST["data"] == "男"){ $val = "checked; } e...

>>続きを読む

kende様のご指摘通り、三項演算子を使用する際には、コードの複雑度などを考慮する必要がありますね。書きやすさと共に可読性も追求したいところですね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)