2017-03-08 11 views
0

私はコレクターグッズを扱うオンラインストアを運営していますが、その市場価格は消費者の需要に基づいて永続的に変動しています。多数のURL(> 30k)をスクラップするより効率的な方法はありますか?

私は最近、〜30kのURLのリストを通って動作するルビースクリプト(レーキタスク)を毎日実行して、競合他社の価格を記録し始め、関連するいくつかのデータを取り込み弾性検索インデックス。私はNokogiriとPhantomJSに依存しています。なぜなら、JavaScriptを実行しなくても、すべてのサイトが必要なデータを適切にレンダリングするわけではないからです。

私のプログラムは現在、実行中に〜4GBのメモリを消費し、PhantomJSはその大部分の消費(〜2.5GB)を占めています。スクリプトは実行に多くの時間がかかります - 私はどのくらいの時間がかかりますが、10時間以上はないと思います。

私は自分のメモリ消費量を減らし、私が掻きすることができる速度を改善する方法についての提案に非常に寛容です。私は競合他社が素晴らしいJSON APIを私に提供することを願っていますが、残念なことにそのような関係はありません。

+0

JavaScriptを使用せずにスクラップできるサイトでは、代替パスを実装します。同時実行性を高める - 実際のCPU負荷に基づいてスロットルを調整する(また、他の1.5GBはどこですか?: - /) – user2864740

+0

あなたは、インターネットで検索して見つけることができる一般的なベストプラクティスに基づいて意見を述べるように求めています。特定の情報が必要な場合は、システムとコードに関する詳細をお知らせください。 「[ask]」と「[mcve]」を参照してください。 –

+0

毎日のスクリプトを実行しないでください。適切なスロットリングを使用して、補助コードで継続的にスクレイピングを実行してください。ページが最後にチェックされた時間を記録して、n時間以内にもう一度やり直してはいけません。ネットの市民としては、他人のホストやその帯域幅を打ち負かさないことを念頭に置いてください。最後に見たときからページが変更されたかどうかを確認するには、HTTP HEADリクエストを使用します。 –

答えて

-2

(あなたが完了するのに必要な時間のために)シングルスレッドであなたのスクレーパーを実行していると仮定します。スクリプトを複数のスレッドで実行することを検討する必要があります。 https://www.tutorialspoint.com/ruby/ruby_multithreading.htm

+1

私はあなたの提案に従って複数のスレッドで実行しようとします。私はこれが全体的な実行時間を減少させる可能性が高いと思うので、なぜこの答えが下降されたのか分かりません。 –

1

スループットを低下させることなく、掻き取り速度を上げ、メモリ消費を低く抑えることができることはほとんどありません。

メモリの消費を減らすために、URLをデータ構造を介してメモリに格納するのではなく、フラットファイルまたはデータベースに保存することができます。

繰り返し回数を減らしてもデータのデータ構造を空にします。

URLをスクレイプするのにかかる平均時間が1.2秒(10 * 60 * 60/30000 = 1.2)を超えているため、順次リクエストを行っているとします。 1つのリクエストが完了するまで、コードが次のリクエストを待つため、一度に複数のリクエストに非同期的に呼び出すことができます。

Building blocks of a scalable web crawler」を参照してください。これはスケーラブルスクレイピングのほとんどの側面をカバーしています。

私はあなたのコードに関する情報がないので、私が与えることができる提案はほとんどありません。

+0

[TyphoeusとHydra](https://github.com/typhoeus/typhoeus)は、HTTPに対して特に優れた並列処理を行います。 –

+0

私は実際にメモリに多くの情報を保存するのではなく、フラットファイルを使って作業を始めました。 pdfへのリンクをありがとう - それは有用なリソースです。 –

2

最も明らかなのは、ブラウザの処理が必要なサイトを特定することと、それを必要とせずに直接リッピングすることができることです。

もう1つは、実行しているJavaScriptアプリケーションを調べて、利用しているAPIから直接必要なデータを取得する方法がないかどうかを確認することです。通常、クライアント側アプリケーション(Angular、React、Emberなど)では、サーバーと通信するJSON APIがあります。そのAPIと直接インターフェースすることができれば、実際にはデータ収集プロセスが大幅に単純化されます。HTMLを解析する必要は全くないかもしれません。

Rubyは一般的には処理の面でかなり良いですが、常に効率的なわけではありません。考慮すべき点は、JRubyとスレッドを使用するとパフォーマンスが向上する可能性があるということです。通常は、初期メモリフットプリントが高かったにもかかわらず、〜40%高速で実行されるドロップインの代替品です。

ノードを使用することの可能性を調べることもできます。jsはRubyのJavaScriptランタイムの多くに比べてかなり軽量なので、JavaScriptをフェッチ/実行するという面倒な作業をたくさんしています。 Rubyのバックエンドにコンテンツを引き渡してより多くの処理を行うことができるかなり良いプリフェッチャとして機能することさえあります。

このようなハイブリッドシステムの構築は、キューや永続化メカニズムとして機能するデータベース、RedisまたはRabbitMQ中間層では非常に簡単です。

+1

提案していただきありがとうございます。私は、ほとんどの場合、データ用のAPIを直接利用することはできませんが、ウェブサイト上のJavaScriptを調べることによって、私が取ることができるいくつかのショートカットを発見することができました掻き集める –

0

私はあなたの時間を節約し、SaaSの提供に行くと主張したいと思います。

  • は、8,000万件を超える既存製品のデータベースを使用して製品の価格およびその他のデータにアクセスできます。あなたが後にしているデータを持っていない場合は、追加することに興味があるかもしれません。
  • 80legsは、パラメータに基づいてオンデマンドのカスタムWebクロールを提供します。好きなだけ多くのURLを好きなだけ多くクロールしてから、APIまたはダッシュボード経由でデータを取得することができます。
  • Import.ioは、上に滑らかなUIを使用してカスタムクロールと抽出を提供します。 80legsのように、かなり強力な抽出組み込み。繰り返して設定し、好きなだけデータをクロールし、APIやダッシュボードで結果を取得します。

私は、あなた自身のロールを張る時間と場所があると信じています。たとえば、評価の理由からこれを独自のIPとして構築したい場合や、このクロールを組織のコアコンピタンスとみなした場合(競争上の優位性など)しかし、あなたはそれがうまく動作する必要があり、クロールのビジネスではないことを考えると、これは他の誰かの肩に立つ素晴らしい時間です。

+0

これらのリンクをありがとう、私はこの目的のためにこれらのサービスの1つを使用する可能性について検討しています。 –

関連する問題