多くの場合、取得するデータが複数のページにまたがっているため、ページネーションを使って複数のページからデータを抽出することは一般的です。
しかし、Octoparseが最後のページでスクレイピングを続けて停止しないことがあります。これは、最後のページで「次へ」ボタンがまだ表示され、ページネーションが無限ループになっている可能性があります。この問題に対処するために、ページネーションループアイテムの「高度なオプション」で「ループ終了時」条件を設定するか、XPathを変更して無限ループを回避する方法があります。
1. ループ終了条件を設定する - 「実行が次の回数に達する」
「実行が次の回数に達する」オプションを利用することで、特定のページでページネーションを停止できます。ページネーションステップの「実行が次の回数に達する」条件を設定すると、ページネーションが設定された回数に達した時点で停止します。
(例えば、最初の50ページのデータをスクレイピングする場合、実行回数を50に設定できます。)
このため、「実行が次の回数に達する」オプションを設定することで、ページクリックの回数がわかれば、問題を完全に解決できます。
まず、ページネーションループを選択し、「実行が次の回数に達する」ドロップダウンメニューを開きます。「実行が次の回数に達する」を選択し、ループの実行回数として数字を設定し、「OK」をクリックして設定を保存します。
2. XPathを変更する
ループ終了条件の設定では問題が解決しない場合、ページネーションループのXPathを変更する必要があるかもしれません。Octoparseは、「次へ」ボタンを含むページ上の要素を特定するためにXPathを使用します。ほとんどの場合、Octoparseは自動的かつ正確にXPathを生成できますが、時折、手動でXPathを修正する必要があります。例えば、無限ループの場合、最後のページ以外のすべてのページで「次へ」ボタンを正確に特定できるXPathを作成する必要があります。
ヒント:XPathを作成するためにChrome拡張機能「XPath Helper」を使用することをおすすめします。XPathの作成方法については、チュートリアル「XPathとは何か、Octoparseでの使用方法」を参照してください。
XPathを作成する方法の例を見てみましょう。
以下の2つのスクリーンショットから分かるように、「次へ」ボタンはXPath Helperで自動生成されたXPathによって最初のページと最後のページの両方で特定されています。
最初のページ:
最後のページ:
今度は、最初のページと最後のページのボタンの違いを見つけ、その違いを利用してXPathを作成する必要があります。Chromeでボタンを右クリックして、ボタンのHTMLコードを検証することができます。
最初のページ:
最後のページ:
注意してみると、ボタンのHTMLコードが異なることに気付きます。最後のページのコードには「aria-disabled」という属性があります。
この観察結果を利用して、新しいXPathを作成しましょう。このXPathは、最後のページではない場合にのみ「次へ」ボタンを特定します。新しいXPathは次のとおりです:
//a[@class="pagination__next icon-link"][not(@aria-disabled)]
新しいXPathをXPath Helperに入力して、最初のページと最後のページの両方で「次へ」ボタンを特定できるか確認してください。
最初のページ:
最後のページ:
望んだ通りに最後のページでは一致するnodesがないです。つまり、新しいXPathは最初のページでは「次へ」ボタンを正しく選択しますが、最後のページでは選択しません。もちろん、より正確にするためには、ページ2やページ3などで「次へ」が選択できるかどうかを確認することもできます。
新しいXPathが準備できたら、以下の手順に従ってページネーションループに新しいXPathを適用します:
まとめると、無限ループの問題は解決が難しいものではありません。スクレイピングの要件に応じて、ループを終了する条件を設定するか、XPathを修正することで問題を解決することができます。