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

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

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

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

Google サイト

Google サイトは、Google社が提供する無料のホームページ作成ツールです。プログラミングやデザインなどの知識がなくても、ブラウザから容易にWebページを作成することが可能。新たなページの追加も簡単でページ数には制限がありません。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Python

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

受付中

python スクレイピングについて

yoshiokoko
yoshiokoko

総合スコア0

スクレイピング

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

Google サイト

Google サイトは、Google社が提供する無料のホームページ作成ツールです。プログラミングやデザインなどの知識がなくても、ブラウザから容易にWebページを作成することが可能。新たなページの追加も簡単でページ数には制限がありません。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Python

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

0回答

-5評価

0クリップ

365閲覧

投稿2021/08/22 08:26

前提・実現したいこと

食べログサイトのスクレイピングを実施したいです。

実装中に以下のエラーメッセージが発生しました。

Traceback (most recent call last): File "C:/Users/90000/Desktop/chromedriver_win32/tabelog.py", line 144, in <module> df['area'] = elems_str_area_list File "C:\Users\90000\AppData\Local\Programs\Python\Python39\lib\site-packages\pandas\core\frame.py", line 3607, in __setitem__ self._set_item(key, value) File "C:\Users\90000\AppData\Local\Programs\Python\Python39\lib\site-packages\pandas\core\frame.py", line 3779, in _set_item value = self._sanitize_column(value) File "C:\Users\90000\AppData\Local\Programs\Python\Python39\lib\site-packages\pandas\core\frame.py", line 4504, in _sanitize_column com.require_length_match(value, self.index) File "C:\Users\90000\AppData\Local\Programs\Python\Python39\lib\site-packages\pandas\core\common.py", line 531, in require_length_match raise ValueError( ValueError: Length of values (0) does not match length of index (20)

該当のソースコード

import pandas as pd import numpy as np from bs4 import BeautifulSoup import re import requests from selenium import webdriver browser = webdriver.Chrome() def get_info_str(url): browser.get(url) elems_str_info = browser.find_elements_by_class_name('rstinfo-table') elem_str_info = elems_str_info[0].text.split('\n') elem_df = pd.DataFrame() elem_df['elem'] = elem_str_info elem_df['number'] = list(range(0,len(elem_df))) # 住所取得 try: elem_str_address = browser.find_elements_by_class_name('rstinfo-table__address') elem_str_address = elem_str_address[0].text except: elem_str_adress = "-" # 席数を取得 try: chair_count = [x for x in elem_str_info if x.endswith('席')] chair_count = chair_count[0] except: chair_count = "-" # 定休日を取得 try: i = elem_df.query('elem =="定休日"')['number'].max()+1 regular_holiday = list(elem_df.query('number == {}'.format(i))['elem'])[0] except: regular_holiday = "-" # オープン日を取得 try: i = elem_df.query('elem =="オープン日"')['number'].max()+1 open_date = list(elem_df.query('number == {}'.format(i))['elem'])[0] except: open_date = "-" # 電話番号を取得 try: i = elem_df.query('elem =="電話番号"')['number'].max()+1 call_number = list(elem_df.query('number == {}'.format(i))['elem'])[0] except: call_number = "-" str_info = list() str_info.append(elem_str_address) str_info.append(chair_count) str_info.append(regular_holiday) str_info.append(open_date) str_info.append(call_number) return str_info browser.get('https://tabelog.com/tokyo/') elems_tabelog = browser.find_elements_by_class_name('list-rst__header') str_name_list = list() for x in elems_tabelog: elem_str = x.text.split() print(elem_str) # ジャンルを取得 elems_genre_list = list() for x in elems_tabelog: elem_genre = x.text.split('/')[1] elems_genre_list.append(elem_genre) print(elems_genre_list) # 店名を取得 elems_str_name_list = list() for x in elems_tabelog: elem_str_name = x.text.split('/')[0] elem_str_name = elem_str_name.split() #elem_str_name = elem_str_name[0:len(elem_str_name)-1] elem_str_name = elem_str_name[0:(len(elem_str_name)-2)] elem_str_name = ' '.join(elem_str_name) elems_str_name_list.append(elem_str_name) # 評価を取得 elems_tabelog_score = browser.find_elements_by_class_name("list-rst__rate") tabelog_score_list = list() for x in elems_tabelog_score: tabelog_score = x.text.split()[0] tabelog_score_list.append(tabelog_score) # エリアを取得 elems_str_area_list = list() for x in elems_tabelog: elem_str_area = x.text.split('/')[0] elem_str_area = elem_str_area.split()[-2:] elem_str_area = elem_str_area[0] + elem_str_area[1] #elem_str_name = elem_str_name.split('') #elem_str_name = elem_str_name[0:len(elem_str_name)-1] elems_str_area_list.append(elem_str_area) # 昼と夜の予算を取得 elems_tabelog_plan = browser.find_elements_by_class_name("list-rst__budget") ### 昼を取得 elem_tabelog_lunch_list = list() for x in elems_tabelog_plan: tabelog_lunch = x.text.split()[3] elem_tabelog_lunch_list.append(tabelog_lunch) ### 夜を取得 elem_tabelog_dinner_list = list() for x in elems_tabelog_plan: tabelog_dinner = x.text.split()[3] elem_tabelog_dinner_list.append(tabelog_dinner) # ホームページ情報を取得 r = requests.get('https://tabelog.com/tokyo/') #requestsを使って、webから取得 soup = BeautifulSoup(r.text, 'lxml') #要素を抽出 page_list = list() for a in soup.find_all(class_='list-rst__rst-name-target cpy-rst-name'): page_list.append(a.get('href')) df = pd.DataFrame() df['genre'] = elems_genre_list df['str_name'] = elems_str_name_list df['str_score'] = tabelog_score_list df['area'] = elems_str_area_list df['lunch_plan'] = elem_tabelog_lunch_list df['dinner_plan'] = elem_tabelog_dinner_list df['str_url'] = page_list str_list = list() for i in range(len(df)): page_url = df['str_url'][i] print(page_url) list_x = get_info_str(page_url) list_x.append(page_url) str_list.append(list_x) str_df = pd.DataFrame(str_list) str_df.columns = ['str_adress', 'chair_count', 'holiday', 'open_date', 'callnumber', 'str_url'] str_1 = pd.merge(df, str_df, how='left')

補足情報(FW/ツールのバージョンなど)

pyhthon初心者です。宜しくお願いします。
ここにより詳細な情報を記載してください。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

meg_

2021/08/22 08:34

食べログの利用規約によると情報の複製・保管は原則禁止されているようですが特別に許可を取られているのでしょうか?
m.ts10806

2021/08/22 10:48

公的にAPI提供されてないのでしたらあきらめてください。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

スクレイピング

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

Google サイト

Google サイトは、Google社が提供する無料のホームページ作成ツールです。プログラミングやデザインなどの知識がなくても、ブラウザから容易にWebページを作成することが可能。新たなページの追加も簡単でページ数には制限がありません。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Python

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