質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

1242閲覧

Pythonで出力データをCSVで書き出したい

Romay

総合スコア40

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2021/10/13 04:21

前提・実現したいこと

データをスクレイピングで取得し、そのデータを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ファイルに表形式で書き込みさえできれば良いのですが、それができていません。。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

make_df()の呼び出し元をifのループ文のところに書いたらうまくいきました

Python

1 if mode: 2 for soup_a in soup_a_list[:2]: 3 item_url = soup_a.get('href') # 店の個別ページURLを取得 4 self.store_id_num += 1 5 self.scrape_item(item_url, mode) 6 # データフレームの生成 7 self.make_df() 8 return 9 else:

投稿2021/10/13 17:05

Romay

総合スコア40

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問