スクレイピングのやり方をQ&Aサイトで質問するな

Q&Aサイト(teratail等)ではスクレイピングのやり方教えてみたいな質問が大量に出回っていますが、「スクレイピングのやり方」を人に聞くのはやめましょう。
何故ならば「Webエンジニアであれば当然持ち合わせている能力」が欠如していると捉えられます。

- そもそもWebスクレイピングの有用性
- どの辺までが合法、グレー、違法なのかの勘所
- WebサーバやHTTPリクエストに関しての仕様

という訳でスクレイピング教えてに関しては動機等の説明責任が生じます。
絶対に一言目で「おいおい、お前何がしたいんだよ？」と返ってきます。

この辺はエンジニアとしてちょっとでも活動していれば数年程度で身につきます。
逆にいうと身についてないということはこの辺、全てつきっきりで教える羽目になります。
ん〜、みっちり勉強して1ヶ月くらい？50万くらい欲しい案件ですね。

# スクレイピングのやり方を人に聞いてはならない理由

それはどうしてですか？
下記の理由です。

- 教唆や幇助で捕まる可能性があるんですが？
- もし私が逮捕されて生きていけなくなったら君が責任取ってくれんの？
- スクレイピングのやり方も知らずに人に聞きはじめるくらいの頭と知識と倫理観で？
- コンビニのアイスボックスに「裸で入った」と画像付きでツイートして勝手に人生詰みそうなのに？

下手すると教えるだけで一般的なITエンジニアさんも窮地に立たされます。
なので質問に質問が返ってくるわけです。

そこで一般的なWebエンジニアはこの辺に気を回しつつスクレイピングと付き合ってますという勘所やロジック部分の触りの箇所を解説していきます。
Webサイトを公開する際のリスクや防御方法としても覚えておいて損はないですからね。
自己責任かつ、良識的な範囲でこっそりとやってくださいね。

# スクレイピングが抱える3大問題

- 再利用性に乏しい
- サーバ負荷
- 著作権侵害

## 再利用性に乏しい

これは教えてはいけない理由ではありません。
しかし、そもそもスクレイピングは最後の手段です。
使うか使わないかを選択出来るなら、絶対「使わない」を選択するべき。

教えても「無駄」なので教えたくない。
理由はHTMLがクソだからという単純な理由です。
いや、HTML自体の構造はシンプルだし整合性が取れてて素敵な言語なんですよ。

実際に現場でデザインからHTMLを起こすコーダー的な仕事をした人ならわかりますが、
レスポンシブにしようと思ったらあれが実現できない。
2カラムにしようと思ったらあれが実現できない。

そうだ、divを被せて実現しよう！！

デザインの都合はCSSで解決するべきです。
しかしCSSの実装自体は相当頑張っていますが、親子関係の表現方法が弱く表現能力に乏しいため、ドラスティックなWebデザインの変更をCSSだけ編集して吸収仕切るという事は不可能です。
CSSフレームワークとか開き直ってHTMLにクラス名とか持たせて全部やってますね。

このようにデザインありきでHTMLの構造が変化します。
他にもWebでデータを配信する時の様式としてCSV、JSON、XMLと色々とありますが、
デザインの都合で文書構造が崩壊する言語はHTMLくらいのものです。

つまり……どういうことだってばよ？

Webサイト管理者が「そうだ、デザインを一新しよう！」と言い出した瞬間、
貴方の作ったスクレイピングを行うスクリプトは動作しないゴミになります。
スクレイピングには賞味期限が存在し、いつか動作しなくなります。

HTMLではなく、XMLやJSONというフォーマットでデータを公開しているWebサーバも数多く存在します。
これらの様式でデータを公開している人は勝手にフォーマットを変更したりしません。
止む終えなく変更という形をとったとしても、移行期間を設けたり、情報を追加する程度で留めるという風に既存のユーザにある程度配慮した作りになっていることが多いです。

まずはHTML以外の方法で情報を配信しているサービスを探すべきです。

## サーバ負荷

スクリプトを実行するだけで、情報を自動的に取得してきてまとめてくれる。
スクリプト自体は書く必要がありますが、こうした反復作業を勝手に行ってくれるスクレイピングはとても便利。
で、データを簡単に集められるようになったら次はどうするか。

for文使ってサイトの情報を根こそぎ取得して一覧を作りたくなって来ませんか？
はい、イエローカード！

