- ベストアンサー
既存エンジンを利用したHTML&PHPの検索・取得は不可能?
- PHPでURL抽出をしたいと思っています。検索エンジンを利用して、URLの取得またはHTMLのソース取得ができるかどうか悩んでいます。
- HTMLでフォームを作り、gooにキーワードを送信するだけのコードを作成しましたが、この後のURLの取得がPHPで可能かどうかがわかりません。
- PHPに詳しい方、ぜひご教授ください。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
yyr446です。 <<自作サーバで以上を正常に動作させられないのですが、 PHPの設定で必要なことってありますでしょうか?>> 自作サーバ? windows or lynux or other バージョン? 私のは http://www.my-sv.net/server.shtml のレンタルサーバーです。 別途質問を起てた方が回答がつきやすいと思います。
その他の回答 (6)
- yyr446
- ベストアンサー率65% (870/1330)
No1,No2,No3の連続回答者です(申し訳ない。) 結局、私もよそでも質問して、日本語を正しくパースできるような サンプルにする事ができましたので、一応載せておきます。 ※リクエストのパラメーター以外は全部UTF-8にして処理しています。 ※リンク部分の取得はXpathのクエリーを使って簡潔にしました。 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="ja-JP"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>GooSarch PHP</title> </head> <body> <form method="get" action="<?php echo $_SERVER["PHP_SELF"];?>" id="query_top"> <label for="searchtop">検索:</label> <input type="text" name="MT" value="" id="searchtop" size="45"> スコア <select name="rm"> <option value = '0'>全部</option> <option value = '1' selected>1 以上</option> <option value = '2'>2 以上</option> <option value = '3'>3 以上</option> <option value = '4'>4 以上</option> <option value = '5'>5 以上</option> </select> <input type="submit" name="btn_g" class="gbbtn_search" value="gooブログ検索"></form> <hr> <?php mb_internal_encoding("UTF-8"); $url="http://blog.search.goo.ne.jp/search_goo/result/"; $parm=rawurldecode(http_build_query($_GET)); $parm=mb_convert_encoding($parm,"EUC-JP","auto"); $uri =($url . "?" . $parm); $data=file_get_contents($uri); $data=mb_convert_encoding($data,"UTF-8","EUC-JP"); $data = str_replace ("euc-jp","utf-8",$data); $data = str_replace ("&","&",$data); $data = str_replace ("<!--龠龠龠-->","<!--binyu-->",$data); $dom = new DOMDocument(); @$dom->loadHTML($data); $dom->normalize(); $xpath = new DOMXPath($dom); $query = '//div[@id="incontents"]//div[@class="group_time_box"]//li/div[@class="title"]/a[1]'; $entries = $xpath->query($query); foreach($entries as $entry){ echo '<a href="' . $entry->getAttribute('href') . '">'.$entry->textContent.'</a>' .'<br>'; } ?> </body> </html>
- yyr446
- ベストアンサー率65% (870/1330)
回答者yyr446です。No.3の補足への回答です。 <変なURLが出力されました。どうやら文字化けした「罍」という漢字の検索結果?のようなものが出てしまいました…(泣)> ですが、変ではありません。 HTTPで通信する時、日本語や特殊文字はは%xx%xx...みたいにエンコードし ます。 (ブラウザーはアドレス欄やサブミットメソッドを自動でエンコードします)。 NO.2のプログラムは文字コードをUTF-8で保存してあります。 私のphpは内部エンコードがUTF-8となっています。htmlのメタタグ でもcharset=UTF-8"としてあり、出力はUTF-8になっています。 従ってフォームでGETされるパラメータはUTF-8の文字コードの漢字 を%エンコードされた物です。これをphpの$_GETで参照すると %がデコードされたUTF-8の漢字になります。(この辺が私もよくわからん) 次に、検索用URIを作るために、http_build_query()関数を使います。 これがUTF-8の漢字を%エンコードしなおします。 それをそのままechoするなら漢字は出ません。 検索先のgooのページはUTF-8のリクエストを受けてくれますが、 出力はgooのページですから当然別の文字コード"EUC-JP"です。 これを自分のページ内に無理やり出すため、 echo mb_convert_encoding(urldecode(htmlspecialchars($data)),"UTF-8","auto"); で、UTF-8に直して、かつタグの影響を受けないようhtmlspecialchars() もやっています。 それからNo.4のサンプルは、やはり文字コードの取り扱いをまったく 考慮してないので、とりあえず参考にとどめておいて下さい。
- yyr446
- ベストアンサー率65% (870/1330)
適当ですが、返されたHTMLから、検索結果のリンクの部分だけ 抜き出すようにDOMクラスを使って作ってみました。 (日本語文字コードのハンドリングがでたらめになってしまっている!) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="ja-JP"> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"> <title>GooSarch PHP</title> </head> <body> <form method="get" action="<?php echo $_SERVER["PHP_SELF"];?>" id="query_top"> <label for="searchtop">検索:</label> <input type="text" name="MT" value="" id="searchtop" size="45"> スコア <select name="rm"> <option value = '0'>全部</option> <option value = '1' selected>1 以上</option> <option value = '2'>2 以上</option> <option value = '3'>3 以上</option> <option value = '4'>4 以上</option> <option value = '5'>5 以上</option> </select> <input type="submit" name="btn_g" class="gbbtn_search" value="gooブログ検索"></form> <hr> <?php $url="http://blog.search.goo.ne.jp/search_goo/result/"; $parm=rawurldecode(http_build_query($_GET)); $parm=mb_convert_encoding($parm,"EUC-JP","auto"); $uri =($url . "?" . $parm); $data=file_get_contents($uri); $dom = new DOMDocument(); $dom->encoding="EUC-JP"; @$dom->loadHTML($data); $doc=$dom->documentElement; $nodes=$doc->getElementsByTagName('div'); foreach ($nodes as $node) { if($node->getAttribute('id') =="incontents"){ $incontents = $node->getElementsByTagName('div'); foreach ($incontents as $node){ if($node->getAttribute('class') == "group_time_box"){ $li = $node->getElementsByTagName('li'); foreach($li as $node){ $div=$node->getElementsByTagName('div'); foreach($div as $node){ if($node->getAttribute('class')=="title"){ $link=$node->getElementsByTagName('a'); $a=$link->item(0); echo '<a href="' . $a->getAttribute('href') . '">' .$a->textContent. '</a>' .'<br>'; echo '<a href="' . $a->getAttribute('href') . '"></a>' .'<br>'; } } } } } } } ?> </body> </html>
- yyr446
- ベストアンサー率65% (870/1330)
#No2の回答の $parm=rawurldecode(http_build_query($_GET)); は余分です。(消し忘れ)
補足
引き続き、失礼します。 回答2のソースを試してみました。 最後までやらずに、とりあえず$uriを出力させてみました。 _________________________________________ (略)~ <option value = '3'>3 以上</option> <option value = '4'>4 以上</option> <option value = '5'>5 以上</option> </select> <input type="submit" name="btn_g" class="gbbtn_search" value="gooブログ検索"></form> <hr><pre> <?php $url="http://blog.search.goo.ne.jp/search_goo/result/"; $parm=rawurldecode(http_build_query($_GET)); $parm=http_build_query($_GET); $uri =($url . "?" . $parm); echo $uri; __________________________________________ ですが、inputのボタンを押す前にphpが一部実行されてしまっているのか、 最初の表示だけの時点で、文字化けが起きました。 また、フォームにキーワードを入力してボタンを押してからは、 フォームの下に、~/result/?に続いてにURLが表示されたのですが、 変なURLが出力されました。↓ http://blog.search.goo.ne.jp/search_goo/result/?MT=%E6%A3%AE&rm=1&btn_g=goo%EF%BF%BDu%EF%BF%BD%EF%BF%BD%EF%BF%BDO%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD どうやら文字化けした「罍」という漢字の検索結果?のようなものが出てしまいました…(泣) 検索ボタンを押下するまえに文字化けしているのも気になりますし・・・ actionの中にPHPを埋め込むというのは考えていませんでしたが、 この辺りで値渡しが上手くいってないのでしょうか…? (PHPで文字化けは良くあることですが…) すごくあと一息な感じはするのですが…。 新しい回答ありがとうございました。 DOMクラスというのがわからないのですが、とりあえず見させて頂きます。
- yyr446
- ベストアンサー率65% (870/1330)
formのaction属性を自分自身にしてキーを受け取り、 file_get_contents()関数でURLとキーをセットしたURI指定を指定して 取得したhtmlを変数に格納できます。 これをパースしてurl部分を取り出せばよいと思います。 (変数に格納するまでのサンプル) <html xmlns="http://www.w3.org/1999/xhtml" lang="ja-JP"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>GooSarch PHP</title> </head> <body> <form method="get" action="<?php echo $_SERVER["PHP_SELF"];?>" id="query_top"> <label for="searchtop">検索:</label> <input type="text" name="MT" value="" id="searchtop" size="45"> スコア <select name="rm"> <option value = '0'>全部</option> <option value = '1' selected>1 以上</option> <option value = '2'>2 以上</option> <option value = '3'>3 以上</option> <option value = '4'>4 以上</option> <option value = '5'>5 以上</option> </select> <input type="submit" name="btn_g" class="gbbtn_search" value="gooブログ検索"></form> <hr><pre> <?php $url="http://blog.search.goo.ne.jp/search_goo/result/"; $parm=rawurldecode(http_build_query($_GET)); $parm=http_build_query($_GET); $uri =($url . "?" . $parm); $data=file_get_contents($uri); //下で、とりあえず取り込んだhtmlファイルの中身を全部出力してます。 echo mb_convert_encoding(urldecode(htmlspecialchars($data)),"UTF-8","auto"); ?> </pre> </body> </html>
補足
3連続投稿ありがとうございます!! 本当にすごいです!神降臨って感じがしてます! ソース読んでいてわからないところだらけなので、 ちょっと自分で解釈してきてみます。 宜しければもうしばらくお付き合い頂けたらと思います(汗) 最終的には、この取得したurlのhtmlをテキストか何かに落として、 更にHTMLテキスト検索をしたいと思っているのです。 本当にありがとうございます。
- UmJammer
- ベストアンサー率58% (115/196)
ひとつの方法としては、cURLというモジュールの利用が考えられます。 http://www.php.net/manual/ja/book.curl.php
お礼
しばらく経ってからですみません。 自作サーバで以上を正常に動作させられないのですが、 PHPの設定で必要なことってありますでしょうか?(モジュールなど) レンタルサーバではしっかり動きました!ありがとうございました!! DOMか何かでPHPがウマく動かないのかもしれません… 最後の最後まですみませんです…
補足
すみません、たいへんありがとうございます。 前回のソースの理解勉強をしていたところです。 やはり日本語処理は難しいですね…。 こちらも早速解読していきたいと思います。 本当にすごいと思いつつ、感謝感謝です。