ホームページ  >  記事  >  バックエンド開発  >  Scrapy カスタム クローラー クロール JavaScript コンテンツ

Scrapy カスタム クローラー クロール JavaScript コンテンツ

高洛峰
高洛峰オリジナル
2016-10-17 13:57:561208ブラウズ

多くの Web サイトでは JavaScript が使用されています... Web ページのコンテンツは js によって動的に生成され、一部の js イベントによってページのコンテンツが変更され、リンクが開かれることがあります。一部の Web サイトは、js なしではまったく機能せず、代わりに「」のようなメッセージを返します。開いて参照してください。

JavaScript をサポートするには 4 つのソリューションがあります:
1. 関連する JS ロジックをシミュレートするコードを作成します。
2. テストや Selenium などに広く使用されているさまざまなインターフェースと同様のインターフェースを備えたブラウザーを呼び出します。
3. インターフェースのないブラウザ、さまざまな Webkit ベースのもの、casperjs、phantomjs などを使用します。
4. JS 実行エンジンと組み合わせて、軽量のブラウザを自分で実装するのは非常に困難です。コードを通じて js ロジックをシミュレートできる場合は、このソリューションが推奨されます。たとえば、duckduckgo 検索エンジンでは、ページめくりアクションが js によってトリガーされるのは難しいようですが、2 番目のフォームに移動したときに気づきました。彼のページでは、送信後にページをめくることができるようです。試してみると、実際にそのとおりです。関連する JS ロジックをシミュレートするコードを作成するときは、まずブラウザーで JS を閉じて、実行できるかどうかを確認してください。一部のページは js なしで互換性を提供します。機能しない場合は、Chrome コンソールまたは firebug を開いて、ajax などのパッケージを送受信している可能性があります。つまり、js が何かを実行する場合は、Python コードを使用して実行をシミュレートすることもできます。 Selenium を使用する場合、効率が非常に低いという欠点があります。ブラウザがページを開くことを考慮すると、この時間は許容範囲内ですか?効率が許容できるという前提では、このソリューションは悪くありません

このソリューションのもう 1 つの側面は、Selenium がデスクトップ環境なしでは視覚的に実行できないことです。規模が大きい場合、JS のシミュレーションが不可能な場合、Selenium の効率が低すぎる場合、またはインターフェイス ブラウザーの有無にかかわらず、デスクトップ環境なしで実行する必要がある場合。いくつかのインターフェイスレス ブラウザーの一般的な状況は次のとおりです。 casperjs、phantomjs: non-py はコマンドラインから呼び出すことができ、基本的にこれらの機能が満たされているかどうかを確認することをお勧めします。 phantomjs には比較的成熟したプロトコルもあります。

2、ゴースト、スピナーなど: Python でカスタマイズされた Web キット。個人的には、スピナー コードは乱雑であると感じますが、ゴースト コードは高品質です。ただし、バグがあります。
この解決策の詳細は以下を参照してください

最後に、js をサポートする軽量のインターフェイスレス ブラウザーを実装することができます。クロールする必要があるコンテンツはたくさんあり、効率が非常に重要です。この考えをお持ちの場合は、v8 のサンプル コードを参照してください。簡単なブラウザ モデルが含まれています。 v8 では、モデルが完全に使用できないだけです。これを実現するには、これらの関数を JS エンジン (v8) と http ライブラリ上に実装する必要があります。 urllib2) 1. Web ページを開いたときに、それに含まれる js コードを取得します。 2. さまざまなイベントや DOM ツリーを含むブラウザー モデルを構築します。

Yitao が使用するショッピング価格の比較に関する記事をオンラインで見つけることができます。このクローラーは、おそらく webkit とscrapy を使用しています。

実装方法:


Scrapy は非同期ネットワーク フレームワークを使用しているため、潜在的なブロック状況に注意する必要があります。設定にItemPipelineの並列処理を設定するパラメータがあるため、パイプラインはスレッドプールで実行されると推測されます(未検証)。データベースの書き込み、ファイルの書き込みなど)、フレームワーク全体をブロックする時間のかかる操作を心配する必要はありません。また、この書き込み操作をパイプラインで非同期として実装する必要もありません。また、フレームワークの他の部分も同様です。簡単に言うと、クローラーによって生成されたリクエストはスケジューラーによってダウンロードされ、ダウンローダーがダウンロードを完了した後、応答が分析のためにクローラーに渡されます。インターネット上にある参考例には、DownloaderMiddleware に書き込まれた js サポートの一部が含まれています。これは、scrapy 公式 Web サイトのコード スニペットにも当てはまります。この方法で実装すると、フレームワーク全体とクローラーの動作がブロックされます。モードは、並列ダウンロードではなく、download-parse-download-parse になりました。これは、高い効率を必要としない小規模なクローリングでは大きな問題ではありません。より良いアプローチは、scrapy のダウンローダーに js サポートを記述することです。このような実装はインターネット上で行われます (selenium+phantomjs を使用)。ただし、サポートされるのは get リクエストのみです

Webkit を Scrapy のダウンローダーに適合させる場合、さまざまな詳細に対処する必要があります


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。