Scrapy を使い始めたばかりで、チュートリアルを実行しましたが、チュートリアルやドキュメントで答えが見つからない、または答えを何度も読んだという問題に直面しています。今だけど、ちゃんと理解できてない…
シナリオ:
クロールしたい Web サイトが 1 つだけあるとします。コンテンツは、url で渡されたクエリ パラメータに基づいて動的にレンダリングされます。「カテゴリ」の URL pram に基づいて、3 つの「セット」のデータをスクレイピングする必要があります。
必要なすべての情報は、次のような一般的なベース URL から取得できます。
" http://shop.somesite.com/browse/?product_type=instruments "
各カテゴリの URL は次のようになります。
" http://shop.somesite.com/browse/?q=&product_type=instruments&category=drums "
" http://shop.somesite.com/browse/?q=&product_type=instruments&category=keyboards "
" http://shop.somesite.com/browse/?q=&product_type=instruments&category=guitars "
ここでの 1 つの注意点は、サイトが最初のリクエストごとに 30 件の結果しかロードしていないことです。ユーザーがさらに表示したい場合は、下部にある「さらに結果を読み込む...」ボタンをクリックする必要があります。これを少し調べた後、ページの初期ロード中に、上位 30 のリクエストのみが行われ (これは理にかなっています)、[さらに読み込む] ボタンをクリックすると、URL は「pagex=2」が追加されて更新されます。コンテナーが更新され、さらに 30 件の結果が表示されます。この後、ボタンが消え、ユーザーがページを下にスクロールし続けると、サーバーに対して次の 30 件の結果を取得するための後続の要求が行われ、「pagex」値が 1 増加し、結果が追加されてコンテナーが更新され、すすぎと繰り返しが行われます。
サイトでページネーションを処理する方法が正確にはわかりませんが、私が思いついた最も簡単な解決策は、各カテゴリの「pagex」の最大数を見つけて、最初にその数に URL を設定することです。
たとえば、ブラウザで URL を渡す場合:
" http://shop.somesite.com/browse/?q=&product_type=instruments&category=drums&pagex=22 "
HTTP 応答コード 200 が受信され、すべての結果がページに表示されます。すごい!それは私が必要なものを与えてくれます!
しかし、たとえば来週かそこらで、さらに 50 個のアイテムが追加されたので、現在の最大値は "...pagex=24" です。最新のものをすべて取得することはできません。
または、50 アイテムが削除され、新しい最大値が "...pagex=20" の場合、"22" を要求すると 404 応答が返されます。
最後に既知の「良好な」最大ページ番号を含むテスト応答を送信し、提供された HTTP 応答に基づいて、それを使用して URL を決定したいと思います。
ですから、クロールを開始する前に、「pagex」に 1 を足して 404 をチェックしたいと思います。404 でまだ問題がないとわかっている場合は、200 になった場合は、404 になるまで 1 を足し続ける必要があるので、私は最大がどこにあるか知っています(または必要に応じて減少します)。
このチェックを最初に実行するには、別のモジュールを使用する必要があるため、Scrapy を使用してこれを実行できるかどうかわかりません。「parse」および「start_requests」メソッドでテスト目的で簡単なチェックを追加しようとしましたが、うまくいきませんでした。start_requests は応答を処理できないようで、parse は応答コードを確認できますが、指示どおりに URL を更新しません。
それは私のコーディングスキルの低さだと確信していますが(これはまだ新しいものです)、実行可能な解決策を見つけることができないようです....
どんな考えやアイデアも大歓迎です!