見出し画像

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

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

プログラムの全体構成

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

都道府県別のレビュー一覧ページURLを取得

まず、はじめに都道府県別にあるレビュー一覧ページのURLを取得してテキストに出力します。以下のようなレビュー一覧ページのURLを都道府県数分の47個取得して、テキストに出力します。

例:https://www.cityheaven.net/tokyo/reviewlist/

ここでURLの規則性で、tokyoの部分のみ全国の都道府県名に変えれば良さそうですので、わざわざシティヘブンにアクセスしてURLを取得する必要は無さそうです。ただし、作成したURLがシティヘブンに存在するかのチェックは必要です。つまり、今回の処理は以下の手順で実施していきます。

1.地域別のレビュー一覧ページURL作成
2.作成したURLがシティヘブンに存在するかチェック
3.存在するURLをテキストファイルに出力

1.地域別のレビュー一覧ページURL作成

地域別のレビュー一覧ページURLを作成します。まず、都道府県名をリストに入れておきます。

# 都道府県のアルファベット名格納area_lists = ['hokkaido', 'aomori', 'iwate', 'akita', 'miyagi',
               'yamagata', 'fukushima', 'ibaraki', 'tochigi', 'gunma',
               'saitama', 'chiba', 'tokyo', 'kanagawa', 'niigata',
               'toyama', 'ishikawa', 'fukui', 'yamanashi', 'nagano',
               'gifu', 'shizuoka', 'aichi', 'mie', 'shiga',
               'kyoto', 'osaka', 'hyogo', 'nara', 'wakayama',
               'tottori', 'shimane', 'okayama', 'hiroshima', 'yamaguchi',
               'tokushima', 'kagawa', 'ehime', 'kochi', 'fukuoka',
               'saga', 'nagasaki', 'kumamoto', 'oita', 'miyazaki',
               'kagoshima', 'okinawa']

これを文字列をつなげる形で変数に代入してURLを作成します。また、for文で都道府県の数分ループさせることで、すべてのURLを作成します。
これでURL作成は完了です。

for area_list in area_lists:
    url_areareview = 'https://www.cityheaven.net/' + area_list + '/reviewlist/'

2.作成したURLがシティヘブンに存在するかチェック

今回URLの規則性から独自にURLを作成していますので、このURLにアクセスすると本当にページが存在するのかチェックしておきたいところです。そこで、Pythonのrequests関数を用いてページ情報を取得して、情報を取得できたかどうかで判定します。

実際のソースコードは以下になります。requests.getで対象URLのページ情報を取得し、get_url_info.status_codeでページ状態を調べます。ページが存在しない場合は404エラーとなりますので、if文で判定します。エラーの場合はログ出力(lg.error)を行った上、レビュー一覧ページURLとして保存せず、次のレビュー一覧ページに処理を進ませます。
なお、HPへのアクセスを行った後は必ずsleep関数で1秒以上停止するルールがあります。これをやらないとサーバに負荷がかかり迷惑をかけてしまいますし、こちらとしてもサーバが対応しきれず正確にチェックできなくなる可能性があります。

get_url_info = requests.get(url_areareview)
status_code = get_url_info.status_code
if(status_code == 404):
    lg.error(url_areareview)
    area_count += 1
    continue

area_reviewlists.append(url_areareview)
area_count += 1

time.sleep(1)

これでページが存在するレビュー一覧ページのみarea_reviewlistsというリスト変数に格納されます。

3.存在するURLをテキストファイルに出力

最後にチェックを通過したURLをテキストファイルに出力します。ここは特に変わった処理はなく、URLが格納されているarea_reviewlistsリスト変数を全データテキストファイルとして出力しています。Pythonのファイル出力に不安のある方は別サイトをご参照ください。

fname = 'list/area_reviewlist.txt'
f = open(fname, 'w')
for area_reviewlist in area_reviewlists:
    f.write(area_reviewlist + '\n')
f.close()

全体コード

これまでのコードをまとめたものが以下になります。処理の過程が分かるようPrint関数を入れていたりと多少異なるところはありますが、大体は同じです。
なお、このプログラムの処理時間は3分28.35秒でした。
実施環境CPU:Intel(R) Core i5-2540 (2コア)

def heaven_area_list():
   import requests
   from requests_html import HTMLSession
   import logging as lg
   import time

   area_lists = ['hokkaido', 'aomori', 'iwate', 'akita', 'miyagi',
               'yamagata', 'fukushima', 'ibaraki', 'tochigi', 'gunma',
               'saitama', 'chiba', 'tokyo', 'kanagawa', 'niigata',
               'toyama', 'ishikawa', 'fukui', 'yamanashi', 'nagano',
               'gifu', 'shizuoka', 'aichi', 'mie', 'shiga',
               'kyoto', 'osaka', 'hyogo', 'nara', 'wakayama',
               'tottori', 'shimane', 'okayama', 'hiroshima', 'yamaguchi',
               'tokushima', 'kagawa', 'ehime', 'kochi', 'fukuoka',
               'saga', 'nagasaki', 'kumamoto', 'oita', 'miyazaki',
               'kagoshima', 'okinawa']

   area_reviewlists = []

   area_count = 0
   for area_list in area_lists:
       url_areareview = 'https://www.cityheaven.net/' + area_list + '/reviewlist/'

       get_url_info = requests.get(url_areareview)
       status_code = get_url_info.status_code
       if(status_code == 404):
           lg.error(url_areareview)
           area_count += 1
           continue

       area_reviewlists.append(url_areareview)
       area_count += 1

       print('\r  %2d/%2d個目' % (area_count, len(area_lists)), end='')
       time.sleep(1)

   fname = 'list/area_reviewlist.txt'
   f = open(fname, 'w')
   for area_reviewlist in area_reviewlists:
       f.write(area_reviewlist + '\n')
   f.close()

第1章まとめ

今回、シティヘブンの都道府県別レビュー一覧ページURLを取得するソースコードをご紹介しました。次回以降は、このURL情報を使って進めていきますので、よろしくお願いいたします。

関連記事


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