HTTP_Request2で検索結果を取得したい

このQ&Aのポイント
  • pearのHTTP_Request2を使ってサイト内の検索結果を取得したいのですが、どうにもうまく取得できなくて困っています。
  • 対象サイトをクックパッドにしたいと思います。料理名、食材名のフリーワードのところに例えばキムチと入力して、その検索結果を表示したいと思っていますが、リクエストがうまくいかず、上記URLのページがそのまま返ってきてしまいます。
  • HTTP_Request2のドキュメントを参照しましたが、どうにもうまくいきません。お手数ですが、ご教授いただけますと幸いです。
回答を見る
  • ベストアンサー

HTTP_Request2で検索結果を取得したい

pearのHTTP_Request2を使ってサイト内の検索結果を取得したいのですが、 どうにもうまく取得できなくて困っております。 ■やりたいこと 対象サイトをクックパッドにしたいと思います。 http://cookpad.com/search 料理名、食材名のフリーワードのところに例えばキムチと 入力して、その検索結果を表示したい(http://cookpad.com/search/%E3%82%AD%E3%83%A0%E3%83%81)と思っているのですが、リクエストがうまくいかず、上記URLのページがそのまま返ってきてしまいます。ソースは以下です。 <?php require_once "HTTP/Request2.php"; require_once "Net/URL2.php"; $request = new HTTP_Request2('http://cookpad.com/search', HTTP_Request2::METHOD_GET, array('use_brackets' => true)); $url = $request->getUrl(); $url->setQueryVariables(array( 'keyword' => 'キムチ' )); $url->setQueryVariable('commit', 'レシピ検索'); echo $request->send()->getBody(); 一体、どこが間違っているのでしょうか? 下記URLを参照して試みたのですが、どうにもうまくいきません。 お手数ですが、ご教授いただけますと幸いです。 参照ページ http://pear.php.net/manual/ja/package.http.http-request2.request.php

  • PHP
  • 回答数3
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
noname#244856
noname#244856
回答No.2

いろいろ試してみました。 User-Agent: (内容は任意) Accept: text/html,application/xhtml+xml,application/xml(実際には任意の値で全てHTML4.01で返されてくる) Accept-Language: ja,en-us(実際には任意の値で全て日本語で動作する) Accept-Encoding: gzip この4つのヘッダは必須です。"\r\n"で区切って全て「header」に入れてください。最初の3つは適当でいいですが、4つ目が重要なようです。(User-Agentは「user_agent」の方に含めてもOKです。)それに加え、「protocol_version」の値を1.1にする必要もあるみたいです。以上全ての条件を満たせば200OKを返してくるようになります。 しかし、結果をそのまま出力しても文字化けしているんですよね・・・と思ったらはい、これgzip圧縮されているのを忘れていました。gzdecode関数でデコードしてからだと正しく出力されます。 gzdecode http://php.net/manual/ja/function.gzdecode.php 自分自身のスキルアップにつながる質問だったのでとてもためになりました。ありがとうございました。

04106972
質問者

お礼

ありがとうございます。 Accept-Encoding: gzipは知らなかったです。 中々、面倒なサイトもあるもんですねw Yahooだからですかね? ところで、上記解決策はどのようにたどり着きましたでしょうか? むこうのサイトからのレスポンスのheaderなどを見てでしょうか? ご返答いただいた後、ベストアンサーとさせていただきます。 以上、宜しくお願いします。

その他の回答 (2)

noname#244856
noname#244856
回答No.3

サーバー負荷軽減を重視してgzip応答を強制しているところも結構あるみたいですね… たどり着いた経緯… FirefoxのLiveHTTPHeadersアドオンを利用して、その挙動を再現しながらいろいろいじってみた、というところでしょうか。gzdecode関数とか全く知らなかったのですが、「PHP gzip」でググったら見つかりました。

04106972
質問者

お礼

なるほどですね。 お約束通り、NO,2をベストアンサーとさせていただきます。 また、もしよろしければ以下の質問にもお答えいただけますと幸いです。 http://okwave.jp/qa/q8354490.html

noname#244856
noname#244856
回答No.1

GETでリクエストが可能なのにどうしてややこしいことをしようとされているのか分からないのですが、 <?php require_once "HTTP/Request2.php"; require_once "Net/URL2.php"; $request = new HTTP_Request2('http://cookpad.com/search', HTTP_Request2::METHOD_GET, array('use_brackets' => true)); $url = $request->getUrl(); $url->setQueryVariables(array( 'keyword' => 'キムチ' )); $url->setQueryVariable('commit', 'レシピ検索'); echo $request->send()->getBody(); の代わりに <?php readfile('http://cookpad.com/search/' . rawurlencode('キムチ')); では問題があるのでしょうか?

