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

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

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

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

.NET

.NETとは、主に.NET Frameworkと呼ばれるアプリケーションまたは開発環境を指します。CLR(共通言語ランタイム)を搭載し、入力された言語をCIL(共通中間言語)に変換・実行することが可能です。そのため、C#やPythonなど複数の言語を用いることができます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

604閲覧

楽天ブックスページのポイント情報のスクレイピング方法について

tarotanaka0510

総合スコア22

スクレイピング

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

.NET

.NETとは、主に.NET Frameworkと呼ばれるアプリケーションまたは開発環境を指します。CLR(共通言語ランタイム)を搭載し、入力された言語をCIL(共通中間言語)に変換・実行することが可能です。そのため、C#やPythonなど複数の言語を用いることができます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

1クリップ

投稿2022/02/05 07:21

前提・実現したいこと

楽天ブックスの書籍ページから、ポイント情報をスクレイピングで取得したい。

いただきたいアドバイス

現状、楽天ブックスのポイント情報が取得できない状況のため、具体的にどのようなクラス/メソッドを使用して情報を取得するのが好ましいのか、アドバイスいただきたい。

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

HTMLAgilityPack の DocumentNode.SelectNodes メソッドに以下の XPath を指定し、楽天のポイント情報を取得しようとしているが取得できない。

<ページ例>
https://books.rakuten.co.jp/rb/14660161/?s-id=books_pc_all_normal_nt_pt_item

イメージ説明

<XPath 例>
"//div[contains (@class,'point-summary__total')]/span/text()"

→ 496 を取得したい

ブラウザの開発者モードにて、以下のコマンドで正しくポイントを含む要素が取得できることは確認済みである。
$x("//div[contains (@class,'point-summary__total')]/span/text()")

イメージ説明

考察

デバッグを行い、取得している HTML の内容を解析したところ、ポイント情報はユーザーによって異なるため javascript で動的に取得しているように見受けられた。
ポイント数以外の静的な情報 (例えば著者名やタイトル) などは正常に取得できていることから、XPath の指定方法やメソッドの使い方の問題ではなく、取得した HTML の Javascript が解釈できていない? ことが問題であると推察している。

<!-- Point Summary --> <script type="text/template" data-component-template="bdg-point-display" data-name="point-summary"> <div class="bdg-point-display-summary point-summary rat-visible"> <img class="p-icon point-icon" src="https://r.r10s.jp/com/inc/home/20080930/ris/img/spux/icon_point.png" /> <div class="total"><span>{{points}}</span>ポイント</div> {{multiplier}}{{multiplierUp}}{{rebate}} <div class="link breakdown-link rat-click">内訳を見る</div> {{annotations}} </div> </script> <script type="text/template" data-component-template="bdg-point-display" data-name="point-summary-loading" data-component="point-summary"> <div class="loading"> <div></div> <div></div> <div></div> </div> </script> <script type="text/template" data-component-template="bdg-point-display" data-name="point-summary-error" data-component="point-summary"> <div class="message error rat-tracker">ポイント情報の取得に失敗しました。獲得予定ポイントが正しく表示されなかったため、時間をおいて、再度お試しください。</div> </script>

実装

MyWebClient クラスは、WebClient クラスを継承したクラス

Dim wc As MyWebClient = New MyWebClient Dim st As IO.Stream = wc.OpenRead(url) Dim enc As Text.Encoding = Text.Encoding.GetEncoding("euc-jp") '楽天ブックスは euc-jp の模様 Dim sr As IO.StreamReader = New IO.StreamReader(st, enc) Dim html As String = sr.ReadToEnd sr.Close() st.Close() Dim doc As HtmlAgilityPack.HtmlDocument = New HtmlAgilityPack.HtmlDocument doc.LoadHtml(html) Dim node As HtmlAgilityPack.HtmlNodeCollection node = doc.DocumentNode.SelectNodes("//div[contains (@class,'point-summary__total')]/span/") → ここで指定した XPath ヒットするオブジェクトが存在せず Null になっている

