ホームページ > バックエンド開発 > PHPチュートリアル > curl または file_get_content を使用してデータをフェッチできないのはなぜですか?

curl または file_get_content を使用してデータをフェッチできないのはなぜですか?

WBOY
リリース: 2016-06-23 13:43:21
オリジナル
1225 人が閲覧しました

curl または file_get_content を使用してデータを取得できないのはなぜですか?

Baidu の経験では、たとえば http://jingyan.baidu.com/article/00a07f38441c3782d028dc04.html、
ページのソース コードを直接見ると、記事データがあります。
しかし、curlとfile_get_content.を使うと記事内容が正常に取得できません。
これはなぜですか? IPアドレスや送信元などを偽造しましたが、それでも取得できません。 Baidu はどのようにしてデータ クロールを防止しますか?

以下はコードです:
rrree


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

curl はこのページのコンテンツのみをクロールしますが、このページにはクロールでは埋めることができない他の多くの動的コンテンツがあります

このページのコンテンツのみをキャプチャしますが、このページにはクローリングでは埋められない他の動的コンテンツがたくさんあります。

記事データは動的ではないはずです。 表示できるコードを確認してみましょう。このページはクロールでき、ログインせずに表示できます。検索エンジン スパイダーもクロールできます。なぜ今、curl でクロールできないのですか?
クッキーがないからでしょう。最初にクッキーを追加します。

function fcontents( $url, $timeout = 5, $referer = "" ){    $ch = curl_init();    $header = array (        'User-Agent: Mozilla/5.0 (Windows NT 5.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36','X-FORWARDED-FOR:154.125.25.15', 'CLIENT-IP:154.125.25.15'    );    curl_setopt($ch, CURLOPT_URL, $url);    curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);    curl_setopt($ch, CURLOPT_HTTPHEADER, $header); //构造用户IP    curl_setopt($ch, CURLOPT_REFERER, "http://www.baidu.com/");//构造来路     $result = curl_exec($ch);    curl_close($ch);    return $result;}$html = fcontents('http://jingyan.baidu.com/article/00a07f38441c3782d028dc04.html');echo $html;
ログイン後にコピー


それから、リクエストするときはクッキーを持ってきてください:
$url = "http://jingyan.baidu.com/article/00a07f38441c3782d028dc04.html";$cookie_jar = dirname(__FILE__)."/jy.cookie";/* 获取cookie */$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_jar);curl_exec($ch);curl_close($ch);
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

クッキーがないからかもしれません。最初にクッキーを追加します。

$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_jar);curl_setopt($ch, CURLOPT_HEADER, 0);$res = curl_exec($ch);curl_close($ch);echo $res;
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー


それから、リクエストするときにクッキーを持ってきてください:
$url = "http://jingyan.baidu.com/article/00a07f38441c3782d028dc04.html";$cookie_jar = dirname(__FILE__)."/jy.cookie";/* 获取cookie */$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_jar);curl_exec($ch);curl_close($ch);
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー


追加しても機能しません。ローカル環境とIPの異なる3つのサーバーで試してみましたが、捕捉できませんでした。

だからクッキーはありません。最初にクッキーを追加します。

$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_jar);curl_setopt($ch, CURLOPT_HEADER, 0);$res = curl_exec($ch);curl_close($ch);echo $res;
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー


それから、リクエストするときにクッキーを持ってきてください:
$url = "http://jingyan.baidu.com/article/00a07f38441c3782d028dc04.html";$cookie_jar = dirname(__FILE__)."/jy.cookie";/* 获取cookie */$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_jar);curl_exec($ch);curl_close($ch);
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー


追加しても機能しません。ローカル環境とIPの異なる3つのサーバーで試してみましたが、捕捉できませんでした。


上記のコードを使用すると、Baidu エクスペリエンス ページがキャプチャされます。コード (および Cookie コード) を投稿してみてはいかがでしょうか。


だからクッキーはありません。最初にクッキーを追加します。

$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_jar);curl_setopt($ch, CURLOPT_HEADER, 0);$res = curl_exec($ch);curl_close($ch);echo $res;
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー


それから、リクエストするときにクッキーを持ってきてください:
$url = "http://jingyan.baidu.com/article/00a07f38441c3782d028dc04.html";$cookie_jar = dirname(__FILE__)."/jy.cookie";/* 获取cookie */$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_jar);curl_exec($ch);curl_close($ch);
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー


追加しても機能しません。ローカル環境とIPの異なる3つのサーバーで試してみましたが、捕捉できませんでした。

上記のコードを使用すると、Baidu エクスペリエンス ページがキャプチャされます。コード (および Cookie コード) を投稿してみてはいかがでしょうか。

ありがとうございます、私も間違えてしまいました。追加されたコード行が 1 行減りました。
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート