価格.comの人気ランキングから順位・製品情報・最安値をスクレイピングしてみた

# 背景
今年の5月に新築に引っ越す関係で、
家電・家具の買い替えの検討をしています。

家電購入をするときに、価格.comのランキング情報、口コミを参考にし、
それをベースに家電量販店で値切り交渉をする・・・という方は結構多いのではないでしょうか。
はい、私もその１人です。電化製品は高い買い物なので、少しでも安く買いたいですよね。

ただ、一口に家電と言っても、カテゴリが膨大にあり、毎回毎回サイトを開いて探す作業が手間だと感じていました。

ウチにはファイルサーバ（RaspberryPi3+Samba)があり、
定刻時刻になった価格.comのWebページの情報を自動抽出し、サーバ内に保存しておく仕組みがあれば便利だなと思い、Pythonとスクレイピングの勉強がてら作成してみることにしました。

# どの部分を抽出するか
![ランキング.png](https://qiita-image-store.s3.amazonaws.com/0/197189/742b39a6-1d4b-57c7-3944-e3431f99b4ef.png)

今回抽出する製品カテゴリは、「薄型テレビ」、「洗濯機」、「冷蔵庫」の3点とし、
下記3つのランキング情報を抽出します。（上図の赤枠で囲った3点）
　・ 売れ筋ランキング
　・ 注目ランキング
　・ 満足度ランキング

こちらが薄型テレビの売れ筋ランキングのWebページ。
<img width="954" alt="スクリーンショット 2019-01-04 22.58.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/197189/d2a22107-d6ff-31f8-7fde-f18c7e2fdd43.png">

こちらが薄型テレビの売れ筋ランキングのHTMLソースの一部。
<img width="1167" alt="スクリーンショット 2019-01-04 23.02.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/197189/8843253d-fc1d-fa80-c2aa-ffe6d1a07ae7.png">

下記情報が含まれている**＜a href=...＞タグ**と**＜/a＞タグ**の間を抽出します。
　・順位
　・メーカー名
　・製品名
　・最安値
　・満足度

#実装
Python3+Requests+BeautifulSoup4を用いて実装。
OSはMacOSXとLinuxを想定しています。

抽出するロジックは関数化してできるだけシンプルにしました。
抽出結果はタイムスタンプをつけて保存先（path)のディレクトリに格納。

