cheerio-httpcli
Advanced tools
Comparing version 0.6.3 to 0.6.4
@@ -0,1 +1,6 @@ | ||
# 0.6.4 (2016-02-05) | ||
* `fetch()`時に`get-param`を省略して`encode`を指定した時の引数調整がおかしかったのを修正 | ||
* `fetch()`のエンコーディング指定オプションの説明をREADME.mdに追加 | ||
# 0.6.3 (2016-02-01) | ||
@@ -2,0 +7,0 @@ |
@@ -16,2 +16,5 @@ #!/usr/bin/env node | ||
// [重要] google検索の場合はfollowMetaRefreshをfalseにする(README.md参照) | ||
client.followMetaRefresh = false; | ||
console.log('--- Bingで検索 ---'); | ||
@@ -18,0 +21,0 @@ var result1 = client.fetchSync('http://www.bing.com/search', { q: word }); |
@@ -437,3 +437,9 @@ /*eslint key-spacing:0, dot-notation:0*/ | ||
callback = encode; | ||
encode = null; | ||
if (typeOf(param) === 'string') { | ||
// 第3引数が文字列 => paramが省略されてencodeが指定されている | ||
encode = param; | ||
param = null; | ||
} else { | ||
encode = null; | ||
} | ||
} else if (typeOf(param) === 'function') { | ||
@@ -440,0 +446,0 @@ callback = param; |
{ | ||
"name": "cheerio-httpcli", | ||
"version": "0.6.3", | ||
"version": "0.6.4", | ||
"description": "http client module with cheerio & iconv(-lite) & promise", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
@@ -27,2 +27,26 @@ # cheerio-httpcli - Node.js用WEBスクレイピングモジュール | ||
## サンプル | ||
```js | ||
var client = require('cheerio-httpcli'); | ||
// Googleで「node.js」について検索する。 | ||
var word = 'node.js'; | ||
client.fetch('http://www.google.com/search', { q: word }, function (err, $, res, body) { | ||
// レスポンスヘッダを参照 | ||
console.log(res.headers); | ||
// HTMLタイトルを表示 | ||
console.log($('title').text()); | ||
// リンク一覧を表示 | ||
$('a').each(function (idx) { | ||
console.log($(this).attr('href')); | ||
}); | ||
}); | ||
``` | ||
同梱の「example/google.js」はGoogle検索結果の一覧を取得するサンプルです。参考にしてください。 | ||
## インストール | ||
@@ -66,3 +90,3 @@ | ||
### fetch(url[, get-param, callback]) | ||
### fetch(url[, get-param, encode, callback]) | ||
@@ -78,28 +102,31 @@ `url`で指定したWEBページをGETメソッドで取得し、文字コードの変換とHTMLパースを行い`callback`関数に返します。 | ||
GET時にパラメータを付加する場合は第2引数の`get-param`に連想配列で指定します。 | ||
#### 各種引数の指定 | ||
##### サンプル | ||
* GET時にパラメータ(`?foo=bar&hoge=fuga`)を付加する場合は第2引数の`get-param`に連想配列で指定します。 | ||
* 予め取得対象のWEBページのエンコーディングが分かっている場合は`encode`に`sjis`や`euc-jp`などの文字列をセットすることで自動判定による誤判定(滅多に発生しませんが)を防止することができます。 | ||
* `get-param`、`encode`、場合によっては`callback`も省略可能です。 | ||
```js | ||
var client = require('cheerio-httpcli'); | ||
```js | ||
// get-paramとencodeを省略 => GETパラメータ指定なし & エンコーディング自動判定 | ||
client.fetch('http://hogehoge.com/fuga.html', function (err, $, res, body) { | ||
... | ||
}); | ||
// Googleで「node.js」について検索する。 | ||
var word = 'node.js'; | ||
// get-paramを省略 => GETパラメータ指定なし & エンコーディング指定(sjis) | ||
client.fetch('http://hogehoge.com/fuga.html', 'sjis', function (err, $, res, body) { | ||
... | ||
}); | ||
client.fetch('http://www.google.com/search', { q: word }, function (err, $, res, body) { | ||
// レスポンスヘッダを参照 | ||
console.log(res.headers); | ||
// encodeを省略 => GETパラメータ指定(?foo=bar) & エンコーディング自動判定 | ||
client.fetch('http://hogehoge.com/fuga.html', { foo: 'bar' }, function (err, $, res, body) { | ||
... | ||
}); | ||
// HTMLタイトルを表示 | ||
console.log($('title').text()); | ||
// url以外全部省略 => GETパラメータ指定なし & エンコーディング自動判定 & プロミス形式(後述) | ||
client.fetch('http://hogehoge.com/fuga.html') | ||
.then(function (result) { | ||
... | ||
}); | ||
``` | ||
// リンク一覧を表示 | ||
$('a').each(function (idx) { | ||
console.log($(this).attr('href')); | ||
}); | ||
}); | ||
``` | ||
同梱の「example/google.js」はGoogle検索結果の一覧を取得するサンプルです。参考にしてください。 | ||
#### プロミス形式での呼び出し | ||
@@ -106,0 +133,0 @@ |
@@ -362,3 +362,3 @@ /*eslint-env mocha*/ | ||
it('#ダウンロードマネージャー未設定', function (done) { | ||
it('ダウンロードマネージャー未設定', function (done) { | ||
cli.download.removeAllListeners('ready'); | ||
@@ -365,0 +365,0 @@ cli.fetch(helper.url('img', 'index'), function (err, $, res, body) { |
@@ -99,2 +99,26 @@ /*eslint-env mocha*/ | ||
}); | ||
it('fetch時にエンコーディング指定 => shift_jisとして処理される', function (done) { | ||
var url = helper.url('unknown', 'shift_jis'); | ||
cli.fetch(url, {}, 'sjis', function (err, $, res, body) { | ||
assert.deepEqual($.documentInfo(), { | ||
url: url, | ||
encoding: 'sjis' | ||
}); | ||
assert($('title').text() === '1'); | ||
done(); | ||
}); | ||
}); | ||
it('fetch時にエンコーディング指定(param省略) => shift_jisとして処理される', function (done) { | ||
var url = helper.url('unknown', 'shift_jis'); | ||
cli.fetch(url, 'sjis', function (err, $, res, body) { | ||
assert.deepEqual($.documentInfo(), { | ||
url: url, | ||
encoding: 'sjis' | ||
}); | ||
assert($('title').text() === '1'); | ||
done(); | ||
}); | ||
}); | ||
}); |
@@ -10,19 +10,89 @@ /*eslint-env mocha*/ | ||
describe('redirect', function () { | ||
describe('30x', function () { | ||
it('documentInfoにリダイレクト先のURLが登録される', function (done) { | ||
var url = helper.url('manual', 'euc-jp'); | ||
cli.fetch(helper.url('~redirect'), function (err, $, res, body) { | ||
assert($.documentInfo().url === url); | ||
done(); | ||
describe('async', function () { | ||
describe('30x', function () { | ||
it('documentInfoにリダイレクト先のURLが登録される', function (done) { | ||
var url = helper.url('manual', 'euc-jp'); | ||
cli.fetch(helper.url('~redirect'), function (err, $, res, body) { | ||
assert($.documentInfo().url === url); | ||
done(); | ||
}); | ||
}); | ||
it('POST送信後にクッキーがセットされリダイレクト先に飛ぶ', function (done) { | ||
var url = helper.url('manual', 'euc-jp'); | ||
cli.fetch(helper.url('form', 'utf-8') + '?reset_trace_route', function (err, $, res, body) { | ||
$('form[name=login]').submit(function (err, $, res, body) { | ||
assert(typeOf(res.cookies) === 'object'); | ||
assert(res.cookies.user === 'guest'); | ||
assert($.documentInfo().url === url); | ||
assert.deepEqual(JSON.parse(res.headers['trace-route']), [ | ||
'/form/utf-8.html?reset_trace_route', | ||
'/~redirect', | ||
'/manual/euc-jp.html' | ||
]); | ||
done(); | ||
}); | ||
}); | ||
}); | ||
}); | ||
it('POST送信後にクッキーがセットされリダイレクト先に飛ぶ', function (done) { | ||
var url = helper.url('manual', 'euc-jp'); | ||
cli.fetch(helper.url('form', 'utf-8') + '?reset_trace_route', function (err, $, res, body) { | ||
$('form[name=login]').submit(function (err, $, res, body) { | ||
assert(typeOf(res.cookies) === 'object'); | ||
assert(res.cookies.user === 'guest'); | ||
describe('meta refresh', function () { | ||
beforeEach(function () { | ||
cli.followMetaRefresh = true; | ||
}); | ||
it('meta[refresh]タグを検知してリダイレクト先に飛ぶ(絶対URL)', function (done) { | ||
var url = helper.url('refresh', 'absolute'); | ||
cli.fetch(url, function (err, $, res, body) { | ||
assert($.documentInfo().url === helper.url('~info')); | ||
assert(res.headers.referer === url); | ||
done(); | ||
}); | ||
}); | ||
it('meta[refresh]タグを検知してリダイレクト先に飛ぶ(相対URL)', function (done) { | ||
var url = helper.url('refresh', 'relative'); | ||
cli.fetch(url, function (err, $, res, body) { | ||
assert($.documentInfo().url === helper.url('~info')); | ||
assert(res.headers.referer === url); | ||
done(); | ||
}); | ||
}); | ||
it('followMetaRefresh:false => meta[refresh]タグがあってもリダイレクトしない', function (done) { | ||
cli.followMetaRefresh = false; | ||
var url = helper.url('refresh', 'absolute'); | ||
cli.fetch(url, function (err, $, res, body) { | ||
assert($.documentInfo().url === url); | ||
assert.deepEqual(JSON.parse(res.headers['trace-route']), [ | ||
done(); | ||
}); | ||
}); | ||
it('IE条件コメント内のmeta[refresh]タグはリダイレクト対象外', function (done) { | ||
var url = helper.url('refresh', 'ie-only'); | ||
cli.fetch(url, function (err, $, res, body) { | ||
assert($.documentInfo().url === url); | ||
assert($('title').text() === 'Refresh IE only'); | ||
done(); | ||
}); | ||
}); | ||
}); | ||
}); | ||
describe('sync', function () { | ||
describe('30x', function () { | ||
it('documentInfoにリダイレクト先のURLが登録される', function () { | ||
var url = helper.url('manual', 'euc-jp'); | ||
var result = cli.fetchSync(helper.url('~redirect')); | ||
assert(result.$.documentInfo().url === url); | ||
}); | ||
it('POST送信後にクッキーがセットされリダイレクト先に飛ぶ', function (done) { | ||
var url = helper.url('manual', 'euc-jp'); | ||
cli.fetch(helper.url('form', 'utf-8') + '?reset_trace_route', function (err, $, res, body) { | ||
var result = $('form[name=login]').submitSync(); | ||
assert(typeOf(result.response.cookies) === 'object'); | ||
assert(result.response.cookies.user === 'guest'); | ||
assert(result.$.documentInfo().url === url); | ||
assert.deepEqual(JSON.parse(result.response.headers['trace-route']), [ | ||
'/form/utf-8.html?reset_trace_route', | ||
@@ -36,42 +106,34 @@ '/~redirect', | ||
}); | ||
}); | ||
describe('meta refresh', function () { | ||
beforeEach(function () { | ||
cli.followMetaRefresh = true; | ||
}); | ||
describe('meta refresh', function () { | ||
beforeEach(function () { | ||
cli.followMetaRefresh = true; | ||
}); | ||
it('meta[refresh]タグを検知してリダイレクト先に飛ぶ(絶対URL)', function (done) { | ||
var url = helper.url('refresh', 'absolute'); | ||
cli.fetch(url, function (err, $, res, body) { | ||
assert($.documentInfo().url === helper.url('~info')); | ||
assert(res.headers.referer === url); | ||
done(); | ||
it('meta[refresh]タグを検知してリダイレクト先に飛ぶ(絶対URL)', function () { | ||
var url = helper.url('refresh', 'absolute'); | ||
var result = cli.fetchSync(url); | ||
assert(result.$.documentInfo().url === helper.url('~info')); | ||
assert(result.response.headers.referer === url); | ||
}); | ||
}); | ||
it('meta[refresh]タグを検知してリダイレクト先に飛ぶ(相対URL)', function (done) { | ||
var url = helper.url('refresh', 'relative'); | ||
cli.fetch(url, function (err, $, res, body) { | ||
assert($.documentInfo().url === helper.url('~info')); | ||
assert(res.headers.referer === url); | ||
done(); | ||
it('meta[refresh]タグを検知してリダイレクト先に飛ぶ(相対URL)', function () { | ||
var url = helper.url('refresh', 'relative'); | ||
var result = cli.fetchSync(url); | ||
assert(result.$.documentInfo().url === helper.url('~info')); | ||
assert(result.response.headers.referer === url); | ||
}); | ||
}); | ||
it('followMetaRefresh:false => meta[refresh]タグがあってもリダイレクトしない', function (done) { | ||
cli.followMetaRefresh = false; | ||
var url = helper.url('refresh', 'absolute'); | ||
cli.fetch(url, function (err, $, res, body) { | ||
assert($.documentInfo().url === url); | ||
done(); | ||
it('followMetaRefresh:false => meta[refresh]タグがあってもリダイレクトしない', function () { | ||
cli.followMetaRefresh = false; | ||
var url = helper.url('refresh', 'absolute'); | ||
var result = cli.fetchSync(url); | ||
assert(result.$.documentInfo().url === url); | ||
}); | ||
}); | ||
it('IE条件コメント内のmeta[refresh]タグはリダイレクト対象外', function (done) { | ||
var url = helper.url('refresh', 'ie-only'); | ||
cli.fetch(url, function (err, $, res, body) { | ||
assert($.documentInfo().url === url); | ||
assert($('title').text() === 'Refresh IE only'); | ||
done(); | ||
it('IE条件コメント内のmeta[refresh]タグはリダイレクト対象外', function () { | ||
var url = helper.url('refresh', 'ie-only'); | ||
var result = cli.fetchSync(url); | ||
assert(result.$.documentInfo().url === url); | ||
assert(result.$('title').text() === 'Refresh IE only'); | ||
}); | ||
@@ -78,0 +140,0 @@ }); |
343794
6010
1044
93