Google ColabでWebスクレイピングをする

# 1.背景 
普段の業務で特定のWebサイトから情報収集をしたい時がありますよね。
また、そのWebサイトにページネーションが施されていたり、
データが大量に存在していると、手作業で整理することは骨が折れます。。。
そんな時にはWebスクレイピングによって、情報を収集するのがGoodです。

Google ColaboでPythonを動かして、サクッとWebスクレイピングをしてみましょう！

### 補足1.Webスクレイピングとは？
Webスクレイピングは、ウェブサイトからデータを収集を自動化するための技術です。
ウェブページのHTMLなどのコンテンツを解析し必要な情報を抽出します。
一般的には、下記の3つの手順で進行します。

1.HTTPリクエストによるウェブページの取得
2.取得したHTMLからのデータ抽出
3.データの加工と保存

*Webスクレイピング行う際には、法的/倫理的に問題ない範囲で実施するように注意してください。具体的にはサイトの利用規約やWebサイトのrobots.txtを事前によく確認することをおすすめいたします。


### 補足2.Google Colabとは？
Googleが提供する無料のクラウドベースのJupyterノートブック環境です。
すぐにPythonの実行環境を用意することができます。
Googleアカウントさえあれば、無料で利用可能です。


# 2.Let's Webスクレイピング by Google Colab
## 前提.PythonでWebスクレイピングするために必要なライブラリ
- requests...httpのリクエストを実行するためのライブラリ
- beautifulsoup...HTMLからDOMベースでデータを取得するためのライブラリ

Google Colab環境でライブラリのインストール状況を確認
```
#requests
!pip freeze | grep request
=>requests==2.31.0
=>requests-oauthlib==1.3.1

#beautifulsoup
!pip freeze | grep beautiful
beautifulsoup4==4.11.2
```

## 実施すること
インターネットの賢人の方が作成くださったスクレイピング練習用のページを使って、
スクレイピングの練習をさせていただきます。
下記のURLを参考ください。

https://scraping-for-beginner.herokuapp.com/ranking/

こちらのURLにアクセスすると観光地のランキングが表示されます。
今回はこちらのランキングから観光地の名前を抽出して一覧にします。

## 手順1.HTTPリクエストによるウェブページの取得
```ruby: scraping.py
import requests
from bs4 import BeautifulSoup

url = "https://scraping-for-beginner.herokuapp.com/ranking/"
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")

# 任意で記述・確認されると良いかもしれません
# print(soup)
```
print(soup)するとhtmlが取得できています。


## 手順2.取得したHTMLからのデータ抽出
```ruby: scraping.py(追記内容抜粋)
titles = soup.find_all('h2')
for title in titles:
 print(title)
```
soupでfind_allなどのメソッドを使うことで、htmlから要素を抽出できます。
h2タグを指定して抽出していますが、特定のidやclassを指定することも可能です。
この辺りはBeautiful Soupの公式ドキュメントが参考になります。

https://tedboy.github.io/bs4_doc/

*要素を抽出する際は個人的にはXPathという指定方法が好きです。
XPathによる書き方は別の記事に書こうと思います。

また、2までの手順ではデータを表示すると周りに不要なタグが残っています。
ExcelやCSVでまとめる際には不要ですので、取り除くなど加工を施します。
いよいよ最後のプロセスです。


## 手順3.データの加工と保存
```ruby: scraping.py(追記内容抜粋)
for title in titles:
 title.span.decompose()
 print(title.text)
```

これで観光地名だけが抽出されました。
soupには抽出だけでなく、任意のタグを削除するなどの機能もあります。
こちらも詳しくは公式ドキュメントが参考になります。

## まとめ
最低限のコードで最低限のことを実現してみましたがいかがでしたでしょうか？

私ごとですが、小職は新卒時代に研修を終えて初めて行った業務が
JavaによるWebスクレイピングでした。
なので、初学者のプログラミングの勉強にも十分活用できる技術だと思います。

また、Python以外の言語にもスクレイピング用のライブラリがありますので、
普段使い慣れている言語でスクレイピングするのもいいかもしれません。
*ちなみに、Javaの場合は、JSoupというライブラリを使いました。

個人的にはBeautiful Soupは扱いやすいと感じました。
取り組もうとした処理は、だいたい公式が用意してくださっている印象です。

コードの全体像も載せておきます。
参考にしていただけましたら幸いです。

```ruby: scraping.py
import requests
from bs4 import BeautifulSoup

url = "https://scraping-for-beginner.herokuapp.com/ranking/"
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")

titles = soup.find_all('h2')
for title in titles:
 title.span.decompose()
 print(title.text)
 ```
 
# 3.QAのコーナー
## Q.freezeコマンドは何をしている？
### A.Pythonでインストールしているパッケージを確認可能です。
また、freezeの場合は、listと違いインストールされているパッケージをrequirements形式で出力することができるのでファイルに出力すればpipコマンドでのパッケージのインストールに利用可能です。

## Q.クローリングとスクレイピングの違いは？
### A.データを抽出/加工するかしないかが異なります。
クローリング: Webページから情報収集すること。
スクレイピング: Webページから情報収集するだけでなく、抽出・加工すること。

# 参考: 先人の皆さんに多大なる感謝を
### Google ColabでWebスクレイピング

https://qiita.com/safa/items/90c370ebefbecbcfecac

### Webスクレイピング入門サイト

https://scraping-for-beginner.herokuapp.com/ranking/