DartでスクレイピングとWebサーバーを開発する手順を書いていきます。
以下のコマンドを実行してプロジェクトを作成します。
# 環境構築
$ brew install dart
# プロジェクトのディレクトリ作成
$ dart create scraping_server
$ cd scraping_server
# 外部ライブラリの追加
$ dart pub add shelf http html
インストールしている外部パッケージは以下のものです。
scraping_server/bin/scraping_server.dart の内容を以下のように変更します。
import 'package:shelf/shelf.dart';
import 'package:shelf/shelf_io.dart' as shelf_io;
Future<Response> _handler(Request request) async {
return Response.ok("test");
}
void main() async {
var handler = const Pipeline()
.addMiddleware(logRequests())
.addHandler(_handler);
var server = await shelf_io.serve(handler, 'localhost', 3000);
}
その後、以下コマンドを実行して http://localhost:3000 にブラウザでアクセスすると、”test” の文字が表示されます。
$ dart run
これで、Webサーバーの起動ができました。
scraping_server/bin/scraping_server.dart に以下の実装を追加します。
import 'package:shelf/shelf.dart';
import 'package:shelf/shelf_io.dart' as shelf_io;
// パッケージを追加
import 'package:http/http.dart' as http;
import 'package:html/parser.dart' show parse;
import 'dart:convert';
// 関数を追加
Future _scraping() async {
final url = Uri.parse('https://en.wikipedia.org/wiki/List_of_programming_languages');
final response = await http.get(url);
final document = parse(response.body);
final items = document
.querySelectorAll('.div-col li')
.map((el) => el.text)
.toList();
return items;
}
Future<Response> _handler(Request request) async {
// 追加した関数を使用する
var items = await _scraping();
var itemsJson = jsonEncode(items);
final Map<String, String> _headers = {'Content-Type': 'application/json'};
return Response.ok(itemsJson, headers: _headers);
}
void main() async {
var handler = const Pipeline()
.addMiddleware(logRequests())
.addHandler(_handler);
var server = await shelf_io.serve(handler, 'localhost', 3000);
}
追加実装の後、 $ dart runを再実行して http://localhost:3000 にアクセスすると、 Wikipediaのページから取得したプログラミング言語一覧の文字が表示されるようになります。