web-dev-qa-db-ja.com

Node.jsを使用してWebページをリアルタイムでスクレイプする

良いことは、Node.jsを使用してWebサイトのコンテンツをスクレイピングすることでした。 kayak.com のスタイルで検索を実行できる非常に高速なものを構築したいと思います。1つのクエリが複数の異なるサイトにディスパッチされ、結果がスクレイピングされ、クライアントに返されます。それらが利用可能になります。

このスクリプトはJSON形式で結果を提供するだけで、ブラウザーまたは別のWebアプリケーションで直接処理できると仮定しましょう。

いくつかの出発点:

node.jsとjqueryを使用してWebサイトをスクレイピングする

誰にもアイデアはありますか?

65
Avishai

Node.io ケーキを取るようです:-)

24
Avishai

前述のすべてのソリューションは、スクレーパーをローカルで実行することを前提としています。これは、パフォーマンスを大幅に制限することを意味します(それらを順番に、または限られたスレッドセットで実行するため)。より良いアプローチ、私見は、商業的ではあるが、既存のスクレイピンググリッドに依存することです。

以下に例を示します。

var bobik = new Bobik("YOUR_AUTH_TOKEN");
bobik.scrape({
  urls: ['Amazon.com', 'zynga.com', 'http://finance.google.com/', 'http://shopping.yahoo.com'],
  queries:  ["//th", "//img/@src", "return document.title", "return $('script').length", "#logo", ".logo"]
}, function (scraped_data) {
  if (!scraped_data) {
    console.log("Data is unavailable");
    return;
  }
  var scraped_urls = Object.keys(scraped_data);
  for (var url in scraped_urls)
    console.log("Results from " + url + ": " + scraped_data[scraped_urls[url]]);
});

ここでは、スクレイピングがリモートで実行され、結果の準備ができたときにのみコードにコールバックが発行されます(結果が利用可能になったときに結果を収集するオプションもあります)。

BobikクライアントプロキシSDKhttps://github.com/emirkin/bobik_javascript_sdk からダウンロードできます。

5
Yevgeniy

私は自分で研究を行ってきましたが、 https://npmjs.org/package/wscraper は、

cheerio.jsに基づくWebスクレイパーエージェント。コアjQueryの高速で柔軟かつ無駄のない実装。 request.jsの上に構築; http-agent.jsに触発された

使用率は非常に低い(npmjs.orgによる)が、関心のある関係者には一見の価値がある。

2
electblake

常にjQueryする必要はありません。たとえば、jsdomから返されたDOMを使用すると、必要なものを簡単に取得できます(xbrowserの問題を心配する必要がないことも考慮してください)。参照: https://Gist.github.com/1335009 それはnode.ioからまったく奪い取ることではなく、あなた自身に応じてそれを行うことができるかもしれないと言っているだけです...

1
daithi44

ES7/promisesを使用した新しい方法

通常、スクレイピングするときは、何らかの方法を使用して

  1. Webサーバー上のリソースを取得します(通常はHTMLドキュメント)
  2. そのリソースを読んで、として作業してください。
    1. DOM /ツリー構造でナビゲート可能にする
    2. sASなどのトークンドキュメントとして解析します。

ツリーとトークン解析の両方に利点がありますが、ツリーは通常かなりシンプルです。それをします。 request-promise を確認してください。以下にその仕組みを示します。

const rp = require('request-promise');
const cheerio = require('cheerio'); // Basically jQuery for node.js 

const options = {
    uri: 'http://www.google.com',
    transform: function (body) {
        return cheerio.load(body);
    }
};

rp(options)
    .then(function ($) {
        // Process html like you would with jQuery... 
    })
    .catch(function (err) {
        // Crawling failed or Cheerio 

これは cheerio を使用しています。これは、本質的に軽量のサーバー側jQuery風のライブラリです(ウィンドウオブジェクトやjsdomは必要ありません)。

Promiseを使用しているため、非同期関数でこれを記述することもできます。同期的に見えますが、ES7では非同期になります。

async function parseDocument() {
    let $;
    try {
      $ = await rp(options);
    } catch (err) { console.error(err); }

    console.log( $('title').text() ); // prints just the text in the <title>
}
1
Evan Carroll

私の使いやすい汎用スクレーパーです https://github.com/harish2704/html-scrapper Node.JS用に書かれています。事前定義されたスキーマに基づいて情報を抽出できます。スキーマ定義には、CSSセレクターとデータ抽出機能が含まれます。現在、domの解析にcheerioを使用しています。

0
harish2704

チェックアウト https://github.com/rc0x03/node-promise-parser

Fast: uses libxml C bindings
Lightweight: no dependencies like jQuery, cheerio, or jsdom
Clean: promise based interface- no more nested callbacks
Flexible: supports both CSS and XPath selectors
0
user3723412

ほとんどの答えはcheerioなどで正しいパスに見えますが、needを解析して実行するポイントに到達したらJavaScript(ala SPAなど)、次にチェックアウトします https://github.com/joelgriffith/navalia (私は著者です)。 Navaliaは、ヘッドレスブラウザーコンテキストでのスクレイピングをサポートするように構築されており、非常に高速です。ありがとう!

0
browserless