ajax リクエストの後にロードされるデータをスクレイピングしようとしています。
たとえば、この youtube ページの最初の 30 個のビデオが html で表示された後、ユーザーは ajax をトリガーしてより多くの結果を取得する「さらに読み込む」ボタンをクリックする必要があります。 https://www.youtube.com/user/testedcom/videos
ajax リンクを取得できますが、Scrapy 機能を使用して残りのデータをプル/「ページネーション」する最良の方法は何ですか?
シェルを開始します。
scrapy shell https://www.youtube.com/user/testedcom/videos
ajax 継続の URL を取得します。
continuation_url = response.xpath('//*[@class="yt-uix-button yt-uix-button-size-default yt-uix-button-default load-more-button yt-uix-load-more browse-items-load-more-button"]/@data-uix-load-more-href').extract()[0]
url = "https://www.youtube.com/user/testedcom/videos" + continuation_url
ajax 呼び出しから新しいデータを取得します。
fetch(url)
...しかし、ここからデータをどうするかわかりません。これは、scrapy シェルの実行からの元の応答と同じ形式ではありません。JSONとしてロードされていないようです。スクレイピーにはこれ専用の何かがあると思いますが、ドキュメントで見つけることができません。
編集 して、次のようにしてhtmlコンテンツを取得できます。
import json
response_json = json.loads(response.body_as_unicode())
html = response_json['content_html']
しかし、このユニコードから必要なデータを引き出すには、はるかに便利な組み込みの xpath セレクターではなく、正規表現を使用する必要があります。
このソリューションのように、Selenium または別のアドオンを使用しないことをお勧めします。スピードとシンプルさが最優先事項です。