Webサイトの内容をコピーして画像のリンクを絶対リンクに修正する

PHP

Webサイトの内容をコピーして画像のリンクを絶対リンクに修正する

Webサイト作成の現場では、よく既存のWebサイトから、CMSにコピーして移行したり、違うデザインに移行したり、違う構造に移行したいということがあると思います。

大量のコンテンツがある場合、手でコピーして移行するのはなかなか難しいですよね。

しかも、画像ファイルが相対リンクだったりすると、手作業でやるのは泣きそうになります。
というわけで、今回PHPを利用した、移行用のスクリプトを作ってみました。
あまりうまく書けているわけではありませんが、また利用するときのために、書いておきます。適当に自分の環境に合う形に変えてください。

  1. 移行するサイトのページURLを、あらかじめテキストファイルに一行ずつ書きだしておき、url.txtとして保存します。
  2. 今回は、データベースへインポートする目的があって、一サイトずつCSVファイルに一行ずつ書き込みます。output.csvというファイルに書き出します。(書き込み権限があれば作っておかなくてもOKです。)
  3. 相対リンクで記載している画像を絶対リンクに書き換えます。今回のサイトは、3階層以上ないという前提です。(この辺りは環境に合わせて、適当に書き換えてください。)
  4. ちなみにWebサイトのコンテンツをコピーすることをスクレイピングと言います。人さまが作った大量のサイトも一瞬でコピーできますが、悪い目的で使うのは絶対にやめましょう!
  5. ~の間を抜きます。
 <?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);
 ?>

CMS移行時に大量コンテンツのコピーでお悩みですか?ご相談ください。

カテゴリーPHP

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です