スクレイピング設計指南書

# 初めに

こんにちは、株式会社ZEALの@sugayuuです。

大学院ではデータ分析を専門に研究を行っていました。ジールにエンジニアとして入社したからには、さらにスキルアップしたいと考え、データ抽出のスクレイピングについて学習を進めています。 

いざ学習を初めてみて、データ抽出のコードの書き方や環境構築に対する情報はすぐに見つかりましたが、コードを書く上での前提知識についての記述が薄いと感じました。

そこで、今回はこれからWebスクレイピングを始めようと思っている人向けの有りそうで無かった指南書をまとめてみました。

<dl>
<dt>この記事の想定読者</dt>
<dd>・Webスクレイピング初学者</dd>
<dd>・コードを一通り試した人</dd>
こういう人におすすめです！

# Webスクレイピングとは

Webスクレイピングとは、「Webサイトから欲しい情報を取得するコンピュータ技術」の総称です。
例えば、「QiitaからBIツールのタグのタイトルを、毎日9時に100件収集してくれ」と上司から依頼された際に、「自動的に収集」できるようなシステムのことです。

では実際に、今回の依頼（Webサイトの要素のを自動収集するシステム）を例に、構築手順をお伝えします。

Webスクレイピングの手順
一般的にWebスクレイピングは、次の３つのステップで行います。
<dl>
<dt>3つのステップ</dt>
<dd>1.	Webサイトの調査</dd>
<dd>2.	Webサイトの取得</dd>
<dd>3.	要素の抽出</dd>
</dl>
ちなみに、これらのステップは、ウォーターフォール開発のように進めていくことが主です。

ここからは、ステップの中身を解説していきます。
 

## １．Webサイトの調査
まず、依頼されたサイトについて、下記3点の特徴を調べてください。
・「Webサイトが静的か動的か」
・「APIや公式的に公開されているCSVがないか」
・「利用規約で許可されているか」
1つずつ調べる理由を述べていきます。

### 「Webサイトが静的か動的か」
静的、動的とはWebサイトの種類です。 
静的、動的なWebサイトの特徴を下の表に示しました。
		


|　|特徴                                  | 例 |
| ------ | -------------------------------------------------| -- |
| 静的サイト |  時間や検索条件などで情報の更新がないWebサイト |会社のホームページ |
| 動的サイト| 時間や検索条件などで情報が更新されるWebサイト                                      |・気象情報の掲載Webサイト<br>・ログインサイト|

Webサイトが静的か動的か調べる理由は、開発の難しさに直結するからです。
一般的に「静的なWebサイト」よりも「動的なWebサイト」の方が環境構築・パラメータ調整などの開発 が難しく、ツールの環境設定なども高度になります。特にログインを伴うWebサイトには、動的な処理（ログイン情報を記入する、ボタンをクリックする）などの動作が伴い、専用のツールが必要になる場合も存在します。
そのため、Webサイトが静的か動的かを調べることが重要です。

### 「APIや公式的に公開されているCSV 等がないか」
こちらの理由は簡潔で、「APIや公式的に公開されているCSV 等」がある場合、Webスクレイピングでデータ抽出するよりもそちらを利用する方 が法的リスクが低いからです。
法律の専門家ではないので明言は避けますが、APIやデータファイルの利用については、少なくとも公式データファイルの利用規約に準じていると考えてよいと思います。
具体的にAPIを公開しているか気になった際は、「○○（サイトの名前）API」と検索してください。
例えば、YouTubeをスクレイピングしようとすると、ブロックされるもしくは、法的リスクがあります。
YouTubeのAPIを使いましょう。

<dl>
<dt>API公開されている主なサイト</dt>
<dd>・GoogleCloud
</dd>
<dd>・YouTube</dd>
<dd>・Facebook</dd>
<dd>・政府統計</dd>
</dl>

・利用規約でスクレイピング許可されているか
これは必ず確認してください。
「スクレイピングは禁止」と一言記載があればスクレイピング以外の方法を考えましょう。

## ２．Webサイトの取得

Webサイトの調査が完了したら、次はWebスクレイピングの根幹、Webサイトの取得です。
Webサイトの何を・どうやって取得するのかというと、WebサイトのURLにアクセスし、そのサイト内のHTMLデータをローカルにコピーします。

