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

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

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

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

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

HTTPS

HTTPS(Hypertext Transfer Protocol Secure)はHypertext Transfer プロトコルとSSL/TLS プロトコルを組み合わせたものです。WebサーバとWebブラウザの間の通信を暗号化させて、通信経路上での盗聴や第三者によるなりすましを防止します。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

Google Play

Google Playは、Google社が提供しているAndroid端末向けのデジタルコンテンツ配信サービスです。Google Play Store アプリから、世界中の個人または企業が開発したアプリをダウンロードできます。有料アプリの売り上げは、70%を開発者、30%は通信キャリア等への支払いにあてられます。開発者が登録する場合は、初回のみ25ドルの登録手数料が必要です。

Q&A

解決済

1回答

1933閲覧

GooglePlayをスクレイピングしても200個ある要素のうち、50個しか取得できない

nk1

総合スコア42

スクレイピング

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

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

HTTPS

HTTPS(Hypertext Transfer Protocol Secure)はHypertext Transfer プロトコルとSSL/TLS プロトコルを組み合わせたものです。WebサーバとWebブラウザの間の通信を暗号化させて、通信経路上での盗聴や第三者によるなりすましを防止します。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

Google Play

Google Playは、Google社が提供しているAndroid端末向けのデジタルコンテンツ配信サービスです。Google Play Store アプリから、世界中の個人または企業が開発したアプリをダウンロードできます。有料アプリの売り上げは、70%を開発者、30%は通信キャリア等への支払いにあてられます。開発者が登録する場合は、初回のみ25ドルの登録手数料が必要です。

0グッド

0クリップ

投稿2021/09/25 11:17

前提・実現したいこと

GooglePlayのゲーム売上げランキングをスクレイピングで取得して表示するアプリを考えております。
グーグルプレイのゲーム売上げランキング

エラーがでているわけではないのですが、なぜかランキングでは200個のアプリがのっているのに、スクレイピングをしても上位50件までしかとれません。
実現したいことは200件すべての取得です。

使ってるもの
M1 Mac
Flutter dart
Android Studio

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

エラーメッセージではないですが、コンソールをみるとやはり50件までしかとれていません。

console

1Performing hot restart... 2Syncing files to device iPhone 12 Pro Max... 3Restarted application in 484ms. 4flutter: [Fate/Grand Order, ウマ娘 プリティーダービー, ドラゴンクエストウォーク, 原神‐1周年, パズル&ドラゴンズ, Pokémon GO, アズールレーン, 放置少女 〜百花繚乱の萌姫たち, モンスターストライク, パズル&サバイバル, プロ野球スピリッツA, LINE ポコポコ - うさぎのポコタとクローバーやチェリーを集めろ!ダンジョンでも遊べる無料パズル, プリンセスコネクト!Re:Dive, ドラゴンボールZ ドッカンバトル, リネージュ2M(Lineage2M), ガーデンスケイプ(Gardenscapes), 日替わり内室, 三國志 覇道, ロマンシング サガ リ・ユニバース, アイドルマスター シンデレラガールズ スターライトステージ, ホームスケイプ (Homescapes), マフィア・シティ-極道風雲, ディズニー ツイステッドワンダーランド, LINE:ディズニー ツムツム, ロードモバイル: 戦争キングダム – <…> 5flutter: 50 6

該当のソースコード

dart

1void scraping() async { 2 // 取得先のURLを元にして、Uriオブジェクトを生成する。 3 const url = 'https://play.google.com/store/apps/collection/cluster?clp=0g4YChYKEHRvcGdyb3NzaW5nX0dBTUUQBxgD:S:ANO1ljLhYwQ&gsr=ChvSDhgKFgoQdG9wZ3Jvc3NpbmdfR0FNRRAHGAM%3D:S:ANO1ljIKta8&hl=ja&gl=JP'; 4 final target = Uri.parse(url); 5 6 // 取得する。 7 final response = await http.get(target); 8 9 // 下の行のコメントを外すことで、返されたHTMLを出力できる。 10 //print(response.body); 11 12 // ステータスコードをチェックする。「200 OK」以外のときはその旨を表示して終了する。 13 if (response.statusCode != 200) { 14 print('ERROR: ${response.statusCode}'); 15 return; 16 } 17 18 // 取得したHTMLのボディをパースする。 19 final document = parse(response.body); 20 21 // 要素を絞り込んで、結果を文字列のリストで得る。 22 final result = document.querySelectorAll('.WsMG1c.nnK0zc').map((v) => v.text).toList(); 23 24 // 結果を出力する。 25 setState(() { 26 rankingData = result; 27 print(rankingData); 28 print(rankingData?.length); 29 }); 30 }

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

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

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

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

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

guest

回答1

0

ベストアンサー

指定のURLをブラウザで開いたあと、
下の方にスクロールすると ローディングのくるくるがでて追記される挙動を確認できると思いますが、
それはこのURLが200件すべてのデータを一回で返してきていないということだと思います。

http.get(target) では最初に表示されている50件前後分のHTMLを取得できていて、
そのあと、スクロールしたときに追記される分が考慮されていないので掲題のような結果になるのだと思います。

それを加味して取得したい場合は
ローディング中に何をしているのかを調べて同じようなことを実装するか、
ブラウザエンジンを使用する方法で実際にリロードを発生させてパースするか 等でしょうか

投稿2021/09/25 18:52

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問