JavaScriptスクレイパー:機能の概要
JavaScriptスクレイパー - JavaScript言語を使用して、どれほど複雑なロジックでも独自の本格的なスクレイパーを作成できる機能です。その際、JSスクレイパー内では標準スクレイパーの全機能も利用可能です。

特徴
A-Parserの全機能を活用することで、どれほど複雑なロジックを持つ独自のスクレイパー/レジストラ/ポスターでも作成できるようになりました。コードの記述には、ES6機能(v8エンジン)を備えたJavaScriptが使用されます。
スクレイパーのコードは最大限に簡潔で、ロジックの記述に集中できるようになっています。マルチスレッド、ネットワーク、プロキシ、結果、ログなどの処理はA-Parserが担当します。コードはスクレイパーのエディタで新しいスクレイパーを追加することで、インターフェース内で直接記述できます。また、VSCodeなどの外部エディタを使用してスクレイパーを記述することも可能です。
組み込みエディタを介してスクレイパーのコードを保存する際、自動バージョン管理が適用されます。
JavaScriptスクレイパーの利用は、ProおよびEnterpriseライセンスで可能です。
JSスクレイパーエディタへのアクセス
A-Parserをリモートで使用している場合、セキュリティ上の理由からJSスクレイパーエディタはデフォルトで無効になっています。アクセスを許可するには、以下の手順が必要です:
- Settings -> Global Settings タブでパスワードを設定する
- config/config.txt に次の行を追加する:
allow_javascript_editor: 1 - A-Parser を再起動する
操作手順
スクレイパーエディタで新しいスクレイパーを作成し、名前を指定します。デフォルトで簡単なサンプルが読み込まれるため、それをベースに独自のスクレイパー作成を素早く開始できます。
外部エディタを使用してコードを記述する場合は、/parsers/ フォルダ内にある編集対象のスクレイパーファイルを開く必要があります。インストール済みプログラムのファイル構造
コードが完成したら保存し、通常のスクレイパーとして使用します。タスクエディタで作成したスクレイパーを選択し、必要に応じてパラメータ、スレッド設定、ファイル名などを設定できます。
作成したスクレイパーはいつでも編集可能です。インターフェースに関するすべての変更は、スクレイパーリストで再度選択するか、A-Parserを再起動した後に反映されます。スクレイパーのロジックの変更は、そのスクレイパーを使用したタスクを再実行した際に適用されます。
作成された各スクレイパーにはデフォルトで標準アイコンが表示されますが、/parsers/ 内のスクレイパーフォルダに png または ico 形式の独自のアイコンを配置して追加することも可能です。
基本的な動作原理
デフォルトでは、編集可能な簡単なスクレイパーのサンプルが作成されます。
- TypeScript
- JavaScript
import { BaseParser } from 'a-parser-types';
export class JS_v2_example extends BaseParser {
static defaultConf: typeof BaseParser.defaultConf = {
version: '0.0.1',
results: {
flat: [
['title', 'HTML title'],
]
},
max_size: 2 * 1024 * 1024,
parsecodes: {
200: 1,
},
results_format: '$query: $title\\n',
};
static editableConf: typeof BaseParser.editableConf = [];
async parse(set, results) {
this.logger.put("Start scraping query: " + set.query);
let response = await this.request('GET', set.query, {}, {
check_content: ['<\/html>'],
decode: 'auto-html',
});
if (response.success) {
let matches = response.data.match(/<title>(.*?)<\/title>/i);
if (matches)
results.title = matches[1];
}
results.success = response.success;
return results;
}
}
const { BaseParser } = require("a-parser-types");
class JS_v2_example_js extends BaseParser {
static defaultConf = {
version: '0.0.1',
results: {
flat: [
['title', 'HTML title'],
]
},
max_size: 2 * 1024 * 1024,
parsecodes: {
200: 1,
},
results_format: '$query: $title\\n',
};
static editableConf = [];
async parse(set, results) {
this.logger.put("Start scraping query: " + set.query);
let response = await this.request('GET', set.query, {}, {
check_content: ['<\/html>'],
decode: 'auto-html',
});
if (response.success) {
let matches = response.data.match(/<title>(.*?)<\/title>/i);
if (matches)
results.title = matches[1];
}
results.success = response.success;
return results;
}
}
コンストラクタは各タスクに対して一度だけ呼び出されます。this.defaultConf.results と this.defaultConf.results_format は必ず設定する必要があります。その他のフィールドは任意で、デフォルト値が適用されます。
this.editableConf 配列は、A-Parserのインターフェースからユーザーが変更できる設定を定義します。以下のフィールドタイプを使用できます:
combobox- ドロップダウン選択メニュー。標準スクレイパーのプリセット選択メニューを作成することも可能です。例:
['Util_AntiGate_preset', ['combobox', 'AntiGate preset']]
combobox(複数選択可能)。パラメータ{'multiSelect': 1}を追加で指定する必要があります:
['proxyCheckers', ['combobox', 'Proxy Checkers', {'multiSelect': 1}, ['*', 'All']]]
checkbox- 2つの値(true/false)のみを持つパラメータ用のチェックボックスtextfield- テキストフィールドtextarea- 複数行入力可能なテキストエリア
parse メソッドは非同期関数であり、ブロッキング操作に対しては await を返す必要があります(これが通常の関数との唯一かつ主要な違いです)。このメソッドは、処理対象の各クエリに対して呼び出されます。set(クエリとそのパラメータを含むハッシュ)と results(結果用の空のテンプレート)が必ず渡されます。また、success フラグをセットした上で、入力された results を必ず返す必要があります。
自動バージョン管理
バージョンは Major.Minor.Revision 形式です。
- TypeScript
- JavaScript
this.defaultConf: typeof BaseParser.defaultConf = {
version: '0.1.1',
...
}
this.defaultConf = {
version: '0.1.1',
...
}
Revision(最後の数字)の値は、保存するたびに自動的に増加します。その他の値(Major、Minor)は手動で変更でき、Revision を 0 にリセットすることも可能です。
何らかの理由で Revision を手動でのみ変更したい場合は、バージョンを二重引用符 "" で囲む必要があります。
クエリの一括処理
場合によっては、キューから一度に複数のクエリを取得して一括処理する必要があるかもしれません。このモードは、組み込みスクレイパーにおいて、1回のパスで複数のキーのデータを一括でリクエストする必要がある場合に使用されます。
JSスクレイパーで同様の機能を実装するには、this.defaultConf で bulkQueries: N を指定します。ここで N は一括処理するクエリの数です。この場合、スクレイパーはクエリを N 個ずつの束で取得し、現在のイテレーションのすべてのクエリは set.bulkQueries 配列に含まれます(query.first, query.orig, query.prev などのすべての標準変数を含みます)。以下はそのような配列の例です:
[
{
"first": "test",
"prev": "",
"lvl": 0,
"num": 0,
"query": "test",
"queryUid": "6eb301",
"orig": "test"
},
{
"first": "チェック",
"prev": "",
"lvl": 0,
"num": 1,
"query": "チェック",
"queryUid": "774563",
"orig": "チェック"
},
{
"first": "third query",
"prev": "",
"lvl": 0,
"num": 2,
"query": "third query",
"queryUid": "2bc8ed",
"orig": "third query"
}
]
一括処理時の結果は results.bulkResults 配列に入力する必要があります。各要素は results オブジェクトです。results.bulkResults 内の要素は、set.bulkQueries と同じ順序で配置されます。
便利なリンク
📄️ bulkQueriesの例
組み込みスクレイパーを呼び出すbulkQueriesの使用例
🔗 例とディスカッション
JSスクレイパーの機能に関する例とディスカッションのフォーラムトピック
🔗 JSスクレイパーカタログ
リソースカタログ内のJSスクレイパー専用セクション
🔗 ES6の基本機能の概要
ES6の基本機能の概要に関するhabrahabrの記事