1個1個のリクエスト自体は正当なものですが、
[DoS攻撃](https://ja.wikipedia.org/wiki/DoS%E6%94%BB%E6%92%83)と呼ばれる攻撃に該当します。
[岡崎市立中央図書館事件](https://ja.wikipedia.org/wiki/%E5%B2%A1%E5%B4%8E%E5%B8%82%E7%AB%8B%E4%B8%AD%E5%A4%AE%E5%9B%B3%E6%9B%B8%E9%A4%A8%E4%BA%8B%E4%BB%B6)のように負荷を考えた行儀の良い使い方でも下手したら偽計業務妨害容疑で逮捕される可能性もあります。

すぐに情報が帰ってきてほしいからと、並列で10個も20個もHTTPリクエストを飛ばし続けるようなスクリプトを書いた場合はどうなっても知りませんよ？
また、その有害ぶりから[Amazon](https://www.amazon.co.jp/gp/help/customer/display.html?nodeId=201909000)等の大手サービスは利用規約で禁止しているほどです。

AmazonやGoogleはその性質上有用な情報が詰まっているので、
数多くのユーザがこっそりスクレイピングを試みた結果、IPアドレス指定で不許可にされたり、アカウント剥奪などのペナルティを受けています。
別に公開する範囲を限定するのは違法でもなんでもありませんし、攻撃してくる輩を排除するのはWebサイト運営者の義務ですからね。

この辺の機微を感じ取れないヤツはそもそもスクレイピングをしてはいけません。
作る際には下記を遵守しましょう

- 一度アクセスしたデータはマシン上に保管し、何度もアクセスしないようにする
- 沢山のページを読み込む場合は1秒に1度程度の緩やかな頻度でアクセスすること
- サイトの利用規約をよく読む、せめてあるかないかだけでも探すこと

## 著作権侵害

例えばChrome等でWebサイトを閲覧し、Excelにコピペで貼り付けて取得したデータがあります。
この取得したデータは使い方次第では著作権侵害として訴えられます。
スクレイピングというのはWebアクセスという正当な手段を用いて取得したデータです。

ここまでは何も悪くありません。
問題はここから…「で？集めたデータで何がしたいのか？」

スクレイピングで取得したデータはすぐに「引用」の範囲を超えます。
引用の範囲が許されるのは1パラグラフ程度のものでしょう。
1ページ丸々というレベルになってくると「おいおい話が違うぞ」となってくるため裁判で揉める原因になります。

Googleなどの検索エンジンは「引用があるから合法では？」と勘違いしている人が多いのですが、
**検索エンジンは引用の範囲を大幅に超えている**ので使えません。
アメリカでは[フェアユース](https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A7%E3%82%A2%E3%83%A6%E3%83%BC%E3%82%B9)という特例を用いますし、日本でも[検索エンジン用の改正](https://ja.wikipedia.org/wiki/%E6%A4%9C%E7%B4%A2%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3#%E8%91%97%E4%BD%9C%E6%A8%A9%E3%81%A8%E3%81%AE%E9%96%A2%E4%BF%82)を行い通しています。

著作権侵害もやりたきゃ勝手に勉強してやって掴まれ、他人を巻き込むなって話です。
Webページのデータも著作物です。
ちゃんとライセンス周りを確認したり、許可とってやってくださいね。

# それでもスクレイピングやりたい、けど分からん

あなたがプログラミングスクール等で先生に聞くのはともかく、
Q&Aサイト等でバカ正直に「スクレイピング」という単語を使って質問しないようにしましょう。

スクレイピングという単語自体が嫌われているのが一つ。

もう一つは「スクレイピング」は複数の手順をひと括りにした技術という点です。
例えるなら漠然と「バスケットボールうまくなりたいです」とか聞いてくるやつに熱心に教えたい先輩はいません。
もっと具体的に「ドリブルする時にバスケットボールが手元まで上手く弾んでくれないからコツが知りたい」みたいな質問をしましょう。

スクレイピングの手順をフェイズ毎にまとめるとこんな感じです。

1. 情報の欲しいWebサイトのURLをローカルに保存する
2. お好きなプログラミング言語で、そのURLに向かってHTTPリクエストを発射
3. HTTPレスポンスとして帰ってきたHTML文字列をファイルとして保存する
4. HTMLファイルを解析して自分にとって有用なデータを抜き出す

やることはこれだけ。

もしそもそもHTTPリクエストとはなんぞや？なレベルなら
[3 Minutes Networking](http://www5e.biglobe.ne.jp/aji/3min/)という神サイトがあるので全部読んで来てください。

HTTPリクエスト飛ばす所で詰まっているなら、
「プログラミング言語 HTTPリクエスト」というワードで調べたり、
「PythonでHTTPリクエストを飛ばす方法に関して教えて欲しいのですが……」と相談すれば良いです。

HTMLからデータを抽出する箇所で詰まっているなら、
「PythonでHTMLのパースの為にXXXライブラリを入れたのですが上手く動きません」という風にしましょう。

私達は「ああ、スクレイピングか」と察しはするでしょうが、
具体的な操作への質問でしかなく、スクレイピングの要件を満たしていないのでスルーしてくれるでしょう。

もし仮に用途は何？と聞かれた場合は、
「自分の通っている大学のHPで告知がされるんですが都度見に行くのが大変でスクリプト言語化したい」等の用途でも準備しておきましょう。

スクレイピングで発生するリスクの大部分は警察に通報されなきゃ問題ありません。
自分の学校や企業等の身内のWebサイトなら管理者に「やりますよ？」って許可取ったり出来るわけですし、訴えられて逮捕なんてこともありませんしね。

# 締めの挨拶

以上、「スクレイピングのやり方をQ&Aサイトで質問するな」でした。