続・PHPでWebページ上の画像ファイルをすべて保存する
2017-12-28一年以上前に同じようなことを書いてますが、その続編です。
今みると、このままでは動かないようなソースで残念です。
やることは変わってなくて、諸々考慮したバージョンです。 ソースは GitHub に置いています。 michimani/get-all-image
直したところ
コマンドラインで使えるようにした
前回は関数として作っていたので、その関数を呼ぶスクリプト書かないと使えませんでした。 今回はコマンドラインで使えるようにしたので ターミナルで
$ php get_all_image.php http://example.com
を叩くだけです。
Macなら買ってきた状態でphpコマンドが叩けるので、上のリンクからダウンロードしてすぐ使えます。Windowsのことはちょっとわかりません。
引数のチェックを入れた
前回は引数として受け取るURLのチェックとかは一切していませんでした。
今回はコマンドライン引数としてURLを受け取る様になっているので、そのチェックをしています。
<?php
if (!isset($argv[1]))
{
throw new Exception('The first argument is required for url.');
}
$url = $argv[1];
if (!preg_match('/^(http|https):\/\//', $url))
{
throw new Exception('Invalid url.');
}
$header = @get_headers($url);
if (!preg_match('/^HTTP\/.*\s+200\s/i', $header[0]))
{
throw new Exception('Target page does not found.');
}
画像リンクが http(s) から始まっていないパターンの対応
画像リンクには src="http://~"
のパターンと src="/img/~"
みたいにドメイン以下のパスが書いてあるパターンがあるので、その対応です。
<?php
$base_tmp = explode('/', $url);
$base = sprintf('%s/%s/%s', $base_tmp[0], $base_tmp[1], $base_tmp[2]);
//...
if (!preg_match('/^https?:\/\//', $img_url))
{
$img_url = sprintf('%s/%s', $base, $img_url);
}
comments powered by Disqus