前提・実現したいこと
データをスクレイピングで取得し、そのデータをCSVファイルで書き出そうとしています。
◾️環境
- JupyterNotebook
- Python
- pandas
- Beautiful Soup
参考;【Python】????ラーメンガチ勢によるガチ勢のための食べログスクレイピング????
発生している事象
データ取得自体はできて、printで表示できているが、表形式で表示できておらず、CSVにも書き込めていない。
該当のソースコード
import requests from bs4 import BeautifulSoup import re import pandas as pd import time class Tabelog: """ 食べログスクレイピングクラス test_mode=Trueで動作させると、最初のページの3店舗のデータのみを取得できる """ def __init__(self, base_url, test_mode=False, p_ward='東京都内', begin_page=1, end_page=30): # 変数宣言 self.store_id = '' self.store_id_num = 0 self.store_name = '' self.store_tel = '' self.store_address = '' self.store_sheet = '' self.score = 0 self.ward = p_ward self.columns = ['store_id', 'store_name', 'store_tel', 'store_address', 'store_sheet', 'score', 'ward'] self.df = pd.DataFrame(columns=self.columns) self.__regexcomp = re.compile(r'\n|\s') # \nは改行、\sは空白 page_num = begin_page # 店舗一覧ページ番号 if test_mode: list_url = base_url + str(page_num) self.scrape_list(list_url, mode=test_mode) else: while True: list_url = base_url + str(page_num) if self.scrape_list(list_url, mode=test_mode) != True: break # INパラメータまでのページ数データを取得する if page_num >= end_page: break page_num += 1 return def scrape_list(self, list_url, mode): """ 店舗一覧ページのパーシング """ r = requests.get(list_url) if r.status_code != requests.codes.ok: return False soup = BeautifulSoup(r.content, 'html.parser') soup_a_list = soup.find_all('a', class_='list-rst__rst-name-target') # 店名一覧 if len(soup_a_list) == 0: return False if mode: for soup_a in soup_a_list[:2]: item_url = soup_a.get('href') # 店の個別ページURLを取得 self.store_id_num += 1 self.scrape_item(item_url, mode) else: for soup_a in soup_a_list: item_url = soup_a.get('href') # 店の個別ページURLを取得 self.store_id_num += 1 self.scrape_item(item_url, mode) return True def scrape_item(self, item_url, mode): """ 個別店舗情報ページのパーシング """ start = time.time() r = requests.get(item_url) if r.status_code != requests.codes.ok: print(f'error:not found{ item_url }') return soup = BeautifulSoup(r.content, 'html.parser') # 店舗名称取得 store_name_tag = soup.find('h2', class_='display-name') store_name = store_name_tag.span.string print('{}→店名:{}'.format(self.store_id_num, store_name.strip()), end='') self.store_name = store_name.strip() # 店舗電話番号取得 store_tel_tag = soup.find('p', class_='rstinfo-table__tel-num-wrap') store_tel = store_tel_tag.strong.string print(' 電話番号:{}'.format(store_tel), end='') self.store_tel = store_tel # 住所取得 store_address_tag = soup.find('p', class_='rstinfo-table__address') store_address_list = store_address_tag.find_all('span') store_address_1 = store_address_list[0].a.string #都道府県抽出 store_address_2_list = store_address_list[1].find_all('a') store_address_2 = store_address_2_list[0].string #区/市抽出 store_address_3 = store_address_2_list[1].string store_address_4 = store_address_list[1].text #詳細抽出 store_address = store_address_1 + store_address_2 + store_address_3 + store_address_4 print(' 住所:{}'.format(store_address), end='') self.store_address = store_address # 座席数取得 store_sheet_tag = soup.find_all('table', class_='rstinfo-table__table') store_sheet_table = store_sheet_tag[1] store_sheet_tr = store_sheet_table.tbody.find_all('tr') store_sheet = store_sheet_tr[0].td.p.string print(' 座席数:{}'.format(store_sheet), end='') self.store_sheet = store_sheet # 評価点数取得 #<b class="c-rating__val rdheader-rating__score-val" rel="v:rating"> # <span class="rdheader-rating__score-val-dtl">3.58</span> #</b> rating_score_tag = soup.find('b', class_='c-rating__val') rating_score = rating_score_tag.span.string print(' 評価点数:{}点'.format(rating_score), end='') self.score = rating_score # データフレームの生成 self.make_df() return def make_df(self): self.store_id = str(self.store_id_num).zfill(8) #0パディング se = pd.Series([self.store_id, self.store_name, self.store_tel, self.store_address, self.store_sheet, self.score, self.ward], self.columns) # 行を作成 self.df = self.df.append(se, self.columns) # データフレームに行を追加 return
以下クラスを実行する
Python
1tokyo_cafe_list = Tabelog(base_url="https://tabelog.com/tokyo/rstLst/cafe/",test_mode=False, p_ward='東京都内') 2#CSV保存 3tokyo_cafe_list.df.to_csv("../projects/tokyo_cafe_list.csv")
結果
クラスを実行すると以下のように表示されます。データ形成されていないデータが表示されますが、表形式にはなっていません。また、CSV保存ができていません。
以下実行するとカラムのヘッダー部分のみ表示される
tokyo_cafe_list = pd.read_csv("../projects/tokyo_cafe_list.csv") tokyo_cafe_list
補足情報(FW/ツールのバージョンなど)
データ取得自体はできているので、CSVファイルに表形式で書き込みさえできれば良いのですが、それができていません。。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。