```ImportKakakuCOM.py
import requests
from bs4 import BeautifulSoup
import datetime

#path:ファイルを出力したいディレクトリを絶対パスで入力（使用者が入力）
# ex1)Windowsの場合・・・C:\Users\desktop\
# ex2)MacOSX,Linuxの場合・・・/Users/Desktop/

path = '出力先のディレクトリを入力'
#date:タイムスタンプ(出力先ファイル名に付与)
date = datetime.datetime.now().strftime('%Y%m%d%H%M%S')

def scraping(url,outputfile):
   r = requests.get(url)
   soup = BeautifulSoup(r.text, "html.parser")
   with open(path + date + '_' + outputfile, mode='w') as f:
       for i in soup.find_all("a"):
           f.write(i.text)
           
#####################################################################
#TV_url1,TV_outputfile1:TV売れ筋ランキングのURLと出力先txtファイル
#TV_url2,TV_outputfile2:TV注目ランキングのURLと出力先txtファイル
#TV_url3,TV_outputfile3:TV満足度ランキングのURLと出力先txtファイル

TV_url1 = "http://kakaku.com/kaden/lcd-tv/ranking_2041/"
TV_url2 = "http://kakaku.com/kaden/lcd-tv/ranking_2041/hot/"
TV_url3 = "http://kakaku.com/kaden/lcd-tv/ranking_2041/rating/"
TV_outputfile1 = 'TV_SalesRanking.txt'
TV_outputfile2 = 'TV_AttentionRanking.txt'
TV_outputfile3 = 'TV_SatisfactionRanking.txt'

scraping(TV_url1, TV_outputfile1)
scraping(TV_url2, TV_outputfile2)
scraping(TV_url3, TV_outputfile3)

#####################################################################
#WM_url1,WM_outputfile1:洗濯機売れ筋ランキングのURLと出力先txtファイル
#WM_url2,WM_outputfile2:洗濯機注目ランキングのURLと出力先txtファイル
#WM_url3,WM_outputfile3:洗濯機満足度ランキングのURLと出力先txtファイル

WM_url1 = "http://kakaku.com/kaden/vertical-washing/ranking_V042/"
WM_url2 = "http://kakaku.com/kaden/vertical-washing/ranking_V042/hot/"
WM_url3 = "http://kakaku.com/kaden/vertical-washing/ranking_V042/rating/"
WM_outputfile1 = 'WM_SalesRanking.txt'
WM_outputfile2 = 'WM_AttentionRanking.txt'
WM_outputfile3 = 'WM_SatisfactionRanking.txt'

scraping(WM_url1, WM_outputfile1)
scraping(WM_url2, WM_outputfile2)
scraping(WM_url3, WM_outputfile3)

#####################################################################
#RF_url1,RF_outputfile1:冷蔵庫売れ筋ランキングのURLと出力先txtファイル
#RF_url2,RF_outputfile2:冷蔵庫注目ランキングのURLと出力先txtファイル
#RF_url3,RF_outputfile3:冷蔵庫満足度ランキングのURLと出力先txtファイル

RF_url1 = "http://kakaku.com/kaden/freezer/ranking_2120/"
RF_url2 = "http://kakaku.com/kaden/freezer/ranking_2120/hot/"
RF_url3 = "http://kakaku.com/kaden/freezer/ranking_2120/rating/"
RF_outputfile1 = 'RF_SalesRanking.txt'
RF_outputfile2 = 'RF_AttentionRanking.txt'
RF_outputfile3 = 'RF_SatisfactionRanking.txt'

scraping(RF_url1, RF_outputfile1)
scraping(RF_url2, RF_outputfile2)
scraping(RF_url3, RF_outputfile3)

#####################################################################
```

# 定刻ごとに自動実行する仕組みをつくる
実行するサーバでターミナルを開き、crontab -eを実行して下記を入力。
実行例として、毎日12時にスクリプトが実行されるように設定します。

```
#分 時 日 月 曜日 <実行コマンド>
00 12 * * * python3 <pythonファイル格納先の絶対パス>
```

# 実行結果

<img width="902" alt="スクリーンショット 2019-01-04 23.54.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/197189/8bbb43d4-a9ab-aab5-7664-60d17b022dc0.png">

上図のように、YYYYMMDDhhmmss_<電化製品カテゴリ(※1)>_<ランキングカテゴリ(※2)>.txtの形式で出力されました。
※1電化製品カテゴリ
　・TV:薄型テレビ
　・WM:洗濯機
　・RF：冷蔵庫
※2ランキングカテゴリ
　・SalesRanking:売れ筋ランキング
　・AttentionRanking:注目ランキング
　・SatisfactionRanking:満足度ランキング

しかし・・・問題点が1点。
薄型テレビの売れ筋ランキング（YYYYMMDDhhmmss_TV_SalesRanking.txt）の中身を見てみると、最安値と満足度の間にスペースがなく、見にくい状態となってしまいました・・・

![result.png](https://qiita-image-store.s3.amazonaws.com/0/197189/e071e3f1-d61c-dd36-5638-4d15880b7695.png)

これについては解決策模索中です。
"※.※※"を検知したら"(半角スペース)※.※※"に置換する処理を入れればうまくいくかしら・・・
うまいやり方ご存知の方いらっしゃったらご教示いただけると幸いです。

# まとめ
未解決の問題はありますが、自動抽出までは実装できたのでひとまず今回はこの辺で。
pythonはライブラリが充実していてなかなか奥が深いです・・・