Nodeを使うjsは簡単なネットワークの登り取りを実現する
14926 ワード
最近H 5ゲームのエージェントサーバを実現するため、このような良い文章(http://blog.miguelgrinberg.com/post/easy-web-scraping-with-nodejs)をトンネルして見て、加えて最近Nodeを勉強しています.jsなので、翻訳して印象を深めるつもりです.
転載は出所を明記してください:(www.cnblogs.com/xdxer)
この記事では、JavaScriptでNodeに合わせる方法を説明します.jsはネットワークからのスクリプトを書きます.
ネットワークキャプチャツール
ほとんどの場合、1つのネットワークでキャプチャされたスクリプトは、ページ全体をダウンロードし、中のデータを検索する方法だけが必要です.すべての現代言語は、Webページをダウンロードする方法を提供したり、少なくともlibraryや他の拡張パッケージを実現したりするので、これは難点ではありません.そして、HTMLのデータを正確に特定して見つけるのは難しいです.1つのHTMLページには多くのコンテンツ、レイアウト、スタイルの変数が混ざっているので、私たちが注目している部分を説明して認識するのは容易ではありません.
たとえば、次のHTMLページを考えます.
id=「data」というテーブルに表示される人名を取得する必要がある場合は、どうすればいいのでしょうか.
一般的に、Webページは文字列としてダウンロードされ、このWebページを簡単に検索し、に表示された後、で終わる文字列を取得するだけでよい.
しかし、この方法では、不正なデータが容易に取得されます.ページには別のtableがあるかもしれませんが、さらに悪いことに、元のがになり、これまでに作成した案は何も見つかりません.Webページの変化は、爬取スクリプトの失効を招きやすいと言われていますが、要素がHTMLでどのように組織されているかを明確に知ることができれば、常に爬取スクリプトを書き換える必要はありません.Webページが変更されたとき.
フロントエンドのjsコードを書いたり、jQueryを使ったりすると、CSS selectorを使ってDOMの要素を選択するのは簡単なことです.たとえば、ブラウザでは、次のような方法で簡単に名前を取得できます.
ちょっと紹介してjs
http://nodejs.org (get it here!)
JavascriptはWebブラウザに埋め込まれた言語で、Nodeに感謝します.jsエンジニアリングでは、独立して実行でき、Webサーバとしてのプログラミング言語を作成することができます.
jQueryのような既存のライブラリがたくさんあります.だからJavrscript+Nodeを使います.jsがこのようなタスクを実現するのは非常に便利です.私たちは既存のDOM要素を操作する技術を使用することができます.これらの技術はwebブラウザで比較的成熟しています.
Node.jsには多くのライブラリがあり、モジュール化されています.この例では、2つのライブラリ、request、cheerioを使用する必要があります.requestは主にそれらのページをダウンロードするために使用され、cheerioはローカルでDOMツリーを生成し、jQueryサブセットを提供して操作します.インストールNode.jsモジュールはnpm操作を必要とし、RubyのgemやPythonのeasy_に似ている.install
cheerioに関するいくつかのAPIはこのCNodeコミュニティの文章を参照することができる(https://cnodejs.org/topic/5203a71844e76d216a727d2e)
上記のコードに示すように、まずディレクトリ「scraping」を作成し、このディレクトリの下にrequestとcheerioモジュールをインストールしました.実際、nodejsのモジュールはグローバルなインストールができますが、locallyのインストールがもっと好きです.インストールの効果は下図に示しています.
次にcheerioを使用して、上記の例のnameを登る方法を見てみましょう.jsファイルjs、コードは以下の通りです.
出力は次のとおりです.
転載は出所を明記してください:(www.cnblogs.com/xdxer)
この記事では、JavaScriptでNodeに合わせる方法を説明します.jsはネットワークからのスクリプトを書きます.
ネットワークキャプチャツール
ほとんどの場合、1つのネットワークでキャプチャされたスクリプトは、ページ全体をダウンロードし、中のデータを検索する方法だけが必要です.すべての現代言語は、Webページをダウンロードする方法を提供したり、少なくともlibraryや他の拡張パッケージを実現したりするので、これは難点ではありません.そして、HTMLのデータを正確に特定して見つけるのは難しいです.1つのHTMLページには多くのコンテンツ、レイアウト、スタイルの変数が混ざっているので、私たちが注目している部分を説明して認識するのは容易ではありません.
たとえば、次のHTMLページを考えます.
<html>
<head>...</head>
<body>
<div id="content">
<div id="sidebar">
...
</div>
<div id="main">
<div class="breadcrumbs">
...
</div>
<table id="data">
<tr><th>Name</th><th>Address</th></tr>
<tr><td class="name">John</td><td class="address">Address of John</td></tr>
<tr><td class="name">Susan</td><td class="address">Address of Susan</td></tr>
</table>
</div>
</div>
</body>
</html>
id=「data」というテーブルに表示される人名を取得する必要がある場合は、どうすればいいのでしょうか.
一般的に、Webページは文字列としてダウンロードされ、このWebページを簡単に検索し、に表示された後、で終わる文字列を取得するだけでよい.
しかし、この方法では、不正なデータが容易に取得されます.ページには別のtableがあるかもしれませんが、さらに悪いことに、元のがになり、これまでに作成した案は何も見つかりません.Webページの変化は、爬取スクリプトの失効を招きやすいと言われていますが、要素がHTMLでどのように組織されているかを明確に知ることができれば、常に爬取スクリプトを書き換える必要はありません.Webページが変更されたとき.
フロントエンドのjsコードを書いたり、jQueryを使ったりすると、CSS selectorを使ってDOMの要素を選択するのは簡単なことです.たとえば、ブラウザでは、次のような方法で簡単に名前を取得できます.
$('#data .name').each(function() {
alert($(this).text());
});
ちょっと紹介してjs
http://nodejs.org (get it here!)
JavascriptはWebブラウザに埋め込まれた言語で、Nodeに感謝します.jsエンジニアリングでは、独立して実行でき、Webサーバとしてのプログラミング言語を作成することができます.
jQueryのような既存のライブラリがたくさんあります.だからJavrscript+Nodeを使います.jsがこのようなタスクを実現するのは非常に便利です.私たちは既存のDOM要素を操作する技術を使用することができます.これらの技術はwebブラウザで比較的成熟しています.
Node.jsには多くのライブラリがあり、モジュール化されています.この例では、2つのライブラリ、request、cheerioを使用する必要があります.requestは主にそれらのページをダウンロードするために使用され、cheerioはローカルでDOMツリーを生成し、jQueryサブセットを提供して操作します.インストールNode.jsモジュールはnpm操作を必要とし、RubyのgemやPythonのeasy_に似ている.install
cheerioに関するいくつかのAPIはこのCNodeコミュニティの文章を参照することができる(https://cnodejs.org/topic/5203a71844e76d216a727d2e)
$ mkdir scraping
$ cd scraping
$ npm install request cheerio
上記のコードに示すように、まずディレクトリ「scraping」を作成し、このディレクトリの下にrequestとcheerioモジュールをインストールしました.実際、nodejsのモジュールはグローバルなインストールができますが、locallyのインストールがもっと好きです.インストールの効果は下図に示しています.
次にcheerioを使用して、上記の例のnameを登る方法を見てみましょう.jsファイルjs、コードは以下の通りです.
var cheerio = require('cheerio');
$ = cheerio.load('<html><head></head><body><div id="content">
<div id="sidebar"></div><div id="main">
<div id="breadcrumbs"></div><table id="data"><tr>
<th>Name</th><th>Address</th></tr><tr><td class="name">
John</td><td class="address">Address of John</td></tr>
<tr><td class="name">Susan</td><td class="address">
Address of Susan</td></tr></table></div></div></body></html>');
$('#data .name').each(function() {
console.log($(this).text());
});
出力は次のとおりです.
$ node example.js
John
Susan
http://www.thprd.org/schedules/schedule.cfm?cs_id=15
:
var request = require('request');
var cheerio = require('cheerio');
days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'];
pools = {
'Aloha': 3,
'Beaverton': 15,
'Conestoga': 12,
'Harman': 11,
'Raleigh': 6,
'Somerset': 22,
'Sunset': 5,
'Tualatin Hills': 2
};
for (pool in pools) {
var url = 'http://www.thprd.org/schedules/schedule.cfm?cs_id=' + pools[pool];
request(url, (function(pool) { return function(err, resp, body) {
$ = cheerio.load(body);
$('#calendar .days td').each(function(day) {
$(this).find('div').each(function() {
event = $(this).text().trim().replace(/\s\s+/g, ',').split(',');
if (event.length >= 2 && (event[1].match(/open swim/i) || event[1].match(/family swim/i)))
console.log(pool + ',' + days[day] + ',' + event[0] + ',' + event[1]);
});
});
}})(pool));
}
:
$ node thprd.js
Conestoga,Monday,4:15p-5:15p,Open Swim - M/L
Conestoga,Monday,7:45p-9:00p,Open Swim - M/L
Conestoga,Tuesday,7:30p-9:00p,Open Swim - M/L
Conestoga,Wednesday,4:15p-5:15p,Open Swim - M/L
Conestoga,Wednesday,7:45p-9:00p,Open Swim - M/L
Conestoga,Thursday,7:30p-9:00p,Open Swim - M/L
Conestoga,Friday,6:30p-8:30p,Open Swim - M/L
Conestoga,Saturday,1:00p-4:15p,Open Swim - M/L
Conestoga,Sunday,2:00p-4:15p,Open Swim - M/L
Aloha,Monday,1:05p-2:20p,Open Swim
Aloha,Monday,7:50p-8:25p,Open Swim
Aloha,Tuesday,1:05p-2:20p,Open Swim
Aloha,Tuesday,8:45p-9:30p,Open Swim
Aloha,Wednesday,1:05p-2:20p,Open Swim
Aloha,Wednesday,7:50p-8:25p,Open Swim
Aloha,Thursday,1:05p-2:20p,Open Swim
Aloha,Thursday,8:45p-9:30p,Open Swim
Aloha,Friday,1:05p-2:20p,Open Swim
Aloha,Friday,7:50p-8:25p,Open Swim
Aloha,Saturday,2:00p-3:30p,Open Swim
Aloha,Saturday,4:30p-6:00p,Open Swim
Aloha,Sunday,2:00p-3:30p,Open Swim
Aloha,Sunday,4:30p-6:00p,Open Swim
Harman,Monday,4:25p-5:30p,Open Swim*
Harman,Monday,7:30p-8:55p,Open Swim
Harman,Tuesday,4:25p-5:10p,Open Swim*
Harman,Wednesday,4:25p-5:30p,Open Swim*
Harman,Wednesday,7:30p-8:55p,Open Swim
Harman,Thursday,4:25p-5:10p,Open Swim*
Harman,Friday,2:00p-4:55p,Open Swim*
Harman,Saturday,1:30p-2:25p,Open Swim
Harman,Sunday,2:00p-2:55p,Open Swim
Beaverton,Tuesday,10:45a-12:55p,Open Swim (No Diving Well)
Beaverton,Tuesday,8:35p-9:30p,Open Swim No Diving Well
Beaverton,Thursday,10:45a-12:55p,Open Swim (No Diving Well)
Beaverton,Thursday,8:35p-9:30p,Open Swim No Diving Well
Beaverton,Saturday,2:30p-4:00p,Open Swim
Beaverton,Sunday,4:15p-6:00p,Open Swim
Sunset,Tuesday,1:00p-2:30p,Open Swim/One Lap Lane
Sunset,Thursday,1:00p-2:30p,Open Swim/One Lap Lane
Sunset,Sunday,1:30p-3:00p,Open Swim/One Lap Lane
Tualatin Hills,Monday,7:35p-9:00p,Open Swim-Diving area opens at 8pm
Tualatin Hills,Wednesday,7:35p-9:00p,Open Swim-Diving area opens at 8pm
Tualatin Hills,Sunday,1:30p-3:30p,Open Swim
Tualatin Hills,Sunday,4:00p-6:00p,Open Swim
: js , , 。
, , 。