質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.21%

CURLの使い方

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,072

tuckQ

score 64

下記プログラムを書いてみたのですが、うまく動きません。実行するとエラーも表示されず、何が起こっているのか?何が足りないのか?がわからず行き詰まっています。

下記がコードになります。

<?php
function curl_url($url,$ref="")
 {
   if(function_exists("curl_init"))
   {
     $ch_init = curl_init();
     $user_agent = "Mozilla/4.0 (compatible; MSIE 5.01; "."Windows NT 5.0)";
     $ch_init = curl_init();
     curl_setopt($ch_init, CURLOPT_USERAGENT, $user_agent);
     curl_setopt( $ch_init, CURLOPT_HTTPGET, 1 );
     curl_setopt( $ch_init, CURLOPT_RETURNTRANSFER, 1 );
     curl_setopt( $ch_init, CURLOPT_FOLLOWLOCATION , 1 );
     curl_setopt( $ch_init, CURLOPT_FOLLOWLOCATION , 1 );
     curl_setopt( $ch_init, CURLOPT_URL, $url );
     curl_setopt( $ch_init, CURLOPT_REFERER, $ref );
     curl_setopt ($ch_init, CURLOPT_COOKIEJAR, 'cookie.txt');
     $html = curl_exec($ch_init);
     curl_close($ch_init);
   }
  else
   {
     $hfile = fopen($url,"r");
     if($hfile)
     {
       while(!feof($hfile))
       {
         $html.=fgets($hfile,1024);
       }
     }
   }
  return $html;
 }

$url='http://www.amazon.com/s/ref=sr_nr_p_72_0?rh=n%3A172282%2Ck%3Aiphone+5s%2Cp_72%3A1248879011&keywords=iphone+5s&ie=UTF8&qid=1406078696&rnid=1248877011';
$getelement = curl_url($url);            
preg_match_all ("/a[\s]+[^&amp;gt;]*?href[\s]?=[\s\"\']+"."(.*?)[\"\']+.*?&amp;gt;"."([^&amp;lt;]+|.*?)?&amp;lt;\/a&amp;gt;/", $getelement, $matches,PREG_PATTERN_ORDER);    
$matches = $matches[1];
$list = array();
    foreach($matches as $var)
        {    
           print_r($var."\n");
        }

?>

本来ならpreg_match_allでマッチしたいくつかURLが表示されるはずなのですが、なぜ上記コードだとうまく動かないか、どなかたお分かりになられないでしょうか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • tuckQ

    2016/08/06 11:31

    再度ありがとうございます。教えて頂いた方法で連想配列の返り値が得られました!「function curl_url」関数の中の処理は概ね理解できたかと思います。preg_match_all 以下の処理がどうなっているのか未だちゃんとイメージできておらず、もう少し研究してみます!

    キャンセル

  • kei344

    2016/08/06 15:19

    まだ質問が「受付中」になっていますが、いったん「解決済」にされてはいかがでしょうか。

    キャンセル

  • tuckQ

    2016/08/06 21:58

    はい。おおよそ仕組みが分かったので「解決済」とさせていただきます。

    キャンセル

回答 2

checkベストアンサー

+1

何が起こっているのか?何が足りないのか?を切り分けてみては?
通信内容を確認すれば切り分けられると思います。
あと、他者の管理するサイトを機械的にアクセスするのであれば、迷惑かけないようにプログラムをちゃんと理解した方がいいですよ。
このスクリプト自体は、無茶なアクセスする内容ではない上、相手が amazon なので、それほど影響はないと思いますが。。。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/06 11:35

    本来、スクレイピングのテストは自前環境で行うべきなのですね。。サーバにかかる負荷のことを全く認識できてませんでした。通信内容の確認方法を含め学習進めてみようと思います。

    キャンセル

  • 2016/08/06 13:37

    今回のケースでは、通信自体は正常のようです。
    echo $getelement;
    すると原因がわかると思います。

    キャンセル

  • 2016/08/06 21:53

    ようやく原因が分かりました。ロボットチェックが表示されているんですね。いわんや、ロボットでアクセスしちゃダメってことですよね。スクレイピングについてはちょっと考えます。いろいろ参考になりました、ありがとうございます!

    キャンセル

+1

コードは   で囲ってください。

preg_matchに渡している文字列の中身がHTMLエンコードされていますが(リンク先も含め)、これはHTMLエンコードしてるとURLに一致してないように見えますがいかがでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/02 21:21

    コメントありがとうございます!preg_matchの仕様については、リファレンスなどを見てある程度学習したのですが、ご指摘いただいた「HTMLエンコードされている」「URLと不一致」のあたりの理解が出来ておりません。。。preg_matchの部分に問題がありそうなことは分かったので、ここにフォーカスして調べてみようと思います!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.21%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる