Webサイトの内容をコピーして画像のリンクを絶対リンクに修正する
Webサイト作成の現場では、よく既存のWebサイトから、CMSにコピーして移行したり、違うデザインに移行したり、違う構造に移行したいということがあると思います。
大量のコンテンツがある場合、手でコピーして移行するのはなかなか難しいですよね。
しかも、画像ファイルが相対リンクだったりすると、手作業でやるのは泣きそうになります。
というわけで、今回PHPを利用した、移行用のスクリプトを作ってみました。
あまりうまく書けているわけではありませんが、また利用するときのために、書いておきます。適当に自分の環境に合う形に変えてください。
- 移行するサイトのページURLを、あらかじめテキストファイルに一行ずつ書きだしておき、url.txtとして保存します。
- 今回は、データベースへインポートする目的があって、一サイトずつCSVファイルに一行ずつ書き込みます。output.csvというファイルに書き出します。(書き込み権限があれば作っておかなくてもOKです。)
- 相対リンクで記載している画像を絶対リンクに書き換えます。今回のサイトは、3階層以上ないという前提です。(この辺りは環境に合わせて、適当に書き換えてください。)
- ちなみにWebサイトのコンテンツをコピーすることをスクレイピングと言います。人さまが作った大量のサイトも一瞬でコピーできますが、悪い目的で使うのは絶対にやめましょう!
- ~の間を抜きます。
<?php $fh=fopen('url.txt','r'); $fi=fopen('output.csv','w'); for($line=fgets($fh); ! feof($fh); $line=fgets($fh)){ $line=trim($line); //URLの内容をスクレイピング $contents= file_get_contents($line); //3階層上までのURLを整形しておきます 画像のパスを絶対リンクに変更するために利用します $current_dir=strripos($line, '/'); $url_current_dir=substr($line, 0, $current_dir); $one_above=strripos($url_current_dir, '/'); $url_one_above_dir=substr($url_current_dir, 0, $one_above); $two_above=strripos($url_one_above_dir, '/'); $url_two_above_dir=substr($url_one_above_dir, 0, $two_above); //画像のパスだけ抜き取る $pattern = "/src=[\"']?([^\"']?.*(png|jpg|gif))[\"']?/i"; //画像のパスを相対URLを絶対URLに書き換えます。 if(preg_match_all($pattern, $contents, $matches)){ foreach($matches[1] as $match){ if(preg_match('/\.\.\/\.\.\//',$match)){ $replaced_src=preg_replace('/\.\.\//',$url_two_above_dir.'/',$match); $contents = str_replace($match,$replaced_src,$contents); }elseif(preg_match('/\.\.\//',$match)){ $replaced_src=preg_replace('/\.\.\//',$url_one_above_dir.'/',$match); $contents = str_replace($match,$replaced_src,$contents); }elseif($match){ $replaced_src = $url_current_dir.'/'.$match; $contents = str_replace($match,$replaced_src,$contents); } } } $start=strpos($contents, '<BODY>'); $end=strpos($contents, '</BODY>'); //ブラウザで確認できます。 print $output = substr($contents, $start+6, $end-$start); $output = str_replace("\n","",$output); fwrite($fi, "$output\n"); } fclose($fh); ?>