ホームページ >バックエンド開発 >PHPチュートリアル >Tianya データの定期的なキャプチャ、再帰の失敗、解決策。 。 。 。
前書き: 私のオブジェクト指向の基礎は平均的です。 。
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'];
$result[] = 'http://bbs.tianya.cn'.$v;
}
getAllPage( $nextPageUrl,$ Depth+1,$result);
再帰関数の最初の呼び出し:
$result = array();