見出し画像

【Python】シティヘブンのレビュー情報をデータベース化~第3章~

こんにちは。データ分析が趣味のしょげといいます。
本記事ではシティヘブンのレビュー情報を取得しデータベース作成するプログラムについて解説していきます。初めてこの記事をご覧いただいた方は以下の記事から読まれることをお勧めいたします。

プログラムの全体構成

①都道府県別のレビューTOPページURLを取得
②すべてのレビュー一覧ページURLを取得
③すべてのレビュー詳細ページのURLを取得
④すべてのレビュー詳細ページをHTMLで保存
⑤取得したHTMLデータからレビュー情報を抽出しCSV保存

本記事では、「③すべてのレビュー詳細ページのURLを取得」についてご紹介します。

すべてのレビュー詳細ページのURLを取得

この③のプログラムは以下の順序で処理を行います。
1.レビュー一覧ページからレビュー詳細ページのURLを抽出
2.抽出したレビュー詳細ページのURLをテキストファイルに保存

レビュー詳細ページのURLを抽出

②で取得したレビュー一覧ページからレビュー詳細ページのURLを抽出します。シティヘブンのレビュー詳細ページはURLに必ず/reviews/rvが含まれるため、URLに/reviews/rvを含むか否かでレビュー詳細ページかどうかを判定します。これをページ内の全URLでチェックすることで、レビュー詳細ページを全て洗い出します。

       r = session.get(line.strip())
       for link in r.html.links:
           # 取得したURLから、レビュー詳細のURLだけ選別して書き出す。
           # 取得するURLの例:「/reviews/rv」を含むURL
           is_shop = re.search('/reviews/rv', link)
           if (is_shop):
               # シティヘブンのTOPURLを頭につけてリストに追加
               url_list.append(url_dto + link)

テキスト保存についてはこれまでの記事でも説明しているので省略します。

全体コード

本プログラムの全体コードを以下に示します。なお、本プログラムを実行すると99108.22秒、、約27.5時間かかりました。このプログラムから処理時間が大幅に増加します。。

def heaven_reviewdetail_list():
   from requests_html import HTMLSession
   import re
   import time
   import os

   # 出力先準備
   if os.path.exists('list/all_review_url.txt'):
       os.remove('list/all_review_url.txt')

   # 本プログラムは実行に時間がかかる。
   # そのため、進捗をコンソール上に表示するための変数を用意
   num_current = 0
   num_shops = sum(1 for line in open('list/all_reviewlist.txt'))
   # シティヘブンTOPページ
   url_dto = 'https://www.cityheaven.net/'
   # 口コミURL一覧読み込み
   rf = open('list/all_reviewlist.txt', 'r')

   session = HTMLSession()

   # 以下、口コミのURLをリストに詰め込む
   url_list = []

   for line in rf:
       # 口コミリストから投稿のURL取得
       r = session.get(line.strip())
       for link in r.html.links:
           is_shop = re.search('/reviews/rv', link)
           if (is_shop):
               # https://www.dto.jp/を頭につけてリストに追加
               url_list.append(url_dto + link)

       # サーバに負荷をかけないよう、1つのページにアクセスするごとに1秒停止
       time.sleep(1)
       # 現在の進捗を表示
       num_current += 1
       print('\r' + '現在の進捗: %04d / %04d ' % (num_current, num_shops), end='')

       if(num_current % 1000 == 0):
           fname = 'list/all_review_url_' + str(num_current) + '.txt'
           f = open(fname, 'w')
           for url in url_list:
               f.write(url + '\n')
           f.close()

   # 以下、ファイルへの書き出し
   # shop_listには、店舗のURLを片っ端からぶち込んでいる。よってURLが重複していることがある。
   # そのため、setコマンドによって重複をなくす。
   url_list = list(set(url_list))
   # 書き出し先のファイル
   wf = open('list/all_review_url.txt', 'w')
   # リストをファイルに書き出し
   for url in url_list:
       wf.write(url + '\n')
   wf.close()

まとめ

今回、「③すべてのレビュー詳細ページのURLを取得」のソースコードをご紹介しました。次回は「④すべてのレビュー詳細ページをHTMLで保存」のソースコードをご紹介します。
なお、次回のプログラムは処理時間がなんと1週間です。。

この記事が気に入ったらサポートをしてみませんか?