ページをクロールして、それぞれのページのハイパーリンクを確認し、それらのハイパーリンクをたどってページからデータを取得したい
12 に答える
一般に、ブラウザーの JavaScript は、そのオリジンのドメイン内でのみクロールできます。これは、ページのフェッチがAjaxを介して行われるためです。これは、 Same-Origin Policyによって制限されています。
クローラー スクリプトを実行しているページがwww.example.comにある場合、そのスクリプトは www.example.com のすべてのページをクロールできますが、他のオリジンのページはクロールできません ( Access- Control-Allow-Originヘッダーは、他のサーバーのページに設定されます)。
ブラウザー JS で完全な機能を備えたクローラーを本当に作成したい場合は、ブラウザー拡張機能を作成できます。たとえば、Chrome 拡張機能は、クロスオリジン Ajaxを含む特別なアクセス許可で実行されるパッケージ化された Web アプリケーションです。このアプローチの難しさは、複数のブラウザーをサポートする場合、複数のバージョンのクローラーを作成する必要があることです。(クローラーが個人使用のみの場合は、おそらく問題にはなりません。)
サーバーサイドのJavaScriptを使えば可能です。node.jsを見てください。
クローラーの例は、次のリンクにあります。
http://www.colourcoding.net/blog/archive/2010/11/20/a-node.js-web-spider.aspx
JS で同一生成元ポリシーを回避する方法があります。私は Facebook のクローラーを作成しました。このクローラーは、私の友人や友人の友人から Facebook のプロフィールから情報を収集し、結果を性別、現在の場所、年齢、武力の状態でフィルタリングできるようにしました (あなたは私のドリフトをキャッチします)。シンプルでした。コンソールから実行しただけです。そうすれば、スクリプトは現在のドメインでリクエストを行う権限を取得します。ブックマークからスクリプトを実行するブックマークレットを作成することもできます。
もう 1 つの方法は、PHP プロキシを提供することです。スクリプトは現在のドメインのプロキシにアクセスし、PHP を使用して別のドメインからファイルを要求します。それらには注意してください。注意しないと、これらがハイジャックされ、サード パーティによってパブリック プロキシとして使用される可能性があります。
頑張ってください。私と同じように、その過程で友達を1人か2人作るかもしれません:-)
これはあなたが必要とするものですhttp://zugravu.com/products/web-crawler-spider-scraping-javascript-regular-expression-nodejs-mongodb 彼らはNodeJS、MongoDB、およびExtJsをGUIとして使用します
私の典型的なセットアップは、クローラー コードと jQuery の両方を挿入するクロス オリジン権限セットを備えたブラウザー拡張機能を使用することです。
Javascript クローラーのもう 1 つの方法は、phantomJS や casperJS などのヘッドレス ブラウザーを使用することです (これにより、phantom の機能が強化されます)。
これには、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) を格納します。
ノード環境での使用方法
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 行のコードで記述された JavaScript Web クローラーです。これにより、正しい軌道に乗るはずです。
アクシオス+チェリオ
axiosとcheriosでこれを行うことができます。応答形式については、axios のドキュメントを確認してください。
const cheerio = require('cheerio');
const axios = require('axios');
//crawl
//get url
var url = 'http://amazon.com';
axios.get(url)
.then((res) => {
//response format
var body = res.data;
var statusCode = res.status;
var statusText = res.statusText;
var headers = res.headers;
var request = res.request;
var config = res.config;
//jquery
let $ = cheerio.load(body);
//example
//meta tags
var title = $('meta[name=title]').attr('content');
if(title == undefined || title == 'undefined'){
title = $('title').text();
}else{
title = title;
}
var description = $('meta[name=description]').attr('content');
var keywords = $('meta[name=keywords]').attr('content');
var author = $('meta[name=author]').attr('content');
var type = $('meta[http-equiv=content-type]').attr('content');
var favicon = $('link[rel="shortcut icon"]').attr('href');
}).catch(function (e) {
console.log(e);
});
Node-Fetch + Cheerio
node-fetchとcheerioでも同じことができます。
fetch(url, {
method: "GET",
}).then(function(response){
//response
var html = response.text();
//return
return html;
})
.then(function(res) {
//response html
var html = res;
//jquery
let $ = cheerio.load(html);
//meta tags
var title = $('meta[name=title]').attr('content');
if(title == undefined || title == 'undefined'){
title = $('title').text();
}else{
title = title;
}
var description = $('meta[name=description]').attr('content');
var keywords = $('meta[name=keywords]').attr('content');
var author = $('meta[name=author]').attr('content');
var type = $('meta[http-equiv=content-type]').attr('content');
var favicon = $('link[rel="shortcut icon"]').attr('href');
})
.catch((error) => {
console.error('Error:', error);
});