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

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

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

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

スクロール

スクロールとは、ディスプレイスクリーン上において連続的にコンテンツが滑っていくことを指します。

Python

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

selenium

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

Q&A

解決済

1回答

1356閲覧

無限スクロールページをSeleniumでスクレイピングしたいが、スクロール前の結果のみの抽出結果となってしまう。

HF0603

総合スコア12

スクレイピング

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

スクロール

スクロールとは、ディスプレイスクリーン上において連続的にコンテンツが滑っていくことを指します。

Python

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

selenium

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

0グッド

0クリップ

投稿2020/06/05 07:09

前提・実現したいこと

Seleniumを用いて以下のサイトの口コミ内容を、およそ3~4スクロール分程度の量抽出したいです。

https://play.google.com/store/apps/details?id=jp.cocone.pocketcolony&hl=ja&showAllReviews=true

発生している問題・エラーメッセージ

リストへ格納する前段階でjsを呼び出しスクロールを指定しているのですが、
抽出の結果は40行程度(恐らく0スクロールのみの分量)となってしまいます。

EVALUATIONS COMMENT_LIST 0 4 友達と話したりとかしてすごく楽しいし、お洋服もデザインがかわいくて飽きないです(*´▽`*)... 1 18 とても楽しく遊んでいます!!ですが、コロトショップで動画を見てアイテムゲットのところを押すと... 2 29 何時も、楽しく遊ばさせて頂いています。昔から比べると、明きからに良くなりました。クエスト頑張... 3 68 皆さんと仲良くできるのは凄く嬉しいですが、課金者と無課金者の対応(?)が違いすぎると思います... 4 33 最近は無課金の人にも優しい仕様になってきていて私はとても嬉しいです!ですが、なぐさめの星での... 5 28 いつも楽しませて貰っています! ただ、ドナがたまりにくいなぁーとは少し思います。私は無課金者... ... 38 とても素晴らしいですが、やはり課金勢には大幅なさを感じるアプリです。 このアプリなら課金をし... 39 29 課金者を重視したい気持ちも分かりますが、今回のアートフェスタは酷すぎます。アイテムの在庫数が...

該当のソースコード

Python3

1from selenium import webdriver 2import chromedriver_binary 3import time 4import pandas as pd 5import re 6 7EVALUATIONS_LIST = [] 8COMMENT_LIST = [] 9 10browser = webdriver.Chrome() 11browser.get('https://play.google.com/store/apps/details?id=jp.cocone.pocketcolony&hl=ja&showAllReviews=true') 12 13evaluations_num = browser.find_elements_by_class_name('jUL89d') 14comments = browser.find_elements_by_class_name('UD7Dzf') 15 16for num in range(1,5): 17 browser.execute_script("window.scrollTo(0, document.body.scrollHeight);") 18 time.sleep(5) 19 20for evaluations in evaluations_num: 21 EVALUATIONS_LIST.append(evaluations.text) 22for comment in comments: 23 COMMENT_LIST.append(comment.text) 24 25browser.close() 26 27df = pd.DataFrame() 28 29df['EVALUATIONS'] = EVALUATIONS_LIST 30df['COMMENT_LIST'] = COMMENT_LIST 31 32print(df) 33df.to_csv('scraping_googleplay2.csv',index=False)

試したこと

for文の中にリスト格納の挙動を入れてみましたが、意図した結果にはなりませんでした。

Python3

1for num in range(1,5): 2 for evaluations in evaluations_num: 3 EVALUATIONS_LIST.append(evaluations.text) 4 for comment in comments: 5 COMMENT_LIST.append(comment.text) 6 browser.execute_script("window.scrollTo(0, document.body.scrollHeight);") 7 time.sleep(5)

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

開発環境/使用ライブラリ
・macOS Mojave 10.14.6
・python3.7
・anaconda3 jupyter notebook
・Googlechrome Version: 83.0.4103.97
・Selenium (chromedriver-binary==83.0.4103.39.0)
・pandas

不勉強にて恐縮ですが、ご教授くだされば幸いです。

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

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

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

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

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

otn

2020/06/05 10:46

質問文から読み取れませんが、 ・ブラウザ画面上、スクロール(ページネーション)はされているが、一部しか読み取れない ・ブラウザ画面上、スクロールされない のどちらなんでしょうか?
HF0603

2020/06/05 10:53

otn様 ご対応ありがとうございます。 >・ブラウザ画面上、スクロール(ページネーション)はされているが、一部しか読み取れない こちらです。 起動したブラウザを目視確認する限りでは、スクロール自体はされております。 ただし、その後の読み取り結果を見ると明らかに数が少なくスクロール後の結果までは読み取ってないのではないか、といった状況です。
otn

2020/06/05 11:00

その段階で、開発者ツールでHTMLは確認して、想定通りですか?
HF0603

2020/06/05 11:14

otn様 はい、スクロール後の表示要素はタグの形式が変化しているのでは?とも考えてみましたが、 確認したところそこはスクロール前と変化がありませんでした。 (質問の意図と異なる回答でしたら申し訳ありません)
otn

2020/06/05 11:50 編集

今初めてコードを見ましたが、スクロール後に何もしてませんね。 取得してなければ取得できないのは当たり前では?
HF0603

2020/06/05 17:01

otu様 申し訳ありません。タグの形式に変化はないものの、そもそもタグの要素指定をスクロール前に行なってしまっておりました。ご指摘ありがとうございました。
guest

回答1

0

ベストアンサー

for num in range(1,5): browser.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(5)

の後に

evaluations_num = browser.find_elements_by_class_name('jUL89d') comments = browser.find_elements_by_class_name('UD7Dzf')

を書いてみてください。


今のままでは現在出ている要素を全て取得した後で、スクロールをして新たな要素を出現させています。
だから現実のDOM上に欲しい要素が存在しているにも関わらずスクロール前の要素しか取得できていません。

投稿2020/06/05 12:07

shirai

総合スコア1290

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

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

HF0603

2020/06/05 17:04

shirai様 ありがとうございます。 スクロール指定の後に要素取得の指定を行う必要があるのですね。順序を誤っておりました。 ご指摘の内容で無事解決できましたので、ベストアンサーとさせていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問