見出し画像

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

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

プログラムの全体構成

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

すべてのレビュー一覧ページURLを取得

本記事では「②すべてのレビュー一覧ページURLを取得」を説明します。本プログラムでは、以下の順序で処理を行います。

1.各レビューページの総数を読み込む
2.レビューページURLの作成

1.各レビューページの総数を読み込む

シティヘブンのレビュー一覧ページを切り抜いたのが下の画像になります。この画像を見るとレビューページが全部で2961ページあることが分かります。また、以前の調査でURLに/2/で2ページ目、/3/で3ページ目にアクセスできるという規則性を見つけていました。つまり、ページから最大ページ数を取得した後、規則性に合わせてURLを作成することで、すべてのレビュー一覧ページを作成できます。

画像1

上記の考えをプログラムで表すと以下になります。rfが前回取得したURL(例:https://www.cityheaven.net/tokyo/reviewlist/)です。このURLを元に以下のように最終ページ数を調べます。

       # reviewページの総数を調査
       # rfページ内の全てのリンク数分繰り返す
       for link in rf.html.links:
           # URLに/reviewlist/が含む場合
           if '/reviewlist/' in link:
           
               # 余計な数字情報を削除する
               # 例:https://www.cityheaven.net/tokyo/A1303/A130301/reviewlist/5/
                    → https:///reviewlist/5/
               url_number = re.sub('/.*/reviewlist', '', link)
               
               # 数字以外を削除
               # 例:https:///reviewlist/5/
                    → 5
               url_number = re.sub('\D', '', url_number)
               
               # 数字が無い場合1としてカウント
               if url_number == '':
                   url_number = 1
               num_list.append(int(url_number))

       # 調べた数値の内、最大値を採用
       line_max = max(num_list)

2.レビューページURLの作成

最終ページ数に到達するまでURLを作成して、テキスト保存します。

       for num in range(line_max):
           url_number = num + 1
           wf.write(line.strip() + str(url_number) + '/\n')

全体コード

全体コードは以下になります。私のPCでの動作時間は69.64秒でした。

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

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

   wf = open('list/all_reviewlist.txt', 'a')
   rf = open('list/area_reviewlist.txt', 'r')

   # デリヘルタウントップページの情報取得
   session = HTMLSession()

   num_current = 1
   for url in rf:

       # 口コミリストから投稿のURL取得
       sg = session.get(url.strip())

       # reviewページの総数を調査
       num_list = []
       for link in sg.html.links:
           if '/reviewlist/' in link:
               url_number = re.sub('/.*/reviewlist', '', link)
               url_number = re.sub('\D', '', url_number)
               if url_number == '':
                   
                   url_number = 1
               num_list.append(int(url_number))

       line_max = max(num_list)

       for num in range(line_max):
           url_number = num + 1
           wf.write(url.strip() + str(url_number) + '/\n')

       time.sleep(1)
       print('\r' + ' %s max:%d' % (url.strip(), line_max))
       num_current += 1

   wf.close()

まとめ

今回、「②すべてのレビューページURLを取得」のソースコードをご紹介しました。次回は「③すべてのレビュー詳細ページのURLを取得」のソースコードをご紹介します。

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