ホームページ > バックエンド開発 > PHPチュートリアル > PHP のカールを使用して、キーワードに基づいて Baidu の検索結果ページをクロールします。

PHP のカールを使用して、キーワードに基づいて Baidu の検索結果ページをクロールします。

WBOY
リリース: 2016-06-23 13:44:39
オリジナル
1245 人が閲覧しました

私が実現したいのは、毎回指定されたキーワードに基づいて Baidu の結果ページを検索することです。たとえば、Baidu の検索結果は次のようになります。Baidu のプロモーション コンテンツとテキストは次のとおりです。

そして、curl を使用して、結果は次のとおりです:

つまり、すべてのクロール結果は、Baidu が宣伝するコンテンツはクロールできないと言われています。始めたばかりなので、ご指導いただける師匠がいらっしゃいましたらお願いいたします。前もって感謝します。
PHP のクローリング コードは次のとおりです:

<?php$url = "http://www.baidu.com/s?wd=生命动力";// 构造包头,模拟浏览器请求$header = array (		"Host:www.baidu.com",		"Content-Type:application/x-www-form-urlencoded",//post请求		"Connection: keep-alive",		'Referer:http://www.baidu.com',		'User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; BIDUBrowser 2.6)');$ch = curl_init ();curl_setopt ( $ch, CURLOPT_URL, $url );curl_setopt ( $ch, CURLOPT_HTTPHEADER, $header );curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );// 执行$content = curl_exec ( $ch );if ($content == FALSE) {	echo "error:" . curl_error ( $ch );}// 关闭curl_close ( $ch );//输出结果echo $content;?>
ログイン後にコピー


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

プロモートされたコンテンツは、ページがロードされてページに書き込まれた後に js を 2 回呼び出すことによって取得されます。したがって、curl を使用すると、HTML 内の情報のみを取得できます。
jsがロードされると、jsによって取得されたURLを取得するためにcurlを使用する必要があります。

プロモートされたコンテンツは、ページがロードされてページに書き込まれた後、js を 2 回呼び出すことによって取得されます。したがって、curl を使用すると、HTML 内の情報のみを取得できます。
jsがロードされると、jsによって取得されたURLを取得するためにcurlを使用する必要があります。


しかし、この Baidu のプロモーション コンテンツは、Web ページのソース コードを表示することで確認できるのでしょうか? jsの呼び出しによって生成された情報はWebページのソースコードに表示されますか?

ユーザー エージェントが適切にシミュレートされていないため、機能しません。
実際、post を使用する必要はまったくなく、get を使用するだけです。
次のように変更します:

$url = "http://www.baidu.com/s?wd=生命动力";$header = array (        'User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36');$ch = curl_init ();curl_setopt ( $ch, CURLOPT_URL, $url );curl_setopt ( $ch, CURLOPT_HTTPHEADER, $header );curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );// 执行$content = curl_exec ( $ch );if ($content == FALSE) {    echo "error:" . curl_error ( $ch );}// 关闭curl_close ( $ch ); //输出结果echo $content;
ログイン後にコピー
ログイン後にコピー


ユーザー エージェントは適切にシミュレートされていないため、機能しません。
実際、post を使用する必要はまったくなく、get を使用するだけです。
次のように変更されました:

$url = "http://www.baidu.com/s?wd=生命动力";$header = array (        'User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36');$ch = curl_init ();curl_setopt ( $ch, CURLOPT_URL, $url );curl_setopt ( $ch, CURLOPT_HTTPHEADER, $header );curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );// 执行$content = curl_exec ( $ch );if ($content == FALSE) {    echo "error:" . curl_error ( $ch );}// 关闭curl_close ( $ch ); //输出结果echo $content;
ログイン後にコピー
ログイン後にコピー




ご返信ありがとうございます。あなたの結論は正しいです。ここでまだ問題が発生しています。つまり、キャプチャしたWebページの画像は、最初は表示できますが、それ以降は表示できません。

ソースコードを確認したところ、取得した画像アドレスが実際のアドレスであることが分かりましたが、この外部リンク防止を回避するアイデアはありますか?カールで原点を鍛造することも機能しないようです。

ページに非表示のパラメータがあるかどうかを確認する必要があります。通常は、それらのパラメータが影響します。
例えばjsでもできます。そして、これは新しいスレッドで議論されるべきもう一つの問題です。

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