検索したものに少し手を加えて、以下の関数を使って、URLを元にウェブページのタイトルを取得しています。
function getPageTitle( $url ) {
$html = file_get_contents($url);
$enc_format = "JIS, eucjp-win, sjis-win, UTF-8";
$html = mb_convert_encoding($html, "UTF-8", $enc_format);
preg_match("/<title>(.*)<\/title>/is", $html, $retArr);
return $retArr[1];
}
しかし、ページによってはタイトルを取得するまでの時間が遅いです。おそらく、HTMLをすべて読み取るまで、終了しないため、遅くなるのだと思います。今回はタイトルを取りたいだけなので、もっと早く処理ができてほしいです。何か方法はございますか?
No.2ベストアンサー
- 回答日時:
まずは
$html = file_get_contents($url);
を
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$html = curl_exec($ch);
に変えるところからどうぞ。これだけでかなり速くなると思います。これで速度が足りなければ fopen で1行ずつ読み込んでいくことも検討しましょう。なお、提示された関数中の文字コードの羅列順序が不適切です(私もググって出てきたってことで以前はこれ使ってましたが、誤りです)。以下に正しい順番に直したサンプルを掲載しておきます。
function getPageTitle($url) {
static $regex = '@<title>([^<]++)</title>@i';
static $order = 'ASCII,JIS,UTF-8,CP51932,SJIS-win';
static $ch;
if (!$ch) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
}
curl_setopt($ch, CURLOPT_URL, $url);
$html = mb_convert_encoding(curl_exec($ch), 'UTF-8', $order);
return preg_match($regex, $html, $m) ? $m[1] : '';
}
また、そもそも遅い原因が「この関数の実行を繰り返している」ということであれば、今はオーダー表現で表せば O(n) 時間かかっていることになりますが、回線が許す限り O(1) の実行時間にする方法があります。これに該当する場合はその点の補足をお願いします。
この回答への補足
ご回答有難うございます!
一行ずつ読み取る考えは思い浮かびませんでした。<title></title>が一行に収まってることが前提じゃないと処理が少し複雑なるかも知れませんが。
適切なコードまで、載せていただき感謝しています。これから実行してみます!
No.1
- 回答日時:
>HTMLをすべて読み取るまで、終了しないため、遅くなるのだと思います。
それはhttpの仕組み上そういうものでは?
複数ページクロールするのならwgetあたりで非同期にバックグラウンド処理をさせるとか
タイトルを持ってくる部分をタイトルを抜くだけのPHPをajaxで走らせれば
速いところから順次うまっていくので、感覚的に速いと思えるようになるかもしれません。
また更新時間などを保存しておき、2回目以降の検索時にはヘッダ情報の日付けを
見るなりして、変更がなけば前回のデータを利用するなど
それなりの処理をすればある程度実用レベルのスピードになるのでは?
この回答への補足
そういった方法しかないのですか。今のところURLを先に表示しておいて、決まったら、URLをタイトルに書き直すようにはしてみましたが。
ブラウザだと、ページが完全に読み終わる前に、タイトルが表示されるので、何か方法があるかと思いました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) python 気象データの取得 2 2023/06/20 23:54
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- JavaScript ソースコードのいじる場所が分かりません。 1 2022/12/23 02:06
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- HTML・CSS CSSが上手く反映されないみたいです 2 2022/11/21 16:19
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- PHP PHP MySql 画像を取得 1 2022/06/04 14:05
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- MySQL php テーブルを作れない 2 2022/11/17 18:22
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
変数にHTMLを代入する場合
-
HTMLファイルの書き換え
-
正規表現でタグの置換をしたい...
-
強制ジャンプを中止したいです。
-
VBSでのhtmlタグ要素名の置換
-
PHPの正規表現でHTMLタグの内容...
-
htmlでflashを開く、画面サイズ...
-
str_get_htmlがこける原因を知...
-
print "<img src=\\"0.jpg\\/>\...
-
HTMLタグの読み方辞典
-
Struts/JSTL 以外のタグライブラリ
-
スクレイピングの仕方
-
VBAのコマンドボタンの文字列の...
-
ソースコードの1行が長いとき...
-
文字列の括弧について(初心者)
-
文字の入力で横バー上段、中断...
-
ファイルから読み取った改行文...
-
メッセージボックスで1025文字...
-
エスケープ文字の復帰(¥r)と...
-
全角括弧と全角読点の間隔を狭...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
reuterの記事をbeautiful.soup....
-
変数にHTMLを代入する場合
-
Nvuで作成したhtmlをコピペして...
-
srcに「banner.」で始まるファ...
-
[php][正規表現]タグ以外を削除...
-
PHPの正規表現でHTMLタグの内容...
-
htmlでflashを開く、画面サイズ...
-
csobjというタグについて
-
正規表現でHTMLタグの属性まで...
-
正規表現でタグの置換をしたい...
-
HTMLファイルの書き換え
-
★PHP★フォーム登録時にタグを読...
-
PHP4→5にアップグレードしたら...
-
オリジナルタグをHTMLタグに置...
-
print "<img src=\\"0.jpg\\/>\...
-
Strutsでリンクを動的に生成したい
-
正規表現で複数行に渡る範囲を...
-
PHP Webページのタイトルを取得...
-
リッチテキストエディターでの...
-
MP3のコメントタグやSYLTの詳細
おすすめ情報