#b-navbar { height:0px; display:none; visibility:hidden; }

ページ

2015年5月3日日曜日

PHP:スクレイピングを簡単に行う関数

<?php
/* 利用例:sample

  $val = fetch_val_from_URL_ver3 (
   "http://www.yahoo.com/",
   "/lang=\"([\s\S]+?)\"/i"
  );

     print_r ( $val ) ; //en-US
     print "<br />";



  $array= fetch_val_from_URL_ver3 (
   "",
   "/lang=\"([\w\-]+?)\"[\s\S]+?<title>([\s\S]+?)<\/title>/i"
  );

     print_r ( $array ) ; //Array ( [0] => [1] => en-US [2] => Yahoo )
     print "<br />";



*/


function fetch_val_from_URL_ver3 ( $CRON_URL , $REGEX_val  ) {

/*

★メモ:
 ・日本語を正規表現に含む場合は、UTF8でコードを書いて下さい。
    それ以外は、関数の中のUTF-8に統一している箇所を修正してください。

 ・改行コードは正規表現が面倒になるので取得後に、一律削除しています。


★引数;

 ・CRON_URL は"http://~"からいれてください。
 ・CRON_URL を 空欄"" にすると、前回呼び出したHTMLを再利用します。
  ※ そのため、 $fv_global_html はグローバル変数名です。
 
 ・REGEX_val は正規表現です。
   日本語を正規表現に含む場合は、UTF8で表現式を書いて下さい。
 
 
★返り値:

 ・REGEX_val の正規表現で、(かっこ) で囲った表現部分を抽出して、値または配列を返します。
 
 ・REGEX_val の (かっこ)が1個の時は、値を返します。2個以上の時は、配列を返します。
 
 
 
★バグシューティング:

 ・関数を記述しているPHPファイル は UTF-8 ですか? (スクレイプの対象ページの文字コードは関係ありません。
  関数の中の mb_convert_encoding 処理で UTF8 に固定処理をしているからです。
  もしこの関数を、UTF-8以外のスクリプトで記述する場合は、関数内のmb_convert_encoding部分を修正して下さい )
 
 ・正規表現は正しいですか? regexpal.com が便利ですよ。
 ・正規表現に、タグの </ があるときは 「<\/」にエスケープしてください
 ・この関数内で、$fv_global_html という変数名をグローバルとして利用しています。

★ヒント

 ・相手先のサーバーのためにも、同じページを何度も呼ばないようにしましょう。
   CRON_URLを 空欄""にすると、前回呼び出した時のHTMLを再利用できます。
 
 ・改行を含む任意の一文字は [\s\S] 、 数値は ([\-\d\.\,]+?) を使うといいでしょう。
 
 ・UserAgentを変えるとこともできます

★その他

 ・無保証で無責任です。目的にかかわらず、自由に改変して利用できます。
  クレジット表記や、連絡は不要です。
 
 ・バグ等のご連絡 は、sakai[-_atmark_-]quel.jp へ
 ・Programmed by Hiroyuki.Sakai, Infolio,inc.

*/


 //設定 
 global $fv_global_html;
 $flg_ReUse_contents = false;
 unset($ary_match);
 
 //取得
 if ( $CRON_URL == "" ) {//urlがヌルの時は ReUse_contents をtrueに
   $flg_ReUse_contents = true;
 }
 
 if ( $flg_ReUse_contents == true ) {
  
  //$fv_global_htmlはそのまま再利用
  if ( $fv_global_html =="" ) {//空かどうかのチェックだけ行う
   print "No data URL:E:001 $CRON_URL ";
   print "<br /> " ;
   return false ;
  }
  
  
 }else {
  //新規取得
  
   //接続準備
   $options = array(
    'http' => array(
     'method' => 'GET',
     'header' => 'User-Agent: Mozilla/5.0 ( PHP fetch-val-from-URL-ver3 ) ',
    ),
   );
   $context = stream_context_create($options);

   //取得
   $fv_global_html = file_get_contents( $CRON_URL, false, $context);
   $fv_global_html = str_replace ("\r\n","\n",$fv_global_html);
   $fv_global_html = str_replace ("\r","\n",$fv_global_html);
   
   //UTF8に統一する
   $fv_global_html = mb_convert_encoding ($fv_global_html,"UTF-8",mb_detect_encoding($fv_global_html));
   
   unset ( $context ) ;
   
 }
 
 
 //改行は正規表現が面倒になるので一律削除 (このブロックが不要であればコメントアウトしてください)
 $fv_global_html =  str_replace("\r","",$fv_global_html ) ;
 $fv_global_html =  str_replace("\n","",$fv_global_html) ;
 
  
 //抽出
 preg_match( $REGEX_val , $fv_global_html ,$ary_match );
 
 
 //マッチがないとき
 if ( isset($ary_match[1]) ) {
   
 } else {
  $val = "" ;
  print "Nomatch E:003 <br />$REGEX_val<br />in $CRON_URL ";
  print "<br /> " ;
  return false ;
  
 }
 
 //数字ならばカンマ削除
 $ary_match = array_map (  function ( $vn ) {
  
  if ( preg_match("/[\d\.\,\/\s]+?/", $vn) ) {
   return str_replace ( "," , "" , $vn ) ;
  }else {
   return $vn ;
  }
  
 } , $ary_match  );
 
 
 //配列か変数値を返す
 if ( count($ary_match) == 2 ) {
  
  return $ary_match[1];
  
 }else {
  
  $ary_match[0]=NULL;
  return $ary_match;
  
 }
 

}




?>


Search Keyword: php, function, scraping , scraper class

0 件のコメント:

コメントを投稿