WebサイトのURLがあれば、サイト内のデータを取得できます。このとき「自身の使用ブラウザ（Chrome等）のヘッダーデータ」を追加することを強く推奨します。 


理由としては、Webサイト側からブロックされないようにするためです。
このヘッダーデータというのは、「Chromeからアクセスしていますよ～、私の名前は○○です」と名刺をログに残しているようなものなので、社会人マナーと同様に人様の御宅にお邪魔するときは、名乗ることが重要です。
ヘッダーデータを付与していない場合、ブロックされることが多々ありますので、名乗りたくないような理由がない限り、ヘッダーデータは絶対につけましょう。 

また、Webサイトへの配慮のお話ですが、Webスクレイピングを行うページ数が多い場合、必ず待ち時間を作り、高速なアクセスを抑制するようにしてください。
もし1秒間に1万回程度アクセスできたとしても、それをそのままWebサイトに行うとただのDOS攻撃です。
一定回数以上はブロックしてくれるようなWebサイトもありますが、もしサーバーダウンさせてしまうとあなたの責任となってしまいますので、最低限のマナーとして、待ち時間を取りましょう。

ここまで対応したらURLにアクセスしてデータをコピーしましょう。
取得元データがAPIではない場合、HTMLそのままを取得できます。HTMLとしてローカルフォルダの中に保存しておくと、元データとして手元に置いておけるので再現性が高くオススメです。

## ３．要素の抽出
HTMLとしてコピー出来たら、最後の工程は要素の抽出です。
HTMLの要素をリストやデータテーブル等に格納し、読者の好みのデータ抽出方法に沿ったセレクター（beautifulsoup、 selenium等）を使用して、データを抽出します。

要素の抽出方法は、読者が何を抽出したいのか？どのセレクターを使うのか？によって、様々なので、ここでは私が経験した失敗からデータ抽出で注意すべき2つのポイントを紹介したいと思います。
・文字コードが正しいか
・データの整合性チェックを行う。

### 文字コードが正しいか
文字コードはhtmlの属性として「utf-8」や「shift-JS」などが指定されています。
その属性を確認して出力の際に指定してあげると、後続のデータ加工などの処理が行いやすいです。

私の失敗談ですが、文字コードを事前に確認せず、見切り発車でWebスクレイピングを行っていました。しかし、後続でutf-8、shift-JSのどちらで取り込んでも文字化けしてしまいました。元サイトのHTMLを確認すると見たことない文字コードが。。。こういった手戻りが発生してしまうため、確認を推奨します。


### データの整合性チェックを行う
データの整合性チェックは、ランダムにレコードを抽出して、そのレコードの内容が一致しているかどうかを確認します。（量が多くないのであれば、初回は全数調査が望ましい。）

私の失敗談ですが、15年、20年という歴史がある日次データを収集していた際に、最新版のWebフォーマットでWebスクレイピングを行っていました。しかし、そのフォーマットは10年前に変更されたもので、15年前、20年前のデータでは複数の列が全てNULLとして保存されており、再調査となりました。
また、とあるサイトでは、情報のカテゴリーによって項目名が異なり、それ以外の項目名が同じだったため見落してしまって、カテゴリーが異なるレコードの該当列がすべてNULLとなりました。。。

__名称が異なる列の例__

|カテゴリーAのページタイトル|カテゴリーBのページタイトル|
|---|---|
|Aの名称	|Bの題名|

上のような例があるので、取得した後取得しっぱなしではなく、依頼者に提示できるようなデータになるようにテストを行いましょう。

# まとめ
今回は、Webスクレイピングを始めようと思っている人向け指南書の第1回目として、
Webスクレイピングの始め方の抽象的な概念を共有しました。
今後は、Pythonのコードを用いたWebスクレイピングの具体的な始め方を書いていきたいと思っています。

ご感想・ご指摘はコメントまでよろしくお願い致します。


# 参考
https://qiita.com/fallout/items/d213158ef42de751dbd6
https://qiita.com/nightyknite/items/b2590a69f2e0135756dc