何回クロールするとき、我々はページにレンダリングされたコンテンツはJavascriptで生成されるためscrapyはそれのためにクロールすることができない問題に実行(例えば、AJAXリクエスト、jQueryの)(グットが内部で使用)Javascriptでデータが読み込まれている場合、GoutteとGuzzleを使ってクロールするにはどうすればよいですか?
答えて
がつがつ食いますHTTPクライアントです。その結果、javascriptのコンテンツは解析または実行されません。要求されたエンドポイントの外にあるJavascriptファイルはダウンロードされません。
ご使用の環境によっては、PHPv8(Google V8 JavaScriptエンジンを組み込んだPHP拡張機能)とカスタムhandler/middlewareを利用することができます。
また、ご使用の環境によっては、javascriptクライアントで単純にスクレイピングを実行する方が簡単かもしれません。
それはJavaScriptを使用して作業することは不可能であるので、私は別の解決策を提案することができます。要素を点検>
として編集GOOGLE CHROME>右ボタンを>右ボタン>コピーしたHTMLをHTML>コピー>仕事
$html = $the_copied_html;
$crawler = new Crawler($html);
$data = $crawler->filter('.your-selector')->each(function (Crawler $node, $i) {
return [
'text' => $node->text()
];
});
//Do whatever you want with the $data
return $data; //type Array
これは、単一のジョブでのみ機能し、自動化されたプロセスでは機能しません。私の場合、これはそれを行います。
あなたはファントムを見てみたいです。このPHPの実装があります:
http://jonnnnyw.github.io/php-phantomjs/
あなたはそれが当然のPHPで作業している必要があります。
Guzzleが提供する素晴らしい機能(コンテンツの検索など)を使用するために、ページを読み込んでGuzzleにフィードすることができます。それは多分あなたは、単にこのように、DOMを使用することができ、あなたのニーズに依存する:
How to get element by class name?
ここではいくつかの作業コードがあります。ファントムを使用しての
$content = $this->getHeadlessReponse($url);
$this->crawler->addContent($this->getHeadlessReponse($url));
/**
* Get response using a headless browser (phantom in this case).
*
* @param $url
* URL to fetch headless
*
* @return string
* Response.
*/
public function getHeadlessReponse($url) {
// Fetch with phamtomjs
$phantomClient = PhantomClient::getInstance();
// and feed into the crawler.
$request = $phantomClient->getMessageFactory()->createRequest($url, 'GET');
/**
* @see JonnyW\PhantomJs\Http\Response
**/
$response = $phantomClient->getMessageFactory()->createResponse();
// Send the request
$phantomClient->send($request, $response);
if($response->getStatus() === 200) {
// Dump the requested page content
return $response->getContent();
}
}
唯一の欠点は、それががつがつ食うよりも遅くなりますが、もちろん、あなたはすべてのそれらの厄介なJSをロードするのを待つ必要があります。
- 1. ベストプラクティス:View Controllerの読み込みに時間がかかる場合はどうすればよいですか?
- 2. javascriptをPHPの読み込みコンテンツで使用するにはどうすればいいですか?
- 3. セレンを使用してページが読み込まれているかどうかを確認するにはどうすればよいですか?
- 4. 再生フレームワークを使って読み込みページを書くにはどうすればいいですか?
- 5. laravelでhttpsで1ページしか読み込めない場合は、どうすればよいですか?
- 6. Delphi XE4がCodeSiteを読み込まないようにするにはどうすればよいですか?
- 7. javascriptでJSESSIONIDを読み取るにはどうすればよいですか?
- 8. javascriptで特定のページの読み込みを検出するにはどうすればよいですか?
- 9. ウェブサイトの読み込みをよりきれいにするにはどうすればよいですか?
- 10. @ font-faceを使ってGoogle Webフォントを読み込むにはどうすればよいですか?
- 11. Googleタグマネージャープログラムでカスタムタグを読み込まないようにするにはどうすればよいですか?
- 12. サイトがiframeに読み込まれて親URLを取得しているかどうかを確認するにはどうすればよいですか?
- 13. cURLを使用してWebページが完全に読み込まれていることを確認するにはどうすればよいですか?
- 14. OpenCVを使ってPythonのNamedTempFileからビデオを読み込むにはどうすればいいですか?
- 15. jQuey.append()メソッドを通じて読み込まれたHTMLデータにJavaScript関数を使用するにはどうすればよいですか?
- 16. 最新バージョンのjavascriptコードがクライアント用に読み込まれていることを確認するにはどうすればよいですか?
- 17. phpを使って文字列にphpファイルを読み込むにはどうすればいいですか?
- 18. ページ読み込み前にJavascript機能を実行するにはどうすればよいですか?
- 19. ページ読み込み時にこのJavaScriptスクリプトを実行するにはどうすればよいですか?
- 20. ビューが読み込まれるたびにカウントダウンタイマーをリセットするにはどうすればよいですか?
- 21. 返されたレコードごとに結合後、熱心に読み込まれたデータを使用するにはどうすればよいですか?
- 22. FirebugでHTMLを編集して再読み込みするにはどうすればよいですか?
- 23. 宛先コントローラがナビゲーションコントローラに組み込まれている場合、セグにデータを渡すにはどうすればいいですか?
- 24. JavaScriptファイルの読み込みを延期するにはどうすればよいですか?
- 25. Javascript:オブジェクトの読み込みを「強制終了」するにはどうすればよいですか?
- 26. 必要な資産を読み込めない場合はどうすればよいですか?
- 27. CSS&Javascriptが読み込まれないようにする - WebView
- 28. 子コントローラクラスでモデルを読み込み、親クラスで使用するにはどうすればよいですか?
- 29. Scrapyを使用してファイルストリームを読み込み用に開くにはどうすればよいですか?
- 30. GuzzleでInvalidArgumentExceptionを取得するにはどうすればよいですか?
また、$ response-> getStatus()もリダイレクトの場合に301と等しいかどうかをチェックするとよいでしょう。 – thisiskelvin