人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

画像掲示板中の画像をPHPを使用して一括で保存するコードを教えてください。

掲示板中に複数の画像が掲載されています。
画像のサムネイルをクリックすると直接画像を表示するのではなく、その画像を原寸大表示しているhtmlへ転送します。

1:掲示板のアドレス例:a.bbb.com/thread/dfg.html
2:画像のサムネイルをクリックしたとき表示されるページのアドレス例:a.bbb.com/thread/picture/jy3hfa.html
3:画像ファイルそのもののアドレス例:h.bbb.com/y23fcd.8i2jpg?7c2(最後の/以下は?や.も含む文字列)

1のページにあるリンクのうち、URLに"picture"を含むものは2のページのみです。(トップページや1のページには含まれない。)
href="./thread/picture/jy3hfa.html"という形式になっています。

2のページ中のリンクのうち、URLに"h.bbb.com"を含むのは3の画像ファイルのみです。(画像ファイル本体のみサブドメインが異なる)

すべての画像ファイルをフォルダに一括保存するPHPのコードを教えてください。
よろしくお願いします。

●質問者: holoholobird
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● Cherenkov
●200ポイント ベストアンサー

うーん。一応動いてると思います。
urlをコマンドラインで渡すとかフォームからとか変える余地あるけど取り敢えず。

<?php
function p($msg) { 
echo $msg.PHP_EOL; 
}
function pr($var) {
echo '<pre>'; print_r($var); echo '</pre>';
}

set_time_limit(0);

//mb_convert_encodingの第3引数をautoで使う場合に必要。
mb_language("Japanese");

$urls = array('http://imgb1.ziyu.net/bbs/nendoro2/index.cgi');

$pUrl = parse_url($urls[0]);
$baseUrl = $pUrl['scheme'] . '://' . $pUrl['host'];

preg_match('/\/bbs\/([^\/]+)/', $pUrl['path'], $siteId);
$siteId = $siteId[1];
$baseBBSUrl = "$baseUrl/bbs/$siteId";

$newUrls = getPageUrls($urls[0]);
$urls += $newUrls;

foreach ($urls as $url) {
$html = mb_convert_encoding(file_get_contents($url), 'UTF-8', 'auto');
preg_match_all('/href="(\/view\/.+?)"/im', $html, $imgPaths);
$imgPaths = $imgPaths[1];
foreach ($imgPaths as $path) {
$imgUrl = getImgUrl($baseUrl . $path);
saveImg($imgUrl);
}
//sleep(3);
}
p('complete!');

function getPageUrls($url) {
$html = mb_convert_encoding(file_get_contents($url), 'UTF-8', 'auto');
preg_match_all('/\[<a href="(index\.cgi\?page=\d+)/im', $html, $urls);
$urls = $urls[1];
$urls = array_map(function($path) {
global $baseBBSUrl;
return $baseBBSUrl . '/' . $path;
}, $urls);
return $urls;
}
function getImgUrl($url) {
global $baseUrl;
$html = mb_convert_encoding(file_get_contents($url), 'UTF-8', 'auto');
preg_match("/<img src='(.+?)'/im", $html, $imgUrl);
return $baseUrl . $imgUrl[1];
}
function saveImg($url) {
$fileName = basename($url);
$data = file_get_contents($url);
$imgDir = './download/';
if (file_exists($imgDir) || mkdir($imgDir)) {
if ($data && file_put_contents($imgDir . $fileName, $data)) {
p('success!');
} else {
p('retry!');
saveImg($url);
}
}
}

Cherenkovさんのコメント
動作テストは適当に見つけた、画像の少ない http://imgb1.ziyu.net/bbs/lelouch/index.cgi を使った。

Cherenkovさんのコメント
saveImg関数だけretryするようにしてるけど他のfile_get_contentsするところもやったほうがよさげ
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