seleniumを使ってQiitaのview数をカウントする

##はじめに
私はつい最近Qiitaを始めました。自分の記事がどのくらい人の目に触れたか、気になるものです。なので毎日のように記事のビュー数を確認していました。

<img width="263" alt="WS000056.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/276021/c31582e2-df95-e5b7-ddb2-8112b7e161f4.jpeg">

しかし、記事が10本くらいになると、それぞれの記事を開いてビューを確認して…という作業が面倒になってきました。
そこで、seleniumを使ってQiitaのview数をカウントし、CSVファイルに出力するプログラムを作りました。

##参考にしたもの
- [退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング](https://www.amazon.co.jp/%E9%80%80%E5%B1%88%E3%81%AA%E3%81%93%E3%81%A8%E3%81%AFPython%E3%81%AB%E3%82%84%E3%82%89%E3%81%9B%E3%82%88%E3%81%86-%E2%80%95%E3%83%8E%E3%83%B3%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%81%AB%E3%82%82%E3%81%A7%E3%81%8D%E3%82%8B%E8%87%AA%E5%8B%95%E5%8C%96%E5%87%A6%E7%90%86%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-Al-Sweigart/dp/487311778X)
- [PythonによるWebスクレイピング入門](https://www.udemy.com/python-scraping-beginner/learn/v4/overview) （Udemyの講座）

##準備
※環境はwindows10

- seleniumのインストール ：`pip install selenium`
- webdriver(Chrome)のインストール：[こちら](pip install selenium)
- webdriverを格納したパスを環境変数に登録    

##ソース

まずは、ライブラリのインポート

```python
from selenium import webdriver
import time
import datetime
import csv
```

続いて、Qiitaのマイページを開きます。

```python
browser = webdriver.Chrome()
browser.get('https://qiita.com/<マイページ>')
```

マイページにはこんな感じで記事が並んでいます。
![WS000054.JPG](https://qiita-image-store.s3.amazonaws.com/0/276021/b42839d4-32f3-da91-dd97-c07e986c6a92.jpeg)

このリストは'tableList'というクラス名がついているので、まずはクラス名でリストを指定し、その中のリンクの要素（'u-link-no-underline'）をすべて取得します。
続いて、もう一つブラウザを開きます。このあとで記事のリンクを一つずつ開いていくのですが、マイページを開いた状態でキープしておかないとうまく動かなかったので、記事は別ブラウザで開くことにしました。

```python
# 記事のリストを取得
articles = browser.find_element_by_class_name('tableList').find_elements_by_class_name('u-link-no-underline')
subBrowser = webdriver.Chrome()  
```

以下はCSVファイルを出力するための準備です。日々の記録をつけていくので、ファイルは追記モード'a'で開きます。実行日付をファイルに書き込むために、変数dateを定義します。

```python
# 出力用ファイルをオープン
f = open('QiitaLog.csv', 'a')
writer = csv.writer(f, lineterminator='\n')
datetime = datetime.date.today() # 日付 
date = datetime.strftime("%Y/%m/%d")
```

ここからは、記事のリストをループしながら記事を一つずつ開き、ビュー数を取得し、CSVファイルに書き込む処理です。loginという関数はこの後で定義します。

```python
for article in articles:
    count = []
    # リンク、テキストを取得
    url = article.get_attribute('href')
    text = article.text
    
    # 新しいブラウザで開く
    subBrowser.get(url) 
    
    # まだログインしていない場合はログイン
    try:
        subBrowser.find_element_by_class_name('st-Header_loginLink')
        login(subBrowser)
    except:
        pass
    
    # ビュー数をカウント
    time.sleep(2)
    views = subBrowser.find_element_by_class_name('it-Header_pv')
    views_count = int(views.text.replace(' views', ''))
    
    # 日付、テキスト、リンク、ビュー数を配列に格納
    count.append(date)
    count.append(text)
    count.append(url)
    count.append(views_count)
   
    # CSVファイルに書き込み
    writer.writerow(count)
```

ループが終わったらファイルをクローズし、ブラウザも閉じます。

```python
# ファイルクローズ
f.close()    

# ブラウザを閉じる
subBrowser.close()
browser.close()
```
最後にlogin関数の定義です。新しいブラウザで開いたときはログインしないとview数が見られないので、ログインの処理を作成します。ページ右上のログインボタンを押し、googleのアカウントを使ってログインします。xxxxには自分のメールアドレス、パスワードを設定します。

![WS000057.JPG](https://qiita-image-store.s3.amazonaws.com/0/276021/9868df66-0810-dcd2-3955-159cb2e176f3.jpeg)


```python
def login(browser):
    # ログイン
    browser.find_element_by_class_name('st-Header_loginLink').click()

    # googleアカウント
    browser.find_element_by_class_name('btn-google-inverse').click()
    time.sleep(2)
    browser.find_element_by_id('identifierId').send_keys('xxxx@gmail.com')
    browser.find_element_by_class_name('CwaK9').click()    
    
    time.sleep(2)
    browser.find_element_by_name('password').send_keys('xxxx')
    browser.find_element_by_class_name('CwaK9').click()
```
##実行結果
以下のフォーマットでCSVファイルに出力されます。なお、あらかじめヘッダだけのファイルを作成しておく必要があります。1日1回実行すると、その日のデータが追加されます。
![WS000058.JPG](https://qiita-image-store.s3.amazonaws.com/0/276021/32ef381a-e4b9-0485-b9c6-d8ef451fcc75.jpeg)

##感想
実行速度は人が操作するのとあまり変わりません。（ブラウザを実際にポチポチしているのですから…）まずは、素データを落とせるツールが簡単に作れたのでよかったです。記事ごとのビュー数の増え方など、観察できたら面白いと思います。