2

いくつかのパートナー Web サイトを自動的に定期的に閲覧するための小さなボットを作成したいと考えています。これにより、ここの多くの従業員が数時間を節約できます。

ボットは次のことができる必要があります。

  • この Web サイトに接続し、一部の Web サイトではユーザーとしてログに記録し、Web サイト上の特定の情報にアクセスして解析します。
  • ボットを当社の Web サイトに統合し、当社の Web サイトのデータを使用してその設定 (使用されているユーザーなど) を変更する必要があります。最終的には、解析情報を合計する必要があります。
  • この操作は、サーバーではなく、クライアント側で行う必要があります。

先月ダーツをやって、とても気に入りました…ダーツでやってみたいです。

しかし、私は少し迷っています。解析したい Web サイトごとに Document クラス オブジェクトを使用できますか? ヘッドレスである可能性がありますか、それとも chrome/dartium API を使用して Web ブラウザーを制御する必要がありますか (これは避けたいと思います)。

私はこのスレッドを読んでいます: https: //groups.google.com/a/dartlang.org/forum/ ? fromgroups= #!searchin/misc/crawler/misc/TkUYKZXjoEg/Lj5uoH3vPgIJ com/dart-lang/html5libは私の場合に適していますか?

4

1 に答える 1

3

これには2つの部分があります。

  1. リモートサイトからページを取得します。
  2. 解析可能なクラスにページを読み込みます。

最初の部分では、このクライアント側の実行を計画している場合、正しいヘッダーが設定されていない限り、サーバーXから提供されるページがサーバーYにページを要求できないという、クロスサイトの問題が発生する可能性があります。 。

参照:CORS with Dart、どうすれば機能させることができますか? Dartアプリケーションとクロスドメインポリシーまたは問題のサイトは、正しいCORSヘッダー を返す必要があります。

リモートサイトのクライアント側から実際にページを取得できると仮定すると、HttpRequestを使用して実際のコンテンツを取得できます。

// snippet of code...
new HttpRequest.get("http://www.example.com", (req) {
  // process the req.responseText
});

を使用することもできますHttpRequest.getWithCredentials。サイトにカスタムログインがある場合は、おそらく問題が発生します(サイトからサーバーにユーザー名とパスワードをHttpPOSTする必要がある可能性が高いためです-

これは、2番目の部分が登場するときです。コンストラクターを使用してHTMLを処理できます。DocumentFragment.html(...)これにより、反復および再帰できるノードコレクションが提供されます。以下の例は、htmlの静的ブロックに対してこれを示していますが、HttpRequest上記から返されたデータを使用することもできます。

import 'dart:html';

void main() {
  var d = new DocumentFragment.html("""
    <html>
      <head></head>
      <body>Foo</body>
    </html>
  """);

  // print the content of the top level nods
  d.nodes.forEach((node) => print(node.text)); // prints "Foo"
  // real-world - use recursion to go down the hierarchy.

}

私は(以前にスパイダーを書いたことがない)、特定の場所/深さで特定のタグを引き出して結果として合計し、<a>ハイパーリンクのURLをボットがキューに追加することを望んでいると推測していますに移動します。

于 2013-01-03T08:15:16.650 に答える