Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

背景

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

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

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

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

どの部分を抽出するか

ランキング.png

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

こちらが薄型テレビの売れ筋ランキングのWebページ。
スクリーンショット 2019-01-04 22.58.54.png

こちらが薄型テレビの売れ筋ランキングのHTMLソースの一部。
スクリーンショット 2019-01-04 23.02.01.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ファイル格納先の絶対パス>

実行結果

スクリーンショット 2019-01-04 23.54.19.png

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

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

result.png

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

まとめ

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away