クローラーを運用するための必要な知識

# 1. 概要

## 1. 1. クローラーとは

**WEBスクレイピング**を用いて、インターネット上にあるWebサイト上の情報を定期的に**巡回するロボット**です。（巡回することをクロールといいます）

GoogleやYahooなど検索エンジンのクローラーが有名です。

## 1. 2. WEBスクレイピングとは

WEBスクレイピングとは、WEBページから情報を抽出する手法です。

1. WEBページからHTMLを取得する
1. 取得したHTMLを解析し必要な情報を抽出する

といったことを行っています。

# 2. ルール・マナー

クロールをする上で、インターネット上のWEBサイトを自由にクロールして良いわけではありません。WEBサイトに迷惑を掛けないように心掛ける必要があります。

場合によっては、アクセス拒否されWEBサイトの閲覧ができなくなったり、コンテンツを勝手に使ったということで著作権者に引っかかり法的処置が行われる可能性があります。

「うちのサイトは、クローラーでの情報収集OKです。どんどんクロールしてください」と謳っているサイトは見たことありません。基本的に、クロールすること自体が**グレーゾーン**ということを意識してください。

## 2. 1.  WEBサイトの利用規約について

WEBサイトの利用規約を確認しましょう。
**「ロボットによる...○○を禁止」や「スクレイピングを禁止」** のようなことが書いている場合があるので、その規約に準拠するようにしましょう。

ちなみにQiitaは、スクレイピング禁止とのことです。

https://help.qiita.com/ja/articles/qiita-api

> ### スクレイピングについて
> スクレイピングはサーバーの負荷上昇への懸念があるため、Qiitaへのスクレイピングは許可しておりません。





## 2. 2. robots.txtについて

**robots.txt**とは、検索エンジンのクローラーに対して、サイトのどの URL にアクセスして良いかを伝えるものです。

**User-Agent**(クローラー名)に対して、**Disallow**(クロール禁止)、**Allow**(クロール指示)が記載されています。基本的には、User-Agentが＊(アスタリスク)の場合だとすべてのクローラーが対象なので、その指定に準拠するようにしましょう。

## 2. 3. サイトマップについて

サイトマップとは、サイト全体のページ構成を地図のように一覧で記載しているページのことです。

基本的には、検索エンジンのクローラーにデータ収集して貰い、検索結果に載せるための**SEO対策が目的**です。

すべてのクローラーに対して許可しているわけではないので、ご注意してください。

## 2. 4. クローラーの巡回タイミングとクロール速度について

クローラーの巡回の頻度が高いと、DoS攻撃という過剰なアクセスやデータを送信するサイバー攻撃になってしまいます。

そのため、一般的には以下の頻度でクロールすれば良いとされていますが、**個人的には、サイトの更新頻度に合わせて、もっと間隔をあけてクロールするほうが良いと思います。**

- クローラーの巡回（同じコンテンツへのアクセス）は、3日〜1ヶ月に1回
- クロール速度（1秒間のリクエスト数）は、5回

## 2. 5. APIが配信されている場合

WEBサイトによってはAPIで情報配信している場合があります。
その場合は、わざわざクロールせずにAPIを利用するようにしましょう。


# 3. コンテンツ（HTML）の取得方法

コンテンツ（HTML）の取得方法は、2種類あります。
- ブラウザ表示する際の**変化前のHTML**
- 非同期処理後や画面操作後などの**変化後のHTML**

## 3. 1. 変化前HTMLの取得方法

**HTTPリクエスト**を用いることで簡単にHTMLを取得できます。
欠点としては、非同期処理後や画面操作後のページには対応できません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473097/6dd89a16-ab91-7b61-c52b-652ffb6b8309.png)



## 3. 2. 変化後HTMLの取得方法

Chromiumなど **仮想ブラウザ（ヘッドレスブラウザ）** を用いることでブラウザを操作し、非同期処理後や操作後のHTMLを取得できます。

仮想ブラウザ（ヘッドレスブラウザ）とは、GUIをもたないブラウザで、プログラムで操作できるためスクレイピング以外にもテストなどでも用いられます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473097/ac46b3ba-e9b3-5525-878c-35488b470e78.png)


# 4. HTMLから必要な情報を取り出す

取得したHTMLから必要な情報を取り出す必要があり、その方法を紹介します。


## 4. 1. CSSセレクタを用いて情報取得

HTMLの要素から、**CSSセレクタ**を用いて情報を取得します。

```html
<div class="tel">Tel: 000-0000-0000</div>
```

↓　class属性が"tel"を取得（CSSセレクタ：`.tel`）

```
Tel: 000-0000-0000
```

## 4. 2. 正規表現を用いて情報取得

**正規表現**を用いて必要な部分のみ情報を取得します。

```
Tel: 000-0000-0000
```

↓　電話番号部分だけ取得（正規表現：`\d{3}-\d{4}-\d{4}`）

```
000-0000-0000
```


# 5. クロールしたデータの使い道

## 5. 1. データの整備

取得した情報を再利用するために整備します。

- 同一の情報をまとめる**名寄せ**
- 不完全な情報を検出して修正や削除などを行う**クレンジング**
- 足りないデータを補う**データ付与**

## 5. 2. データの再利用

収集するだけでは、クロールの意味がありません。
データ再利用することで、やっと意味があります。


- 様々なサービスでの活用
- データの分析

ただし、
「収集元のサイトに許可を取っていること」や
「収集元のサイトに利益をもたらすこと」を意識するが必須だと考えています。

要するに**Win-Winな関係**になっておきましょう!!

# 6. スクレイピングに関するツール

上記項目は、クロール方法や解析方法について説明しましたが、
下記のツールを利用することで、簡単に環境が構築することができます。
例としていくつか挙げておきます。

## 6. 1. 仮想ブラウザ（ヘッドレスブラウザ）

- Chromium
- PhantomJS

など

## 6. 2. フレームワークやライブラリ

- Selenium
- Puppeteer
- BeautifulSoup
- Nokogiri

など


# 7. 終わりに

クロールやスクレイピングについてざっくりと説明しましたが、
気が向いたら深堀した内容を説明する記事を書きたいと思います。

以上、ここまで読んでいただきありがとうございました。