100日後にエンジニアになるキミ - 70日目 - プログラミング - スクレイピングについて

昨日までのはこちら

[100日後にエンジニアになるキミ - 66日目 - プログラミング - 自然言語処理について](https://qiita.com/otupy/items/5828ac7450c5ba8d6931)

[100日後にエンジニアになるキミ - 63日目 - プログラミング - 確率について1](https://qiita.com/otupy/items/0196897ae4d2134794fa)

[100日後にエンジニアになるキミ - 59日目 - プログラミング - アルゴリズムについて](https://qiita.com/otupy/items/f1a5e81633b868f3b5ed)

[100日後にエンジニアになるキミ - 53日目 - Git - Gitについて](https://qiita.com/otupy/items/0abaad82a7f3fea73f1f)

[100日後にエンジニアになるキミ - 42日目 - クラウド - クラウドサービスについて](https://qiita.com/otupy/items/d1765f1541a104ed6133)

[100日後にエンジニアになるキミ - 36日目 - データベース - データベースについて](https://qiita.com/otupy/items/7af17635d576677606dc)

[100日後にエンジニアになるキミ - 24日目 - Python - Python言語の基礎1](https://qiita.com/otupy/items/6d1e5453f530e07b7aec)

[100日後にエンジニアになるキミ - 18日目 - Javascript - JavaScriptの基礎1](https://qiita.com/otupy/items/2f71d5f9c754b29d9555)

[100日後にエンジニアになるキミ - 14日目 - CSS - CSSの基礎1](https://qiita.com/otupy/items/61a97863f6df14171994)

[100日後にエンジニアになるキミ - 6日目 - HTML - HTMLの基礎1](https://qiita.com/otupy/items/cd2315dcb38671cfded0)

今回はスクレイピングについてです。

## スクレイピングとは

`スクレイピング`とは何でしょうか？

`スクレイピング`はWEBサイトなどからデータを取得する技術のことです。

`スクレピング`自体は様々な言語で行うことができます。

### スクレイピングに必要な知識

ざっくりですが、こう言う知識があると役立ちます。

**通信の仕組み**
WEBから情報を取得するには通信を行わなければなりません。
インターネットの基本となるHTTP通信の仕組みを抑えておく必要があります。

**HTML、Javascript、CSS**
WEBサイトはHTMLとJavascriptとCSSで構成されています。
サイト内の構成要素の仕組みを抑えておく必要があります。

**全文検索と正規表現マッチ**
WEBサイトから情報を取得した際に、必要な情報だけを抜き取ります。

その際、必要な情報があるのかどうか、必要な情報と合致するのかどうかを判定する必要があります。
条件の判定をするためには正規表現の知識が必要となります。

**プログラミング言語**
WEBサイトへのアクセスや、構文解析を効率的に行うには
プログラミング全般の知識や、プログラミング言語の特性などの知識が必要となります。

**ライブラリ**
通常はどのプログラミング言語でも、スクレイピング用のツール(ライブラリ)が存在します。
1からプログラムを作成するのは非効率であり、ライブラリの使い方を習得する必要があります。

**データマイニングアルゴリズム**
情報を取得して、必要な部分だけを効率よく出力するにはデータ解析の知識が必要になります。

**DOM解析**
DOM（Document Object model）とは、XML文書を操作するための標準的な仕様のことを言います。
プログラミング言語によるXML文書の要素やテキストの操作を可能にします。
DOMとは、XML文書全体を読み込み、 文書中のあらゆる要素をツリー構造のノードとして解析する方式です。

スクレイピングではDOMの知識が必要となります。

**HTMLパーサー(パース)**
HTMLのテキスト部分だけを抜き出したり、特定タグの内容を抽出すること

### インターネットセキュリティー

WEBサイトにアクセスして情報取得をする都合、どうしてもセキュリティーの問題が付き纏います。

間違えた使い方をすると、サイトに存在を与えたり、逮捕されたりする可能性もあるので
気をつけなければなりません。

スクレイピングは便利な技術であるが、以下の点に気を付ける必要があります。

**利用規約違反**
他者のウェブサイト上の利用規約で「スクレイピング禁止」と記載されている場合に
スクレピングを行うと利用規約違反になり、損害賠償請求などがされる可能性があります。

ただし、利用規約がユーザとの間で効力を生じさせるためには、以下の措置が必要になります。
利用規約をユーザに示し取引の開始に当たり、同意クリックをさせる。

会員登録の必要がなく、誰でも見られるコンテンツを、スクレイピングする場合には
上記利用規約違反にならないとも考えられますが、日々法律は変わりますので注意が必要です。

また、スクレイピング対象のサイトが、クローラのウェブサイトのアクセスを制限するための
措置（robot.txtなど）が取られている場合にクローリングした場合には、民法上の不法行為に該当する可能性があります。

**著作権**
スクレイピングで取得するコンテンツは、膨大になることから、コンテンツ一つ一つに同意を取ることは現実的ではありません。

そのため、例外規定として、情報解析のための複製等を著作権者の同意なく行うことを認めているようです（著作権法４７条の７）。

スクレイピングによって、収集されたコンテンツを他人に譲渡する（ネット配信なども含む）行為は、著作権法上、違反とされています。

コンテンツにオリジナリティがあれば「著作物」として著作権法上、保護されます。

そのようなコンテンツをコピーしたり、自社側のサーバに保存する行為は、著作権者の同意がない限りは、著作権侵害になる行為です。

**偽計業務妨害**
一定の間隔で当該ウェブサイトにアクセスすることになりますが、その間隔が短くなると
当該サイトのサーバにかかる負荷が重くなり、正常なサイト運営を妨げることとなる場合があります。

このような場合には、当該サイト事業者の業務を妨害したとして
偽計業務妨害罪が成立する可能性があります（刑法２３３条）。

### 岡崎市立中央図書館事件

```
2010年3月頃、市民から岡崎市立図書館のウェブサイトの蔵書検索システムに対し
接続が出来ないと苦情があったようで
その後もウェブサイトの閲覧が困難になる事態が相次いだ。

同年4月15日、同図書館が迷惑なアクセスを受けていると
愛知県警岡崎署に被害届を提出し、5月25日にアクセスを行っていた男性が
蔵書検索システムに高頻度のリクエストを故意に送りつけたとして
偽計業務妨害容疑で逮捕された。
```

男性の作成したクローラに違法性はなく
図書館の蔵書検索システムに不具合が存在していた。

しかし、岡崎市立中央図書館のウェブサイトは、自治体のサイトとしては専門家でも
想像できないほどに脆弱なものであったため
市町村の怠慢と、担当者の不知などいくつもの不運が重なった事件です。

本来はお粗末な運営をしていた自治体側が悪いのですが
法律上はそうはならないこともあります。

自治体や国関係のインフラは非常に稚拙で、まともな運用がされていないことが多く
スクレピング対象としては好ましくないこともありますので
スクレピングする際は注意しましょう。


### その他の留意事項


. `Amazonの商品ページをwebスクレイピング・クローリングすることは利用規約違反ですが
法的に問題はないでしょうか？`

相手のサーバーに負荷をかけるような行為は、偽計業務妨害又は電子計算機損壊等業務妨害に該当する可能性があります。

応答があってから次の処理をするなどの動きにしておくなどの注意が必要です。

また、ページを複製しているので、私的複製の範囲を超える場合は著作権侵害の問題も生じえます。
自分で閲覧する目的やデータ解析の目的の範囲にとどめておく必要があります。

. `Amazonの商品ページをwebスクレイピング・クローリングするツールを作成し
配布・販売すること自体は利用規約違反になるでしょうか？また、法的に問題はないでしょうか？
利用規約の書き方次第ですが、ツールの利用のみ禁止されているのであれば
配布を受けてツールを利用した場合の行為が規約違反になるということになるのではないでしょうか。`

使われ方によっては業務妨害や著作権侵害の幇助犯に該当する可能性もありうると思います。




## まとめ

まずはスクレイピングをする前に注意事項を抑えておこう。
いきなりコードを走らせると大変なことになるかも知れないので。



君がエンジニアになるまであと30日

## 作者の情報
乙pyのHP：
http://www.otupy.net/

Youtube：
https://www.youtube.com/channel/UCaT7xpeq8n1G_HcJKKSOXMw

Twitter：
https://twitter.com/otupython