04106972
質問者

お礼

ご回答ありがとうございます。 readfileでそんな簡単にできるんですね! おっしゃる通りで、単純にGETで送って取得したいなら、 file_get_contentsでもできますしね。 ただ、HTTP_Request2などはどのような時に使うのかがよくわからず、 且つ、HTTP_Request2はpostなどには利用するサンプルはありますが、 GETの例がほとんどなく、どのようにやるんだろうと気になり質問させて いただいた次第です。 また、追記になりますが、以下の質問もさせてください。 file_get_contentsなどで取得できずに以下のようなエラーがでるサイトが ありますが、理由をご教授いただけないでしょうか? サイトURL:http://www.lifexweb.com/lab/unitsearch.php?query=php エラー内容:Warning: file_get_contents(http://www.lifexweb.com/lab/unitsearch.php?query=php): failed to open stream: HTTP request failed! HTTP/1.1 500 Internal Server Error 大抵のサイトは取得できるのですが、中にはできないものがあります。 headerでuser_agentを設定して送ってみたりしましたが、やはりできません。 恐れ入りますが、ご教授いただけますと幸いです。

関連するQ&A

  • PEARのHTTP_Requestをインストール

    さくらのレンタルサーバーにPEARのHTTP_Requestをインストールし、 http://pear.php.net/manual/ja/package.http.http-request.intro.php にあった、「yahoo.com の内容を取得し、それを表示する」という 以下のスクリプトを実行したのですが、何も表示されません。 test_yahoo.php ---------------------------------------------------- <?php require_once "HTTP/Request.php"; $req =& new HTTP_Request("http://www.yahoo.co.jp/"); if (!PEAR::isError($req->sendRequest())) { echo $req->getResponseBody(); } ?> ---------------------------------------------------- 状態は以下の通りです。 /home/user/.cshrc set path = (~/pear/bin /sbin /bin /usr/sbin /usr/bin /usr/local/sbin /usr/local/bin $HOME/bin) /home/user/www/php.ini include_path = ".:/php/includes:/home/user/pear/PEAR" %pear list Installed packages, channel pear.php.net: ========================================= Package Version State Archive_Tar 1.3.7 stable Console_Getopt 1.3.0 stable HTTP_Request 1.4.4 stable Mail_Mime 1.8.1 stable Net_Socket 1.0.10 stable Net_URL 1.0.15 stable PEAR 1.9.1 stable Structures_Graph 1.0.4 stable XML_Parser 1.3.4 stable XML_Util 1.2.1 stable % ブラウザからhttp://user.sakura.ne.jp/の /home/user/www/test_yahoo.php(属性:755)に アクセスしていますが、何も表示されません。 原因、または調べ方を教えてください。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • PEARのパッケージのパスの変更方法

    さくらレンタルサーバで、以下の手順でPEARをインストールしました。 http://www.seo-maniax.com/high-rank/sakura-pear/ 次に以下のコマンドを実行しました。 pear channel-update pear.php.net pear install Net_URL2-2.0.0 pear install HTTP_Request2-0.5.1 pear install HTTP_OAuth-0.2.3 そして、/home/ユーザ名/pear/HTTP/Consumer.phpを使ったプログラムで、以下のエラーが。 Warning: require_once(HTTP/OAuth.php) [function.require-once]: failed to open stream: No such file or directory in /home/ユーザ名/pear/HTTP/OAuth/Consumer.php on line 24 Fatal error: require_once() [function.require]: Failed opening required 'HTTP/OAuth.php' (include_path='.:/home/ユーザ名/pear/PEAR') in /home/ユーザ名/pear/HTTP/OAuth/Consumer.php on line 24 line 24は、require_once 'HTTP/OAuth.php'; となっており、正しいパスは'../OAuth.php'なので、正しくインストールしたいのですが、どうすれば良いのでしょうか?

    • ベストアンサー
    • PHP
  • PEAR HTTP_Requestでのヘッダ送信

    PEARのHTTP_Requestを使用し、 下記処理にてTEST_URL向けにPOSTとヘッダを同時に送信する処理を行いたいのですが 411 Length Requiredで返ってきてしまします。 サーバのログには Invalid URI in request Connection: Keep-Alive というログがerrorログに出ています。 そこでRFCを読んで見ると、 転送コーディングが施されていない場合は Content-Length ヘッダは送られなければならないが、 メッセージボディ中のオクテット数と 正確に一致しなければならないとの記載がありました。 ここに引っかかっているのかもと思い対策しようと思いましたが メッセージボディのlength(下記の☆部分)をどのように拾うかがわかりません。 require_once "HTTP/Request.php"; $req = &new HTTP_Request(TEST_URL,array()); $req->setURL(TEST_URL); $req->setMethod(HTTP_REQUEST_METHOD_POST); $req->addHeader('Host',"test.hogehoge.jp\r\n"); $req->addHeader('Content-Length',"-☆-\r\n"); $req->addHeader('Connection', "Keep-Alive\r\n"); $req->addHeader('User-Agent',"TEST ABCDEFG\r\n"); $req->addPostData('TEST_POST', 'testnano'); $result = $req->sendRequest(); if(PEAR::isError($result)) { echo $result->getMessage(); echo "<br />"; } else { echo $req->getResponseCode(); echo "<br />"; echo $req->getResponseBody(); echo "<br />"; } もしかして違う原因でしょうか? よろしくおねがいします。

    • 締切済み
    • PHP
  • phpの処理を中断する方法を教えてください。

    PEARのHTTP_Requestを用いて,指定したURLのHTMLを読み込むというプログラムをPHPで組んでいます。 一部のサイト(以下のソース内の$urlに格納したURLなど)は,サイト自体が重いせいなのか,表示にとても時間がかかってしまいます。 『表示にある一定の時間以上かかる場合は読み込みを中止したい(別処理をしたい)』のですが,どのように書けばよろしいでしょうか。 $optionでHTTP_Requestのタイムアウトを指定しても,その時間でタイムアウトしませんでした。 set_time_limit()を使って実行可能な秒数を指定しようかとも考えたのですが,読み込み中止後に別処理をしたいので,何か良い方法はないかと悩んでいます。 初歩的な問題なのかもしれませんが,開発経験が少ないため解決策がわかりません。是非宜しくお願い致します。 ------------------ソース------------------ <?php require_once "HTTP/Request.php"; $url = "http://bmw.jugem.cc/?search=%C3%E6%B9%F1&mySearch="; $option = array("timeout" => "20"); // HTTP_Requestの初期化 $http = new HTTP_Request($url, $option); // HTTPのヘッダー設定 $http->addHeader("User-Agent", "My PEAR PROGRAM"); $http->addHeader("Referer", "http://www.yahoo.co.jp/"); // HTTPリクエスト実行 $response = $http->sendRequest(); if (!PEAR::isError($response)) { $ret1 = $http->getResponseCode();// ResponseCode(200等)を取得 $ret2 = $http->getResponseHeader();// ResponseHeader(レスポンスヘッダ)を取得 $ret3 = $http->getResponseBody();// ResponseBody(レスポンステキスト)を取得 $ret4 = $http->getResponseCookies();// クッキーを取得 } echo $ret3; ?> ------------------ソース------------------

    • 締切済み
    • PHP
  • HTTP_Request2のタイムアウトの設定

    PEARのHTTP_Request2の設定項目に「connect_timeout」と「timeout」があるのですが、 この2つの違いを教えていただきたく質問致しました。 http://pear.php.net/manual/en/package.http.http-request2.config.php -connect_timeout Connection timeout in seconds. Exception will be thrown if connecting to remote host takes more than this number of seconds. -timeout Total number of seconds a request can take. Use 0 for no limit, should be greater than connect_timeout if set. Exception will be thrown if execution of HTTP_Request2::send() takes more than this number of seconds. 例えば次のようにした場合、何をするまでが10秒で、何をするまでが20秒なのでしょうか。 $request = new HTTP_Request2('http://www.goo.ne.jp/', HTTP_Request2::METHOD_GET, array('connect_timeout' => 10, 'timeout' => 20)); try { $res = $request->send(); } catche ... よろしくお願い致します。

    • 締切済み
    • PHP
  • PEARでrequestする方法

    PEARのインストールを終え pere listで確認をしたのですが requestでしていた場所のphpをうまく読み込んでくれません。 ソースでは ini_set('include_path', ".:/PEAR"); require( "Cache.php" ); require( "Services/AmazonECS4.php" ); とあります 実際のファイルは C:\xampp\php\PEAR\PEAR にあります。 php.iniの;extension=の;をはずしたりしないといけないのでしょうか?

    • 締切済み
    • PHP
  • PHPのHTTP/Requesをローカルでテストする方法は?

    PHP初心者なのですが、 初めてPHPのPEARパッケージにあるHTTP/Requestクラスを使って、別サーバーのAPIに対し、XMLのリクエストをし、XMLのレスポンスを受け取るやり取りをする関数を作りたいと思い、下記のような関数を作ってみたのですが、ローカル環境でどのようにテストすれば、HTTP/Requestの挙動をうまく確認できるかが思い浮かばずに、止まってしまいました。 どのようにテストすれば挙動がローカルで確認できるか、どなたか、ご教授お願いします!!! ----------- 制作した関数 引数1:リクエスト先URL、引数2: function testHttp($requestUrl,$requestXml){ $option = array( "timeout" => "3", // タイムアウトの秒数指定 "allowRedirects" => true // リダイレクトの許可 ); // HTTP_Requestの初期化 $http = new HTTP_Request($requestUrl, $option); // HTTPのヘッダー設定 $http->addHeader("User-Agent", "My PEAR PROGRAM"); $http->addHeader("Referer", $obj->protMember('LOGIN_URL')); $http->setMethod(HTTP_REQUEST_METHOD_POST); // HTTPリクエスト実行 $response = $http->sendRequest(); if (!PEAR::isError($response)) { $responseVal['resCode'] = $http->getResponseCode(); // ResponseCode $responseVal['resBody'] = $http->getResponseBody(); // ResponseBody return $responseVal; }else{ exit(); } }

    • 締切済み
    • PHP
  • HTTP_Requestで画像ファイルを取得、保存

    こんばんわ。 php_pearの/HTTP_Request/について質問させて下さい。 下のコードのように、画像ファイルのアドレスをHTTP_Requestへ渡して $picへ格納し、fopen以下でサーバーの指定フォルダへ保存 という内容のコードを書いたのですが、巧く動かずエラーが出てしまいます。 $picで受け取るデータに問題があるのではと推測して、その線で調べてはみたのですが、 どうもハッキリとしません。 何が原因で、どうすれば正常に動くのかをアドバイスして頂けないでしょうか。 宜しくお願いします。 ~~~~~~~~~~~~~略~~~~~~~~~~~~~~~ $req =& new HTTP_Request("画像のアドレス",$option); $req->addHeader("User-Agent", "My PEAR PROGRAM"); $req->addHeader("Referer", "http://www.yahoo.co.jp/"); if (!PEAR::isError($req->sendRequest())) { //$picへ画像ファイルを格納// $pic = $req->getResponseBody(); $read_fp = @fopen($pic,"r"); $write_fp= @fopen("保存先パス","w+"); while($line=fread($read_fp,filesize($pic))){ fwrite($write_fp,$line); } fclose($read_fp); fclose($write_fp); } =====================エラーメッセージ======================= Warning: filesize() [function.filesize]: stat failed for yOya Warning: fread(): supplied argument is not a valid stream resource Warning: fclose(): supplied argument is not a valid stream resource =====================システム情報補足======================= System Linux PHP Version 5.2.3 allow_url_fopen Off allow_url_include Off

    • ベストアンサー
    • PHP
  • Pear + MySQLで検索サイトの作り方

    Pear + MySQLで検索サイトを作っています。 テーブル名 city_code カラム id pre_no pre_code city_no city_name shop tel (ID、都道府県コード、都道府県名、市町村コード、市町村名、店名、TEL) PHP作成は最小限に、URLのリンクで多数の種類の表示が出来るように考えています。 http://hoge.jp/search.php?pre_no=13 東京都の飲食店の表示 http://hoge.jp/search.php?pre_no=14 神奈川県の飲食店の表示 http://hoge.jp/search.php?city_no=13001 千代田区の飲食店の表示 http://hoge.jp/search.php?city_no=14001 横浜市の飲食店の表示 のような感じです。 下記の試作品search.phpでは、全国の全ての登録飲食店を表示してしまいます。 (データベース接続はできています) これをURLでhttp://hoge.jp/search.php?pre_no=13のようにすることにより、検索地域を特定したいのです。(あくまで例: URLで振り分け指定出来ればこの形ではなくても可) データベースサーバーの使用用途の基本中の基本だと思うのですが、素人なものでこんなことで躓いています。何故かWEBにも落ちていません。Pearの本も購入したのですが記載されていません。 どなたかご教授頂けませんでしょうか? 宜しくお願い致します。 ************** search.php ************** <?PHP //config.phpのサーバー基本情報を読みに行く require_once '../../config.php'; require_once '/usr/share/pear/DB.php'; $db = DB::connect($dsn); if (PEAR::isError($db)) { die($db->getMessage()); } print('接続に成功しました<br>'); $db->query('SET NAMES ujis'); if (PEAR::isError($db)) { die($db->getMessage()); } $sql = 'select * from city_code'; $res =& $db->query($sql); if (PEAR::isError($res)) { die($res->getMessage()); } while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) { print($row['pre_name'].'<br>'); print($row['city_name'].'<br>'); print($row['shop'].'<br>'); print($row['tel'].'<br>'); } $db->disconnect(); ?>

    • ベストアンサー
    • MySQL
  • PEAR::MailでPEAR.php?

    Mailを使ってメールを送信したいのですが、エラーがでます。 Warning: require_once(PEAR.php) [function.require-once]: failed to open stream: この PEAR.php はどこで入手できるのでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう