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

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

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

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

CSV

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

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

Python

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

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

解決済

[Python]楽天市場からスクレイピングでデータを自動取得したいです。

menuett
menuett

総合スコア0

スクレイピング

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

CSV

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

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

Python

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

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

1回答

-1評価

0クリップ

51閲覧

投稿2018/12/02 16:42

編集2022/01/12 10:58

Pythonスクレイピングで楽天市場から商品レビューと参考になった人数を自動で取得しようとしています。
以前はPhantomJSを使っていたのですが、seleniumでのサポートが終わったのでheadless Chromeで代用しようとしています。
やっている流れ
1.楽天市場のレビューを取得したいページに行きます。
2.そのページのURLをコピーします。
3.pageはページ数で最初は1にしておきます。pathは楽天レビューの「次の15件」のボタンのXpathです。
4.「次の15件」がそのページにあったらループ、なかったらbreakです
※なぜか「次の15件」のXpathが最初のページ以外違ったので、最後の方でpathを更新しています。
5.CSVに保存します。
csvには、参考になった人数,レビュー本文といった形式で保存します。
※参考になった人数が空の場合は0とする。
実行すると1ページ目はうまく取得できるのですが、2ページ目以降になると取得できません。
Pythonのバージョンは3.6.5です。
Windouws10,jupyter notebookで作成しました。


実行結果
---------------------------page: 1 -----------------------------

Starting to get reviews...

score text
0 39 この商品は色違いで3点目の購入です。今回はブラックを購入しました。\nよく伸びるので曲げ伸ば...
1 23 2016年10月にツイル&デニムのL、11月にデニムLLを。ツイル(ボルドー)は着衣の繊維が...
2 19 ずっと気になっていてやっと買えました。\n2592円(税抜)が24時間限定50%ポイント還元...
3 6 今年の冬は特に寒かったけどこのパンツで温かく過ごせました。何本も購入したのでほぼ毎日のように...
4 9 この冬大活躍しました。\n結局何回もリピ買いして計6本。穿くときのヒヤッと感が無いのも◎だし...
5 6 167cm、56kgでお肉は下半身に付く方です。\n以前ボルドーのLを購入してウェストも丈も...
6 6 レビューがいいので安心して購入しました。\n155センチ48キロ、サイズはSかMで、モノによ...
7 6 裏フリースの物を買っといてなんですが、あんまり足が太く見えたら嫌だなぁ~と思いワインのSサイ...
8 4 ⇒身長163cm 体重55kgでLを選びました。\n最初はMをお願いしたのですが、\nウエス...
9 4 本日届きました。\nレビューを見ると 「サイズにばらつきが有る」「生地が伸びる 伸びない」不...
10 4 165センチ、48キロ。普段のパンツはMで、ベージュとオリーブのMを購入。暖かいのに、シルエ...
11 3 161センチ52キロでMサイズを購入しました。\n骨盤が張っていてお尻も大きく太ももも太めな...
12 3 170cm55キロ、お尻が大き目なのでサイズLを購入。\nコーデュロイ ブラックです。\nス...
13 4 2018verのツイルの黒を購入しました。2年前に買ったMはちょうど良かったのですが、今回の...
14 3 168cm、55kg、トップスはM、ボトムスは物によりけりで、デニムは普段24インチです。...
next url:https://review.rakuten.co.jp/item/1/200612_10056893/2.1/
Moving to next page......

---------------------------page: 2 -----------------------------

Starting to get reviews...

NoSuchElementException Traceback (most recent call last)
#追加部分↓
<ipython-input-14-43bd36a04d9d> in <module>()
25 #dfつくる
26 for review in reviews:
---> 27 score=review.find_element_by_css_selector("span.revEntryAnsNum").text
28 text=review.find_element_by_css_selector("dd.revRvwUserEntryCmt.description").text
29 se=pd.Series([score,text],columns)

~\Anaconda3\lib\site-packages\selenium\webdriver\remote\webelement.py in find_element_by_css_selector(self, css_selector)
428 element = element.find_element_by_css_selector('#foo')
429 """
--> 430 return self.find_element(by=By.CSS_SELECTOR, value=css_selector)
431
432 def find_elements_by_css_selector(self, css_selector):

~\Anaconda3\lib\site-packages\selenium\webdriver\remote\webelement.py in find_element(self, by, value)
657
658 return self._execute(Command.FIND_CHILD_ELEMENT,
--> 659 {"using": by, "value": value})['value']
660
661 def find_elements(self, by=By.ID, value=None):

~\Anaconda3\lib\site-packages\selenium\webdriver\remote\webelement.py in _execute(self, command, params)
631 params = {}
632 params['id'] = self._id
--> 633 return self._parent.execute(command, params)
634
635 def find_element(self, by=By.ID, value=None):

~\Anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py in execute(self, driver_command, params)
319 response = self.command_executor.execute(driver_command, params)
320 if response:
--> 321 self.error_handler.check_response(response)
322 response['value'] = self._unwrap_value(
323 response.get('value', None))

~\Anaconda3\lib\site-packages\selenium\webdriver\remote\errorhandler.py in check_response(self, response)
240 alert_text = value['alert'].get('text')
241 raise exception_class(message, screen, stacktrace, alert_text)
--> 242 raise exception_class(message, screen, stacktrace)
243
244 def _value_or_default(self, obj, key, default):

NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"span.revEntryAnsNum"}
(Session info: headless chrome=70.0.3538.110)
(Driver info: chromedriver=2.44.609538 (b655c5a60b0b544917107a59d4153d4bf78e1b90),platform=Windows NT 10.0.17134 x86_64)

このように2ページ目以降は取得できません。
この状況の解決方法を教えていただきたいです。  よろしくお願いします。

Python

from selenium import webdriver from selenium.webdriver.chrome.options import Options import chromedriver_binary import pandas as pd import time options = Options() options.add_argument('--headless') driver = webdriver.Chrome(options=options) url="https://review.rakuten.co.jp/item/1/200612_10056893/1.1/" #URLをはる driver.get(url) page=1 columns=["score","text"] #列の作成 df=pd.DataFrame(columns=columns) path="//*[@id='revRvwSec']/div[1]/div/div[3]/div[16]/div/div/a[5]" while True: print(" ") print("---------------------------page: {} -----------------------------".format(page)) print(" ") print("Starting to get reviews...") print(" ") reviews=driver.find_elements_by_css_selector("div.revRvwUserMain") #dfつくる for review in reviews: score=review.find_element_by_css_selector("span.revEntryAnsNum").text text=review.find_element_by_css_selector("dd.revRvwUserEntryCmt.description").text se=pd.Series([score,text],columns) df=df.append(se,columns) print(df) if len(driver.find_elements_by_xpath(path))>0: next_page=driver.find_element_by_xpath(path).get_attribute("href") print("next url:{}".format(next_page)) driver.get(next_page) page+=1 driver.implicitly_wait(10) print("Moving to next page......") time.sleep(10) path="//*[@id='revRvwSec']/div[1]/div/div[2]/div[16]/div/div/a[6]" #「次の15件」のXpathが最初のページ以外違ったので、最後の行でpathを更新しています。 else: break #CSVに保存 print(" ") print("Saving as csv.....") print("") df.to_csv("review.csv", encoding = 'utf_8_sig') print("Processing Exit")

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

Lhankor_Mhy
Lhankor_Mhy

2018/12/04 11:49

エラーメッセージはそれだけですか?
menuett
menuett

2018/12/04 12:19

いいえ 質問が見づらくなると考え省略しました。編集で追加しておきます。

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

スクレイピング

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

CSV

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

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

Python

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

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。