123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429
|
<?php // +----------------------------------------------------------------------+ // | html Parser | // +----------------------------------------------------------------------+ // | PHP Version 4.5 | // +----------------------------------------------------------------------+ // | Copyright (c) 2002-2007 The Artisan Member | // +----------------------------------------------------------------------+ // | Authors: Akito<akito-artisan@five-foxes.com> | // +----------------------------------------------------------------------+ // /** * Google検索して、検索結果を切り出しています。 * * 本来こう言う事やりたい時は、SOAPサービスとか使用するんでしょうが、テストと言うことで・・・ * html Parserの使い方のサンプルと言うより、scrapeのサンプルですね。 * html Parserの使い方のサンプルは、scrapeになる感じで。 * 今回は、Googleの検索結果と言うことで、ちょっとややこしくなってしまっていますが、 * ブログ等、idやclassでしっかり分けられた、HTMLを分解するなら、もっと楽に書けそうです。 * * googleには他にも、辞書機能や、乗り換え機能など色々ありますが、 * 今回は、「google電卓」と、「もしかして」のみとなっております。。 * */
// ライブラリを読む require_once("./hp/scrape.php");
// URL精製用にファイル名を取得する $this_fname = basename(__FILE__);
/** * googleさんが精製したUTF8のURLをEUC-JPにする * * @param string $url 変換したいURL * @return string */ function replace_url($url) { global $this_fname; if (ereg("^/search", $url)) { $parse_url = parse_url($url); if (isset($parse_url["query"])) { parse_str($parse_url["query"], $parse_url["query"]); if (isset($parse_url["query"]["ie"]) ? $parse_url["query"]["ie"] == "UTF-8" : false) { $parse_url["query"]["ie"] = "EUC-JP"; $parse_url["query"]["q"] = mb_convert_encoding($parse_url["query"]["q"], "EUC-JP", "UTF-8"); } $url = ""; reset($parse_url["query"]); $gc = each($parse_url["query"]); $gc[1] = urlencode($gc[1]); $url = "{$parse_url['path']}?{$gc[0]}={$gc[1]}"; while ($gc = each($parse_url["query"])) { $gc[1] = urlencode($gc[1]); $url .= "&{$gc[0]}={$gc[1]}"; } } return ereg_replace("^/search", $this_fname, $url); } else { return $url; } }
/** * GET優先で、フォーム値を取得する * * @param string $var_name name属性 * @param mixed $no_var 値が来ない場合に返す値(OPTIONAL) * @return string */ function form_var($var_name, $no_var = FALSE) { if (isset($_GET[$var_name])) { $res = $_GET[$var_name]; } elseif(isset($_POST[$var_name])) { $res = $_POST[$var_name]; } else { $res = $no_var; } return $res; }
/** * 文字入力フォームを出力する * * @param string $name name属性 * @param string $value value属性 (OPTIONAL) * @param string $attribute その他属性 (OPTIONAL) * @return string */ function form_text($name, $value = false, $attribute = "") { $text = '<input type="text" name="'.htmlspecialchars($name).'"'; if (!$value) { $value = form_var($name); } if ($value) { $text .= ' value="'.htmlspecialchars($value).'"'; } $text .= " ".$attribute.">"; return $text; }
//検索のタイプを決定(拡張用:未使用) $type = form_var("type", "flowers");
//内容 $text = form_var("text"); if ($text == false) { $text = form_var("q"); }
// 文字数制限 if ($text != false) { $text = trim(mb_substr($text, 0, 255)); }
$lr = form_var("lr", ""); $str = form_var("start", 0);
if(!ereg('[0-9]', $str)){ $str = 0; }
?> <html> <head> <title>てきとう検索 <?php if ($text) { echo " - ".$text; } ?>
</title> </head> <style><!-- .a,.a:link{color:green} --></style> <body> <H2>てきとう検索</H2> <form action="./tsearch.php"> <a href="./tsearch.php">←</a><?php echo form_text("text",$text,$attribute='size="40" maxlength="255"'); ?><input type="submit" value="検索"> <BR> <input type="hidden" name="type" value="flowers"> <input type="radio" name="lr" value="" <? if($lr!="lang_ja"){ ?>checked<? } ?> id="allh"><label for="allh">すべてのwebページから</label> <input type="radio" name="lr" value="lang_ja" <? if($lr=="lang_ja"){ ?>checked<? } ?> id="jah"><label for="jah">日本語ページのみ</label> <input type="hidden" name="_flow" value="◇◆もじばけぼうし◇◆"> </form> <?php
if ($text) { // google検索処理 $t = array_sum(explode(" ", microtime())); // google問い合わせクエリを作成 $url_text = urlencode($text); $url = 'http://www.google.co.jp/search?hl=ja&inlang=ja&ie=EUC-JP&oe=EUC-JP&lr='.$lr.'&q='.$url_text.'&start='.$str; $google = @file_get_contents($url); if (!$google) { ?> <font color="red">Googleへの問い合わせに失敗しました。<br />処理を中断新ます</font> </body> </html> <?php die(); } // 文字コード変更 $google = mb_convert_encoding($google, "EUC-JP", "auto"); // 取得文字数取得 $contents_lenb = mb_strwidth($google); // 分解クラス精製 $scrape =& new scrape(); // 検索結果の取得 $scrape->setProcess("a", HP_SCRAPE_OPTIONS, array("class" => "l"), HP_SCRAPE_WHEREMODE_TEXT, array("url" => "href") ); $scrape->setProcess("a", HP_SCRAPE_CONTENTS_TEXT, array("class" => "l")); // 関連検索 $scrape->setProcess("a", HP_SCRAPE_OPTIONS, array( "href" => "^/search.*suggest.*$" ), HP_SCRAPE_WHEREMODE_EREG, array("url" => "href") ); $scrape->setProcess("a", HP_SCRAPE_CONTENTS_TEXT, array( "href" => "^/search.*suggest.*$" ), HP_SCRAPE_WHEREMODE_EREG, array("url" => "href") );
// 次へのリンク $scrape->setProcess("a", HP_SCRAPE_OPTIONS, array( "href" => "^/search.*start=[0-9]{1,4}&sa=N$", "class" => false, "id" => false ), HP_SCRAPE_WHEREMODE_EREG, array("url" => "href") ); $scrape->setProcess("a", HP_SCRAPE_CONTENTS_ALL, array( "href" => "^/search.*start=[0-9]{1,4}&sa=N$", "class" => false, "id" => false ), HP_SCRAPE_WHEREMODE_EREG, array("url" => "href") ); $scrape->setProcess("a", HP_SCRAPE_CONTENTS_TEXT, array( "href" => "^/search.*start=[0-9]{1,4}&sa=N$", "class" => false, "id" => false ), HP_SCRAPE_WHEREMODE_EREG, array("url" => "href") );
// もしかして $scrape->setProcess("a", HP_SCRAPE_OPTIONS, array( "href" => "^/search.*spell=.*$", "class" => "^p$" ), HP_SCRAPE_WHEREMODE_EREG, array("url" => "href") ); $scrape->setProcess("a", HP_SCRAPE_CONTENTS_TEXT, array( "href" => "^/search.*spell=.*$", "class" => "^p$" ), HP_SCRAPE_WHEREMODE_EREG, array("url" => "href") );
$scrape->setProcess("td", HP_SCRAPE_CONTENTS_ALL, array("class" => "j") ); // 検索件数 $scrape->setProcess("table", HP_SCRAPE_CONTENTS_TEXT, array( "border" => "0", "cellpadding" => "0", "cellspacing" => "0", "width" => "100%", "bgcolor" => "#e5ecf9" ) ); // google電卓 $scrape->setProcess("img", HP_SCRAPE_OPTIONS, array("src" => "/images/calc_img.gif"), HP_SCRAPE_WHEREMODE_TEXT, array("src" => "src") ); // 処理 $res = $scrape->go($google); $search_result = $scrape->getContentsArray(); // google電卓 $calc = ""; if (isset($search_result["img"])) { $search_all_result = $scrape->getAllContentsArray(); foreach ($search_all_result[0] as $key => $value) { if ($value["tagname"] == "img" && $value["option"][0]["value"] == "/images/calc_img.gif") { $calc = $search_all_result[1][$key+7]; break; } } } // メモリ開放 $scrape->free(); // 総実行時間 $search_time = array_sum(explode(" ", microtime())) - $t; // 検索結果表示 ?> <!--Googleの検索結果↓--> <?php echo $search_result["table"][0][0]; ?><br /> <br /> <?php if (strlen($calc)) { echo "<b>{$calc}</b><br /><br />"; } if (isset($search_result["a"][7]) ? count($search_result["a"][7]) && count($search_result["a"][7]) == count($search_result["a"][8]) : false) { ?>もしかして: <a href="<?php echo replace_url($search_result["a"][7][0]["url"]); ?>"><?php echo $search_result["a"][8][0]; ?></a><br /> <br /> <?php } if (isset($search_result["a"][0]) ? count($search_result["a"][0]) && count($search_result["a"][0]) == count($search_result["a"][1]) : false) { $hp =& new htmlParser(); foreach ($search_result["a"][0] as $a => $b) { ?> <a href="<?php echo $b["url"]; ?>"><?php echo $search_result["a"][1][$a]; ?></a><br /> <?php $contents_array = isset($search_result["td"][0][$a]) ? $hp->parse($search_result["td"][0][$a]) : $hp->parse(""); foreach ($contents_array[0] as $key => $item) { if ($item["tagname"] == "a") { foreach ($item["option"] as $siri => $value) { if ($value["name"] == "href") { $contents_array[0][$key]["option"][$siri]["value"] = replace_url($contents_array[0][$key]["option"][$siri]["value"]); } } } } echo $hp->unParse($contents_array); ?> <br /> <br /> <?php } } if (isset($search_result["a"][2]) ? count($search_result["a"][2]) && count($search_result["a"][2]) == count($search_result["a"][3]) : false) { ?> 関連検索: <?php foreach ($search_result["a"][2] as $key => $value) { ?> <a href="<?php echo replace_url($value["url"]); ?>"><?php echo $search_result["a"][3][$key] ; ?></a> <?php } ?> <br /> <?php } if (isset($search_result["a"][7]) ? count($search_result["a"][7]) && count($search_result["a"][7]) == count($search_result["a"][8]) : false) { ?>もしかして: <a href="<?php echo replace_url($search_result["a"][7][0]["url"]); ?>"><?php echo $search_result["a"][8][0]; ?></a><br /> <br /> <?php } // ページ送り if (isset($search_result["a"][4]) ? count($search_result["a"][4]) && count($search_result["a"][4]) == count($search_result["a"][5]) : false) { ?> <br /><br /> <center> <table align="center"><tr> <?php $is_flag = true; foreach ($search_result["a"][4] as $key => $value) { // 前へリンクが無い時は、1 if ($key == 0 && is_numeric(trim($search_result["a"][6][$key]))) { $is_flag = false; ?> <td align="center">●<br />1</td> <?php } // リンクの挿入 ?><td align="center"> <?php if ($key == 0 && !is_numeric(trim($search_result["a"][6][$key]))) { echo "←"; } elseif (!is_numeric(trim($search_result["a"][6][$key]))) { echo "→"; } else { echo "○"; } ?> <br /> <a href="<?php echo replace_url($value["url"]); ?>"><?php echo $search_result["a"][6][$key] ; ?></a> </td> <?php if ($key > 0 && is_numeric(trim($search_result["a"][6][$key])) && (isset($search_result["a"][6][$key+1]) ? is_numeric(trim($search_result["a"][6][$key + 1])) : false)) { if ((trim($search_result["a"][6][$key])+1) != trim($search_result["a"][6][$key+1])) { // 次のリンクとの、差文が1以上なら、間にcurrentが入る $is_flag = false; ?> <td align="center">●<br /><?php echo(trim($search_result["a"][6][$key])+1);?></td> <?php } } } if ($is_flag) { // 一回もcurrentが無い場合は、一番最後につける ?> <td align="center">●<br /><?php echo(trim($search_result["a"][6][$key])+1);?></td> <?php } ?> </tr></table></center> <?php }
?> <center> <form action="./tsearch.php"> <a href="./tsearch.php">←</a><?php echo form_text("text",$text,$attribute='size="40" maxlength="255"'); ?><input type="submit" value="検索"> <BR> <input type="hidden" name="type" value="flowers"> <input type="radio" name="lr" value="" <? if($lr!="lang_ja"){ ?>checked<? } ?> id="allm"><label for="allm">すべてのwebページから</label> <input type="radio" name="lr" value="lang_ja" <? if($lr=="lang_ja"){ ?>checked<? } ?> id="jam"><label for="jam">日本語ページのみ</label> <input type="hidden" name="_flow" value="◇◆もじばけぼうし◇◆"> </form> </center> <div align="right"> 取得HTMLデータの総文字数:<?php echo $contents_lenb ;?><br /> 検索総実行時間:<?php echo $search_time ;?><br /> </div> <?php } ?>
</body> </html>
|