なお、特に WebClient クラスへのこだわりはない。
むしろ、MS が非推奨としている古いクラスなので他のクラス (e.g. HttpClient) に書き換えることを検討している。
しかし、現状、上記のようにポイント情報が取得できていない状況のため、HttpClient クラスに書き換えるのが良いのか、それとも、Selenium を使ったほうが良いのか、はたまた、ブラウザ機能ごと読み込んだほうがいいのか (WebView2 クラスを使ってブラウザそのものを表示させ、ログインなどをしたあとにブラウザを非表示にしたりする) 判断がつかない状況である。

検索をした限り、動的に評価される情報を含むページは、ブラウザを使って読み込みが完了するまで無限ループするような実装を見たが、それが好ましいのか、それ以外の方法がないのか判断ができていない。
(以前見たサイトなので URL がなく、うろ覚えだが、ページ読み込みが完了したイベントが発生した際に、現在の URL がもともとの URL? と同じか判断し、同じであれば読み込が完了したと判断していたように記憶している。)

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

VB.NET (C# でも可)
.NET Framework 4.7.2
HTMLAgilityPack 1.11.40

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/02/05 07:36

そううことが一般に許可されている、もしくはサイト管理者に許可を得ているのでしょうか? クローラを作ってアクセスしたら業務妨害とかで逮捕された事例もありますし、そこまでいかなくても、無断でのクローラを使ってのアクセスは迷惑行為になりかねないので安易に考えない方が良さそうです。
退会済みユーザー

退会済みユーザー

2022/02/05 08:51 編集

それ用の Web API などが提供されていないか楽天に聞いてみてはいかが? Amazon にはありましたから、期待できるかも。
tarotanaka0510

2022/02/05 09:05

アドバイスありがとうございます。 楽天ブックスには、以下の API が用意されているのですが、この方法ではポイント情報が取得できない (人によって異なる) ため、今回ポイント情報のみスクレイピングを行うことを検討していました。 https://webservice.rakuten.co.jp/documentation/books-book-search 楽天の利用規約的には、以下のように自動購入に関する禁止はありましたが、明示的なスクレイピングの禁止は確認できませんでした。 --- https://www.rakuten.co.jp/doc/info/rule/ichiba_shopping.html (7) 当社の事前の許可を得ることなく、自動化された手段(自動購入ツール・ロボットなどこれらに準ずる手段)を用いて商品を購入すること(商品ページ上の情報取得等を含む) --- ただ、おっしゃるとおり、スクレイピングはグレイな行為だと思いますし、この手の掲示板で聞くべき内容ではないと思いますので、スクレイピング以外の方法を検討してみたいと思います。
guest

回答1

0

ベストアンサー

具体的にどのようなクラス/メソッドを使用して情報を取得するのが好ましいのか、

ポイント情報がウェブページに反映される処理について調べてみました。

ブラウザのウェブコンソールで通信状況を見ますと、以下の URL に JSON 形式のデータを送信することによって(XMLHttpRequest)、ポイント値を取得している様です。

https://gateway-api.global.rakuten.com/NCP/benefitsCalculation

イメージ説明

送信するデータは apikey, shopId, itemId ですが、これは元のウェブページに JSON 形式のテキストや JavaScript の変数として埋め込まれています。

apikey

javascript

1 <script id="bdg-point-display-settings" type="application/json"> 2 { 3 "bdg-point-display": { 4 "url": "https://gateway-api.global.rakuten.com/NCP/benefitsCalculation", 5 "apiKey": "zruiZma8acXdK61OMWCXXvW82QxkaKDU", 6 :

shopId, itemId

javascript

1<script type="text/javascript"> 2var rsinetsegs; 3var rrmParams = ""; 4var google_cp_site = "BOOKS"; 5var google_cp_page = "product"; 6var google_cp_shopid = "213310"; 7var google_cp_itemid = "book:18354453"; 8 : 9

投稿2022/02/05 15:20

melian

総合スコア19618

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

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

tarotanaka0510

2022/02/06 18:03

調査までいただきありがとうございます。 趣味のプログラミングなので、Chrome の開発ツールなどほとんど触ったことなかったのですが、貼っていただいスクリーンショットから解析方法や使い方を理解するきっかけになりました。 私の方でも少し調べたところ、apikey, shopId, itemId に追加して、cookie 情報を渡せばポイント情報が得られるようでした。 ただ、他の方がおっしゃるとおりスクレイピングはグレイな部分があるので、動作検証/実装は行わないようにしようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問