ホームページ  >  記事  >  バックエンド開発  >  Tianya データの定期的なキャプチャ、再帰の失敗、解決策。 。 。 。

Tianya データの定期的なキャプチャ、再帰の失敗、解決策。 。 。 。

WBOY
WBOYオリジナル
2016-06-23 14:19:02849ブラウズ

この投稿の最終編集者は liuser_cn 2013-08-12 21:25:48 です。

前書き: 私のオブジェクト指向の基礎は平均的です。 。

モジュールを捕まえました(ナンセンス)。
次のページはタイムスタンプで完了します。
最初のページのすべてのタイトル URL を取得した後、次のページのアドレスを取得したいだけです (「取得可能」)
さて、最初のページのすべてのタイトル URL を取得した後、次のページの URLページもキャプチャされます
100回再帰して100ページのすべてのタイトルのURLをキャプチャしたいです。
コードを見てみましょう。
   public function getAllPage($url){        /**         * curl_setopt($ch, CURLOPT_FAILONERROR, true);//记录错误信息设置         * curl_errno可以获得错误码,当然也包括错误的http状态码           curl_error可以获得错误信息         */        $ch =  curl_init($url);//初始化一个句柄        curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);        curl_setopt($ch,CURLOPT_TIMEOUT,1111111);        $html = curl_exec($ch);        curl_close($ch);                //修饰一下,从何时开始。        $length     = strpos($html, 'class="mt5');        $newHtml    = substr($html, $length);        //修饰END            $pattern    = "#\/post-.*\.shtml#i"; //正则表达式            preg_match_all($pattern, $newHtml,$matches);            //抓取下一页链接地址            $nextPagePattern   =    "#\<a href=\"(.*)\"\srel#";            preg_match($nextPagePattern, $newHtml,$nextPage);            $nextPageUrl    =   "http://bbs.tianya.cn".$nextPage['1'];            //下一页   END            //链接。全。            foreach($matches['0'] as $k=>$v){                 $matches[$k]   =   'http://bbs.tianya.cn'.$v;            }            //之前的递归是在这里的,一运行直接死掉了。。。。。        return array(            '0'=>$matches,            '1'=>$nextPageUrl,        );    }


お聞きしたいのですが、このアイデアに問題はありますか?
再帰コード ==! を提供すると便利ですか? !

ディスカッションへの返信 (解決策)

foreach($matches['0'] as $k=>$v){
$matches[$k] $v;
}

変更の意味は何ですかループ内の配列?
コードの再帰部分も投稿されます

foreach($matches['0'] as $k=>$v){
$matches[$k] = 'http://bbs.tianya.cn' .$v;
}

ループ内で配列を変更する意味は何ですか?
コードの再帰部分も投稿されます
1: 完了、キャプチャされたアドレスにはドメイン名がありません。
2: 再帰。 。 。私のコメントは以前このように書かれていました、

for($i=0;$i<100;$i++){  $this->getAllPage($nextPageUrl)             }

for($i=0;$i $this->getAllPage($nextPageUrl)
}

これは再帰キャプチャではありません Take 100回。
代わりに、100 回ループし、毎回再帰関数を実行します。そして、再帰関数には出口がなく (再帰からの出口がなく、無限再帰につながります)、当然、関数は終了します。

for($i=0;$i $this->getAllPage($nextPageUrl)
}

これは 100 回再帰的にクロールするわけではありません。
代わりに、100 回ループし、毎回再帰関数を実行します。そして、再帰関数には出口がなく (再帰からの出口がなく、無限再帰につながります)、当然、関数は終了します。
アドバイスをお願いします。

for($i=0;$i $this->getAllPage($nextPageUrl)
}

これは 100 回の再帰的クロールではありません。
代わりに、これは 100 回ループし、毎回再帰関数を実行します。そして、再帰関数には出口がありません (再帰からの出口がなく、無限再帰につながります)、当然、関数は終了します。
輸出は判断ですか?

必要に応じて、これを行うことができます:
public function getAllPage($url, $ Depth, &$result)
$ Depth は再帰の深さを制御します。初期値は 0 です。参照 $result は、最終的な一致結果を記録します。 ジャンプ的な




:
IF ($ Depth == 100) {
Return;










$ nextPageurl = "http://bbs.tianya.cn ".1'];

foreach($matches['0'] as $k=>$v){

$result[] = 'http://bbs.tianya.cn'.$v;
}
getAllPage( $nextPageUrl,$ Depth+1,$result);


再帰関数の最初の呼び出し:
$result = array();


for($ i=0 ;$i 必要に応じて、これを行うことができます:
public function getAllPage($url, $ Depth, &$result)
$ Depth は再帰の深さを制御します。初期値は 0 です。参照 $result は、最終的な一致結果を記録します。 ジャンプ的な




:
IF ($ Depth == 100) {
Return;










$ nextPageurl = "http://bbs.tianya.cn ".1']; foreach($matches['0'] as $k=>$v){ 🎜 $result[] = 'http://bbs.tianya.cn'.$v; 🎜 } 🎜 getAllPage( $nextPageUrl,$ Depth+1,$result); 🎜 🎜 🎜 再帰関数の最初の呼び出し: 🎜 $result = array(); 🎜 getAllPage($url,0,$result); ありがとうございます。 ! 🎜
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。