phpで外部のサイトにアクセスして様々な情報を取ってきたいときに有効なのがcURL関数。
HTTPリクエストで情報を取るのには、file_get_contentsという関数もあります。以下のようにすることでHTMLを簡単に取得することができます、しかし、リクエストヘッダーを変えたりするなど、リクエスト方法をカスタマイズするには限界があります、そういったカスタマイズを行いたい場合に有用なのがcURLです。しかし、しっかりした情報が少なくて自分が使うの時に苦労したので、様々な使い方をまとめておきます。
<?php
$url = "http://www.yahoo.co.jp/";
$html = file_get_contents($url);
var_dump($html);
以下からcURLの使い方をまとめていきます。
これで、HTMLが出力されます。
<?php
$url = "http://www.yahoo.co.jp/";
$ch = curl_init(); // はじめ
//オプション
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$html = curl_exec($ch);
var_dump($html);
curl_close($ch); //終了
HTTP取得情報を確認する
<?php
$url = "http://www.yahoo.co.jp/";
$ch = curl_init(); // はじめ
//オプション
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$info = curl_getinfo($ch);//この関数で取得
curl_close($ch); //終了
var_dump($info);
>>
array(22) {
["url"]=>
string(23) "http://www.yahoo.co.jp/"
["content_type"]=>
NULL
["http_code"]=>
int(0)
["header_size"]=>
int(0)
["request_size"]=>
int(0)
["filetime"]=>
int(0)
["ssl_verify_result"]=>
int(0)
["redirect_count"]=>
int(0)
["total_time"]=>
float(0)
["namelookup_time"]=>
float(0)
["connect_time"]=>
float(0)
["pretransfer_time"]=>
float(0)
["size_upload"]=>
float(0)
["size_download"]=>
float(0)
["speed_download"]=>
float(0)
["speed_upload"]=>
float(0)
["download_content_length"]=>
float(-1)
["upload_content_length"]=>
float(-1)
["starttransfer_time"]=>
float(0)
["redirect_time"]=>
float(0)
["certinfo"]=>
array(0) {
}
["redirect_url"]=>
string(0) ""
}
よく使うオプション
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);//変数に保存する
curl_setopt($ch, CURLOPT_HEADER, true); // ヘッダも出力したい場合
proxy接続を行う
curl_setopt($ch, CURLOPT_PROXYPORT, 3128);//アクセスポート
curl_setopt($ch, CURLOPT_PROXY, "192.168.0.1");//IPアドレスかURL
POST送信
<?php
//postするデータの配列
$post_data = array('id' => "id" ,'password'=> "pass" ,"mode"=>"login");
curl_setopt($ch,CURLOPT_POST, true);
//データの配列を設定する
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data));
Cookieを扱う
<?php
// Cookie情報を保存する一時ファイルディレクトリにファイルを作成します
$tmp_path = tempnam(sys_get_temp_dir(), "CKI");
//postするデータの配列
$account_data = array('id' => "id" ,'password'=> "pass" ,"mode"=>"login");
$url = "http://www.pixiv.net/login.php";
$ch = curl_init(); // はじめ
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//POST送信
curl_setopt($ch,CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($account_data));
//Cookie受信
//cookieオプション
curl_setopt($ch,CURLOPT_COOKIEFILE,$tmp_path);
curl_setopt($ch, CURLOPT_COOKIEJAR, $tmp_path);
curl_exec($ch);//実行
curl_close($ch); //終了
$url = "http://www.pixiv.net/mypage.php";
$ch = curl_init(); // はじめ
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//Cookie送信
//cookieオプション
curl_setopt($ch,CURLOPT_COOKIEFILE,$tmp_path);
curl_setopt($ch, CURLOPT_COOKIEJAR, $tmp_path);
$html = curl_exec($ch);//実行
curl_close($ch);
var_dump($html);
//一時ファイル削除
unlink($tmp_path);
リクエストヘッダーを付加する
<?php
$headers = array(
"HTTP/1.0",
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Encoding:gzip ,deflate",
"Accept-Language:ja,en-us;q=0.7,en;q=0.3",
"Connection:keep-alive",
"User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:26.0) Gecko/20100101 Firefox/26.0"
);
$url = "http://www.ugtop.com/spill.shtml";
$ch = curl_init(); // はじめ
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//ヘッダー追加オプション
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$html = curl_exec($ch);
$html = mb_convert_encoding($html,"UTF-8","EUC-JP");
var_dump($html);
curl_close($ch); //終了
とりあえず、基本的な部分はまとめられたかと思います。
まだ様々なオプションがありますが、紹介しきれないのでいかに参考になりそうなURLを張っておきます。
公式マニュアル
http://php.net/manual/ja/book.curl.php
オプション一覧
http://jp2.php.net/curl_setopt
cURLのラッパークラスを作ってくださっている
http://qiita.com/mpyw/items/c65fb4ec4cef80909a47
CURLのセッションを引き継ぐ方法:PHPプロの記事
http://www.phppro.jp/phptips/archives/vol16/3