アルゴリズムを利用したWeb スクレイピングのライブラリ Scrapely

# はじめに

この記事は `Scrapely` に関する翻訳が主です。
[README](https://github.com/scrapy/scrapely) に書かれた内容を動かしながらどんなものか確認しました。
ざっくりした内容を __秒__ で確認したい場合、この記事の項の `Scrapelyとは` と `まとめ` の２つを読むと良いです。

# Scrapelyとは

HTMLページから構造化されたデータを抽出するためのライブラリ。
サンプルのWebページの例と抽出されるデータが与えられた場合、類似したすべてのページのパーサを構築する。

`Instance Based Learning` [^1]というアルゴリズムを利用したデータの抽出を行う。[^2]


## Installation

Scrapely works in Python 2.7 or 3.3+. It requires numpy and w3lib Python packages.

```sh
pip install scrapely
```

## コマンドラインからの利用

```sh
$ python -m scrapely.tool myscraper.json
scrapely> help

ocumented commands (type help <topic>):
========================================
a             annotate      ls              s       ta
add_template  del_template  ls_annotations  scrape  td
al            help          ls_templates    t       tl

scrapely> 
```

scrapely.tool の利用は以下の通り

```sh
python -m scrapely.tool <scraper_file> [command arg ...]
```

`<scraper_file>` とは テンプレートの情報を保存するファイル名

提供されているコマンドの `a` や `ta` などはそれぞれ `annotate` `add_template` などのエイリアスコマンド。

| コマンド名     | 説明                                                                                         |
|----------------|----------------------------------------------------------------------------------------------|
| add_template   | add_template {url} [--encoding ENCODING] - (alias: ta)                                       |
| annotate       | annotate {template_id} {data} [-n number] [-f field]- add or test annotation (aliases: a, t) |
| del_template   | del_template {template_id} - delete template (alias: td)                                     |
| ls_annotations | ls_annotations {template} - list annotations (alias: al)                                     |
| ls_templates   | list templates (aliases: ls, tl)                                                             |
| scrape         | scrape {url} - scrape url (alias: s)                                                         |


### scraper の作成と テンプレートの追加

```sh
scrapely> add_template http://pypi.python.org/pypi/w3lib/1.1
[0] http://pypi.python.org/pypi/w3lib/1.1
```

### scraper から利用可能なテンプレートのリストを表示

```sh
scrapely> ls_templates
[0] http://pypi.python.org/pypi/w3lib/1.1
```

### annotation の追加をするために、選択基準のテスト

```sh
scrapely> annotate 0 "w3lib 1.1"
[0] '<h1>w3lib 1.1</h1>'
[1] '<title>Python Package Index : w3lib 1.1</title>'
```

上記コマンドでは２つの要素が取得できました

### 取得するポジションの指定

```sh
scrapely> annotate 0 "w3lib 1.1" -n 0
[0] '<h1>w3lib 1.1</h1>'
```

### テンプレートに annotation のフィールド名を追加

```sh
scrapely> annotate 0 "w3lib 1.1" -n 0 -f name
[new] (name) '<h1>w3lib 1.1</h1>'
scrapely> annotate 0 "Scrapy project" -n 0 -f author
[new] '<span>Scrapy project</span>'
```

### テンプレート内の annotation リストを表示

```sh
scrapely> ls_annotations 0
[0-0] (name) '<h1>w3lib 1.1</h1>'
[0-1] (author) '<span>Scrapy project</span>'
```

### 追加されたテンプレートを使用して、類似ページのスクレイピング

```sh
scrapely> scrape http://pypi.python.org/pypi/Django/1.3
[{'author': ['Django Software Foundation'], 'name': ['Django 1.3']}]
```

## Scrapely と Scrapy は名前が似ているけど。。

`Scrapy` はWebクローラーを構築するためのアプリケーションフレームワークだが、
`Scrapely` はHTMLページから構造化データを抽出するためのライブラリーである。 
`Scrapely` は `Scrapy` よりBeautifulSoupやlxmlに似ている。[^3]

# まとめ

通常のサイトスクレイピングではしこしこ `セレクタの指定` を記述するが、
Scrapely では `サンプルURLの指定`、`サンプルデータの指定` により類似ページのスクレイピングを可能にしていた。
この特性を利用してプログラムの知識がない人でもサイトのスクレイピングが可能になるサービス（オープンソース）が存在していた。[^4]
なるほどねーというまとめ（感想）でした。

# 最後に

本日の Friday I/O でした。
[株式会社ワムウ](http://wamw.jp/)では、毎週金曜日は 興味がある事柄に取り組み、その成果を何らかの形でアウトプットする日としています。ありがとうございました。

[^1]: [原文](http://dl.acm.org/citation.cfm?id=1265174)
[^2]: [原文](https://github.com/scrapy/scrapely#scrapely)
[^3]: [原文](https://github.com/scrapy/scrapely#how-does-scrapely-relate-to-scrapy)
[^4]: [Portia](https://scrapinghub.com/portia)