web-dev-qa-db-ja.com

javascriptでWebクローラーを書くことは可能ですか?

ページをクロールして、それぞれのページのハイパーリンクを確認し、それらのハイパーリンクをたどってページからデータをキャプチャしたい

12
Ashwin Mendon

一般に、ブラウザのJavaScriptは、そのOriginのドメイン内でのみクロールできます。これは、ページのフェッチが Ajax を介して行われるためです。これは、 Same-Origin Policy によって制限されます。

クローラースクリプトを実行しているページがwww.example.comにある場合、そのスクリプトはwww.example.comのすべてのページをクロールできますが、クロールできません。他のオリジンのページ(エッジケースが適用される場合を除きます。たとえば、 Access-Control-Allow-Origin ヘッダーが他のサーバーのページに設定されている場合を除く)。

本当にブラウザJSでフル機能のクローラーを作成したい場合は、ブラウザ拡張機能を作成できます。たとえば、 Chrome拡張機能 はパッケージ化されたWebアプリケーションです。 cross-Origin Ajax を含む特別な権限で実行します。このアプローチの難しさは、複数のブラウザーをサポートする場合、クローラーの複数のバージョンを作成する必要があることです。 (クローラーが個人的な使用のみを目的としている場合、それはおそらく問題ではありません。)

16
apsillers

サーバーサイドのJavaScriptを使用する場合は可能です。 node.jsをご覧ください

また、クローラーの例は次のリンクにあります。

http://www.colourcoding.net/blog/archive/2010/11/20/a-node.js-web-spider.aspx

ヘッドレスWebkitを使用して、サーバー側からJavascriptを使用してページをクロールできます。クロール用に、PhantomJS、CasperJSなどのライブラリはほとんどありません。また、PhantomJSには、作業を簡単にするNightmareJSという新しいラッパーがあります。

2
Arun

JSで同一生成元ポリシーを回避する方法があります。私はFacebook用のクローラーを作成しました。これは、友人や友人の友人からFacebookプロファイルから情報を収集し、性別、現在地、年齢、婚姻状況で結果をフィルタリングできるようにしました(ドリフトをキャッチします)。簡単でした。コンソールから実行しただけです。そうすれば、スクリプトは現在のドメインでリクエストを実行する権限を取得します。ブックマークレットを作成して、ブックマークからスクリプトを実行することもできます。

別の方法は、PHPプロキシを提供することです。スクリプトは現在のドメインのプロキシにアクセスし、PHPを使用して別のドメインからファイルを要求します。これらには注意してください。これらはハイジャックされてパブリックとして使用される可能性があります。注意しない場合は、サードパーティによるプロキシ。

頑張ってください、多分あなたは私がしたようにその過程で友達を作るでしょう:-)

1
Tom

これが必要なものです http://zugravu.com/products/web-crawler-spider-scraping-javascript-regular-expression-nodejs-mongodb GUIとしてNodeJS、MongoDB、ExtJを使用します

1
user3801836

私の典型的なセットアップは、クロスオリジン特権が設定されたブラウザー拡張機能を使用することです。これにより、クローラーコードとjQueryの両方が挿入されます。

Javascriptクローラーのもう1つの見方は、phantomJSやcasperJS(ファントムの能力を高める)のようなヘッドレスブラウザーを使用することです。

1

はい、可能です

  1. NODEJS(そのサーバー側JS)を使用する
  2. NodeJSにはNPM(サードパーティモジュールを処理するパッケージマネージャー)があります
  3. NodeJSでPhantomJSを使用します(WebサイトをクロールできるサードパーティモジュールはPhantomJSです)
0
hfarazm

GoogleのChromeチームはpuppeteerをリリースしました 2017年8月、ヘッドレスと非ヘッドレスの両方に高レベルのAPIを提供するノードライブラリChrome(ヘッドレスChrome利用可能 59以降 )。

Chromiumの埋め込みバージョンを使用しているため、箱から出してすぐに機能することが保証されています。特定のChromeバージョンを使用する場合は、次のような実行可能パスをパラメーターとしてpuppeteerを起動することで使用できます。

const browser = await puppeteer.launch({executablePath: '/path/to/Chrome'});

Webページに移動してスクリーンショットを取得する例は、その単純さを示しています(GitHubページから取得)。

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('https://example.com');
  await page.screenshot({path: 'example.png'});

  await browser.close();
})();
0
Natan Streppel

これには、FirefoxGreasemonkey拡張機能を使用したクライアント側のアプローチがあります。 Greasemonkeyを使用すると、指定したURLを開くたびに実行されるスクリプトを作成できます。

ここに例があります:

次のようなURLがある場合:

http://www.example.com/products/pages/1

http://www.example.com/products/pages/2

次に、このようなものを使用して、製品リストを含むすべてのページを開くことができます(これを手動で実行してください)

var j = 0;
for(var i=1;i<5;i++)
{ 
  setTimeout(function(){
  j = j + 1;
  window.open('http://www.example.com/products/pages/ + j, '_blank');

}, 15000 * i);

}

次に、各製品リストページの新しいウィンドウですべての製品を開き、このURLをGreasemonkeyに含めるスクリプトを作成できます。

http://www.example.com/products/pages/ *

次に、各製品ページのスクリプトを使用してデータを抽出し、データを渡すWebサービスを呼び出して、ウィンドウを閉じます。

0
farhang67

Githubでサンプルのjavascriptクローラーを作成しました。

これはイベント駆動型であり、メモリ内キューを使用してすべてのリソース(つまり、URL)を格納します。

ノード環境での使用方法

var Crawler = require('../lib/crawler')
var crawler = new Crawler('http://www.someUrl.com');

// crawler.maxDepth = 4;
// crawler.crawlInterval = 10;
// crawler.maxListenerCurrency = 10;
// crawler.redisQueue = true;
crawler.start();

ここでは、JavaScriptクローラーの2つのコアメソッドを紹介します。

Crawler.prototype.run = function() {
  var crawler = this;
  process.nextTick(() => {
    //the run loop
    crawler.crawlerIntervalId = setInterval(() => {

      crawler.crawl();

    }, crawler.crawlInterval);
    //kick off first one
    crawler.crawl();
  });

  crawler.running = true;
  crawler.emit('start');
}


Crawler.prototype.crawl = function() {
  var crawler = this;

  if (crawler._openRequests >= crawler.maxListenerCurrency) return;


  //go get the item
  crawler.queue.oldestUnfetchedItem((err, queueItem, index) => {
    if (queueItem) {
      //got the item start the fetch
      crawler.fetchQueueItem(queueItem, index);
    } else if (crawler._openRequests === 0) {
      crawler.queue.complete((err, completeCount) => {
        if (err)
          throw err;
        crawler.queue.getLength((err, length) => {
          if (err)
            throw err;
          if (length === completeCount) {
            //no open Request, no unfetcheditem stop the crawler
            crawler.emit("complete", completeCount);
            clearInterval(crawler.crawlerIntervalId);
            crawler.running = false;
          }
        });
      });
    }

  });
};

これがgithubリンクです https://github.com/bfwg/node-tinycrawler 。これは、1000行のコードで記述されたjavascriptWebクローラーです。これはあなたを正しい軌道に乗せるはずです。

0
Fan Jin