ページをクロールして、それぞれのページのハイパーリンクを確認し、そのハイパーリンクに従ってページからデータを取得したいJavaScriptでWebクローラを書くことは可能ですか?
答えて
サーバーサイドのJavaScriptを使用すると可能です。 あなたがのNode.js
を見てみる必要があると、クローラの例は、リンク怒鳴るで見つけることができます:
一般http://www.colourcoding.net/blog/archive/2010/11/20/a-node.js-web-spider.aspx
、ブラウザのJavaScriptが唯一のドメイン内でクロールすることができますページの取得はAjaxで行われますが、これはSame-Origin Policyによって制限されています。
クローラスクリプトを実行しているページがwww.example.comにある場合、そのスクリプトはwww.example.comのすべてのページをクロールできますが、他のすべてのページはクロールできます例えば、Access-Control-Allow-Originヘッダーは、他のサーバーのページに設定されています)。
あなた本当にはブラウザJSでのフル機能を備えたクローラを書きたい場合は、ブラウザ拡張機能を書くことができます。たとえば、Chrome extensionsはcross-origin Ajaxを含む特別な権限を持つパッケージ化されたWebアプリケーションの実行です。このアプローチの難しさは、複数のブラウザをサポートしたい場合は、複数のバージョンのクローラを作成する必要があるということです。
私の典型的な設定は、クローラーコードとjQueryの両方を注入するクロスオリジン特権を持つブラウザー拡張を使用することです。
もう一つは、Javascriptのクローラを取るJSと同一生成元ポリシーを回避する方法があります(幻の力を高め)phantomJSまたはcasperJSなどのヘッドレスブラウザ
+1。 –
を使用することです。私は友人や友人の友達からのFacebookプロフィールの情報を収集し、性別、現在の場所、年齢、武道の状態(あなたは私のドリフトを捕まえる)で結果をフィルタリングすることを許可したFacebookのクローラを書いた。それは簡単だった。私はちょうどコンソールからそれを走らせた。こうすることで、あなたのスクリプトは現在のドメインでリクエストを行うための権限を取得します。ブックマークレットを作成してブックマークからスクリプトを実行することもできます。
もう1つの方法は、PHPプロキシを提供することです。あなたのスクリプトは現在のドメイン上のプロキシにアクセスし、PHPを使用して別のクライアントにファイルをリクエストします。それらに慎重にしてください。あなたが慎重でない場合、これらは第三者によってハイジャックされ、公共の代理人として使用される可能性があります。私は:-)
を行ったよう
幸運は、多分あなたはプロセスで友人や2を作るこれは何が必要ですhttp://zugravu.com/products/web-crawler-spider-scraping-javascript-regular-expression-nodejs-mongodb 彼らはNodeJSを使用し、GUI
あなたの答えにあなたのリンクからいくつかの重要な点を引用してみてください。そうすれば、サイトがダウンしたり、コンテンツが適切なリダイレクトなしに別のURLに移動したりしても、その答えが役立ちます。 – ydaetskcoR
などのMongoDBとExtJSの私たちは、クロールできヘッドレスWebkitの助けを借りてサーバ側からJavascriptを使用してページ。クロールのために、私たちはPhantomJS、CasperJSのようなライブラリはほとんどありません。また、PhantomJSにNightmare JSという新しいラッパーがあり、作業が楽になります。
はい、それはnodeJSにおけるNPM(サードパーティのモジュールを扱うパッケージマネージャ)
- 使用NODEJS(そのサーバサイドJS)
- 可能ですウェブサイトをクロールできるのはPhantomJSです)
FirefoxのGreasemonkeyの拡張機能を使用するクライアント側のアプローチがあります。 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サービスを呼び出すとする各商品ページのスクリプト。
githubでjavascriptクローラーの例を作成しました。
イベント駆動型で、すべてのリソース(つまり、URL)を格納するためにメモリ内のキューを使用します。
どのようにここで私はちょうどあなたのjavascriptのクローラーの2コア方法を示すよあなたノード環境で
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();
を使用します。
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行のコードで書かれたjavascript Webクローラーです。 これは正しい軌道に乗るはずです。
Google's Chrome team has released puppeteer(2017年8月)、ヘッドレスと非ヘッドレスの両方のChrome(ヘッドレスChromeの利用可能なsince 59)の高レベルAPIを提供するノードライブラリ。
これはChromiumの埋め込みバージョンを使用しているため、そのままの状態で動作することが保証されています。あなたが特定のChromeバージョンを使用する場合は、パラメータとして実行可能ファイルのパスと人形遣いを起動して行うことができ、例えば:
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();
})();
- 1. javascriptで剃刀コードを書くことは可能ですか?
- 2. .netコアを使ってSOAP Webサービスを書くことは可能ですか?
- 3. Pythonでクローズドソースのアンドロイドプログラムを書くことは可能ですか?
- 4. AWKで言語パーサーを書くことは可能ですか?
- 5. vb.netやC#でアセンブリコードを書くことは可能ですか?
- 6. JSchemeでJavaクラスを書くことは可能ですか?
- 7. ロケールで成功メッセージを書くことは可能ですか?
- 8. ループするMySQLクエリを書くことは可能ですか?
- 9. AHKに関数を書くことは可能ですか?
- 10. Pandocのカスタムコンバータを書くことは可能ですか?
- 11. Javaにactive-xコンポーネントを書くことは可能ですか?
- 12. Visual Studio 2010のWebからWebアプリケーションプロジェクトを開くことは可能ですか
- 13. これはJavaScriptで可能ですか?
- 14. JavaアプリケーションでIframeのWebページを開くことは可能ですか?Netbeans
- 15. iPhoneアプリ内でJavaScriptで図形を描くことは可能ですか?
- 16. この関数をHaskellに書くことは可能ですか?
- 17. valaでシステムレベルのコードを書くことが可能です
- 18. javascriptの機能の外に警告メッセージを書くことは可能ですか?
- 19. WebサービスコールからExpandoObjectを返すことは可能ですか?
- 20. CoffeeScriptで匿名二乗関数を書くことは可能ですか?
- 21. カウントダウンなしでJMS Recieverを書くことは可能ですか?
- 22. アマゾンAPIゲートウェイのjavaでマッピングテンプレートを書くことは可能ですか
- 23. SDKなしでAndroidアプリを書くことは可能ですか?
- 24. Cで自己破壊的なプログラムを書くことは可能ですか?
- 25. PHPで 'require_once'などの代替品を書くことは可能ですか?
- 26. アンドロイドスタジオでプレーンjava/C++プログラムを書くことは可能ですか?
- 27. ChromeのJavascript REPLにWebGLを書き込むことは可能ですか?
- 28. 画像と一緒にFacebookにメモを書くことは可能ですか
- 29. Javascript:これは可能ですか?
- 30. JavaScriptをリアルタイムで実行することは可能ですか?
これはサーバー側である必要はありません。 Webアプリケーションである必要はありません(ノードを使用している場合)。 – Quentin
は確かしかし、私は、ノードが主にサーバー側の論理としてcatagorizedしなければならない私の意見ではので、ビジネスロジックを処理することを考えたいです。 –
あなたがノードでコマンドラインアプリケーションを書くことができ、およびコマンドラインアプリが問題の要件を満たしています。サーバー側ではないため、Webアプリケーションではないため(サーバー側がないため) – Quentin