PythonでWEBスクレイピングから収集データのCSVダウンロードまで【初学者向け】

##はじめに
スクレイピングも一般的になってきて「よし！やってみよう！」と思う人が増えている一方で、いざプログラミングしようとサンプルのコードを見ても今一つ何をしようとしているかピンとこない人もいらっしゃるのではないでしょうか？

私も勉強中の身ではありますが、実際に書いたコードをもとに一行ずつ何をしているか解説・補足を入れた記事があるとPythonを始めたばかりの方には参考になるのではないと思いまして記事を作成しました。

スクレイピングの実装は、実際に動くものを手軽に実践できるので、Pythonの学習を始める取っ掛かりとしては最適だと思っています。
これからPythonを学ぶ方にとって、この記事が少しでも参考になれば幸いです。

##スクレイピングで大事なこと
手軽にできる一方で、スクレイピングを禁止しているサイトもあります。
規約で禁止されていない場合も、データの使用目的／取得時に配慮するべきことなどあります。

詳細は、下記記事が大変参考になりますので、実施する前に一読されることを強くお勧めいたします。
>[Webスクレイピングの注意事項一覧](https://qiita.com/nezuq/items/c5e827e1827e7cb29011)

##実行環境
今回の記事は、Google Colaboratoryで実行することを前提にしています。
>[Google Colaboratory](https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja)

Google ColaboratoryではPython環境が用意されていて、
すぐにPythonでプログラミングができる大変便利なサイトです。
Pythonを初めてやる方は環境構築も大変かもしれないので、すぐにプログラミングしたい方にはお勧めです。

##SeleniumとChromeDriverについて

▼Seleniumとは
WEBブラウザの操作を自動化するライブラリです。
ブラウザを立ち上げ、テキストを書いたり、クリックしたり、データを抽出したり、キャプチャを取ったり・・・・
ブラウザで色々なことができます！

▼ChromeDriverとは
Google Chromeを操作するソフト。
SeleniumでChromeを使う場合、一緒に使います。

##SeleniumとChromeDriverをインストール
以下のコードを実行します。

```python
# #はコメントアウトです
# apt-getはライブラリを扱うコマンド
# pip（Pip Installs Packages）もライブラリを扱うコマンド
# パソコンでコマンド（黒い画面）で叩くときは、冒頭の!はいれません。Google Colaboratoryでインストールすときに!を下記のようにします。

!apt-get update # パッケージリストの更新
!apt install chromium-chromedriver # インストール
!cp /usr/lib/chromium-browser/chromedriver /usr/bin # 指定のフォルダにインストールしたファイルを置く
!pip install selenium # インストール
```

####▼補足
pip install XX(ライブラリ名）でできることが多いです。
ライブラリのインストール方法は各ライブラリごとにWEB上に説明がありますので、インストール前にWEB上で確認してから実施ください。

##Seleniumのwebdriverを読み込む
以下のコードを実行します。

```python
# from モジュール名（ライブラリ名） import クラス名
from selenium import webdriver #webdriverを読み込む
import time # 一定間隔で実行するためのsleep関数があるモジュール
```

####▼補足
`import モジュール名（ライブラリ名）`とすることも可能です。
違いは、`from`の場合は、モジュール名が省略可です。
`import`の場合は、モジュール名も記載が必要で、今回の記事のクラスを使用する場合は、
`selenium.webdriver`のようにモジュール名.（ドット）クラス名となります。

##Seleniumのオプションの設定
以下のコードを実行します。

```python
# Seleniumのオプションの設定
# Google Colaboratoryの場合、以下のオプション設定が必要
# --headless　ヘッドレスモード
# --no-sandbox　コンテナの権限不足回避

options = webdriver.ChromeOptions()# optionsは変数
options.add_argument('--headless')# 設定を追加
options.add_argument('--no-sandbox')# 設定を追加
```

####▼補足
「=」は、代入です。
このケースは、
optionsという変数に、webdriverクラスのClromeOptionsメソッドを代入してます。
変数には、数字・文字からメソッドまで色々と代入が可能です。

なれないと難しいこともあるかと思いますので、こうやって使うものだと割り切ってコピペでも良いかと思います。やっているうちに理解できることも多いです。習うより慣れろの精神でやってみることも大事だと思います。

##ChromeDriverの読み込みと指定サイトへアクセス
以下のコードを実行します。

```python
# ChromeDriverを読み込み、先ほど設定したオプションをもとに変数wdに代入する。これでChromeを操作できるようになります。
wd = webdriver.Chrome('chromedriver',options=options)

# Selenium webdriverのgetメソッドで指定ページへアクセスする
wd.get("https://・・・アクセス先のURLを記載")
```

####▼補足
ローカル環境で実行する場合、`webdriver.Chrome`の引数にchromedriverを格納したパスを指定実行します。

##xpathを指定して要素を取得
以下のコードを実行します。

```python
#find_element_by_xpath（’xpath’)で取得する
wd.find_element_by_xpath('取得したXPathを記載').text
```

####▼補足：XPathの取得方法
①ページ上で右クリック → 検証をクリック 
②取得したい要素をクリックして「・・・」をクリック → Copyにマウスを合わせて Copy XPathをクリック


##ループ処理で複数のページを巡回する
以下のコードを実行します。WEBサイトのURLが整数で割り振られているものを想定しています。

```python
urls = 'URLを記載'
data_list = [] #取得するデータを入れるリスト

for i in range(50): # iには、0から1，2，3・・50と順番に入る
  try:
    nom = str(i) # データ型を合わせる（数字から文字列にする）
    wd.get(urls + nom) # 文字列を結合して巡回するULRを作成する
    data = wd.find_element_by_xpath('XPathを記載') # データを取得する
    data_list.append(data.text) #リストの最後尾にデータを追加する
    time.sleep(1) #ループごとに1秒停止させる
  except: # 何かエラーおきたらスルーさせる
    pass

data_list# リストの中身を表示させる（確認のため）
```

####▼補足
・リストは、カンマ区切りで数字も文字も入れられます。
・range関数は、for文とよく使います。
・append関数は、`リスト．append()`として、リストの最後尾にデータを追加してくれます。for文でよく使います。
・try~except文もfor文でよく使います。
・ループの最後にsleep関数の処理を入れて、サーバー負荷へ配慮します。

##pandasでデータ加工
以下のコードを実行します。

```python
import pandas as pd #pandasライブラリを読み込む
data = pd.DataFrame({'取得値':data_list}) #カラム名が取得値のテーブルデータを作成
data.to_csv('data_sample.csv') #csvファイルでダウンロード
```

####▼補足
pandasはデータ分析では必須ツールです。
技術書も多数ありますのでPythonでデータ分析をしたい方は、ぜひお気に入りの一冊を探してみてください。

##さいごに
スクレイピングに関しては、データ収集が目的の場合はスクレイピング・プログラミングしなくても収集できる方法がないか検討したうえでやるべきだと思っています。
スクレイピングは、プログラミングの勉強には最適だと思っていますので、やる際はルールを守り、アクセス先に配慮して実施しましょう。