16

PhantomJS を活用して、ドメイン全体をスパイダーしようとしています。www.domain.com などのルート ドメインから開始したい - すべてのリンク (a.href) をプルしてから、新しいリンクを取得するキューを作成し、クロールされていないかキューにない場合は新しいリンクをキューに追加します。 .

アイデア、助けて?

前もって感謝します!

4

3 に答える 3

20

PhantomJSの上に構築されたオープン ソースのスクレイピング ライブラリであるPjscrape (免責事項: これは私のプロジェクトです)に興味があるかもしれません。ページのスパイダー化と、進行中の各ページからの情報スクレイピングのサポートが組み込まれています。次のような短いスクリプトを使用して、サイト全体をスパイダーし、すべてのアンカー リンクを調べることができます。

pjs.addSuite({
    url: 'http://www.example.com/your_start_page.html',
    moreUrls: function() {
        // get all URLs from anchor links,
        // restricted to the current domain by default
        return _pjs.getAnchorUrls('a');
    },
    scraper: function() {
        // scrapers can use jQuery
        return $('h1').first().text();
    }
});

デフォルトでは、これは既にスパイダーされたページをスキップし、現在のドメインのリンクのみをたどりますが、これらは両方とも設定で変更できます.

于 2011-12-06T20:28:35.457 に答える
6

これは古い質問ですが、最新の素晴らしい回答はhttp://www.nightmarejs.org/ ( github: https://github.com/segmentio/nightmare )です。

ホームページから説得力のある例を引用します。

RAW PHANTOMJS:

phantom.create(function (ph) {
  ph.createPage(function (page) {
    page.open('http://yahoo.com', function (status) {
      page.evaluate(function () {
        var el =
          document.querySelector('input[title="Search"]');
        el.value = 'github nightmare';
      }, function (result) {
        page.evaluate(function () {
          var el = document.querySelector('.searchsubmit');
          var event = document.createEvent('MouseEvent');
          event.initEvent('click', true, false);
          el.dispatchEvent(event);
        }, function (result) {
          ph.exit();
        });
      });
    });
  });
});

ナイトメア:

new Nightmare()
  .goto('http://yahoo.com')
  .type('input[title="Search"]', 'github nightmare')
  .click('.searchsubmit')
  .run();
于 2015-05-22T22:03:46.293 に答える
3

まず、インデックス ページのすべてのアンカーを選択し、href 値のリストを作成します。これは、PhantomJS のドキュメント セレクターまたは jQuery セレクターを使用して行うことができます。次に、ページに新しいリンクが含まれなくなるまで、各ページに対して同じことを行います。リンクがすでに処理されているかどうかを判断できるように、すべてのリンクのマスター リストと各ページのリンクのリストが必要です。Web クローリングは木のようなものと考えることができます。ツリーのルート ノードはインデックス ページであり、子ノードはインデックス ページからリンクされたページです。各子ノードは、子ページに含まれるリンクに応じて、1 つ以上の子を持つことができます。これが役立つことを願っています。

于 2011-11-17T18:38:11.307 に答える