Ajax を使用した Web スクラッピング:完全ガイド

反応する:

コメント

以下を使用しているサイトをスクレイピングする AJAX は、従来のウェブスクレイピングよりも複雑です。コンテンツは HTML initial:事後的に、経由して ジャバスクリプト. したがって、単純なスクレイパーでは何も検出できず、こうした動的なデータを取得するには、適切なアプローチを採用する必要があります。.

JavaScriptでAJAXを使用してデータを読み込むサイトにおけるウェブスクレイピングの仕組み
AJAXを使用しているサイトにおけるウェブスクレイピングの仕組み。 ©Christina(Alucare.fr)

AJAXとウェブスクレイピング:なぜ異なるのか?

the ウェブスクレイピング コードを分析することである HTML ウェブページから有用なデータを自動的に抽出するためです。静的サイトでは非常にうまく機能します。問題は、 AJAX (~について) Asynchronous JavaScript and XML)、コンテンツの読み込みや更新を可能にする技術 ページ全体を再読み込みせずに.

AJAXはどのように機能するのでしょうか?

ブラウザ(または ブラウザ) は小さな 非同期リクエスト バックグラウンドのサーバーへ。サーバーは、多くの場合、 JSON. その後、ページは残りの部分を再読み込みすることなく、その情報を即座に表示します。これが、ウェブをより高速でインタラクティブなものにしているのです。.

ウェブページ全体を再読み込みすることなく、バックグラウンドでデータを読み込むAJAXの動作図
AJAXを使用しているサイトでのウェブスクレイピングの仕組み。©Christina(Alucare.fr)

なぜAJAXによるスクレイピングはより複雑なのでしょうか?

あるサイトが AJAX, 読み込まれたコンテンツは 初期HTMLソースコード. これは後からによって注入される。 JavaScript, 、ページが開いたら。一般的なスクレイパーは、 静的コンテンツ : つまり、彼はそれが見えない 動的データ その後追加されました。.

これらを取得するには、JavaScriptを実行できるツールが必要です。実際には、主に以下の3つの方法があります:

  • 直接再生する AJAXリクエスト, 、すなわち通話 XHR データを読み込むもの。.
  • を操縦する ヘッドレスブラウザ なので Selenium どこ Playwright, 、レンダリングを担当する(または レンダリング) ページを、本物のブラウザのように表示します。.
  • ~を経由して スクレイピングAPI オールインワン。.

AJAXスクレイピングの方法とツールにはどのようなものがありますか?

方法 1:AJAX リクエストを再現する

これは、~するための最も効果的な方法です。 動的データを取得する. ページ全体をレンダリングする代わりに、あなたは AJAXリクエストをインターセプトする サーバーに送信された後、それらを直接再現して生データを取得する。多くの場合、その形式は JSON.

これらの呼び出しを確認するには、ブラウザの開発者ツールを開き、次にタブを開いてください ネットワーク フィルター付き XHR. そこにはエンドポイントの正確なURLや、 ヘッダー および回答の形式。.

この手法の特長:

  • 非常に高速で軽量, 、というのも、ページの完全なレンダリングを必要としないからです。.
  • 彼女 問題を回避する JavaScriptのレンダリングに関連する。

その限界:

  • もっと 導入が複雑な ヘッドレスブラウザよりも。.
  • 彼女は~を求めている 綿密な分析 リクエスト、ヘッダー、パラメータ。サイトによっては、トークンや特定のヘッダーの入力が必須となる場合があります。.

ライブラリに関しては、使用する言語に応じて選択できます:

AJAXリクエストを再現するための「requests」(Python)および「axios」(JavaScript)ライブラリ
PythonとJavaScriptには、AJAXリクエストを実行するためのライブラリとして、「requests」と「axios」の2つがあります。©Christina(Alucare.fr)

方法 2:ヘッドレスブラウザを使用する

これは最も簡単な方法です。 動的ページのスクレイピング. グラフィカルユーザーインターフェースのない、本物のウェブブラウザを自動化します。このブラウザは、ユーザーが操作する場合とまったく同じようにページを表示し、 ジャバスクリプト, AJAX呼び出しを実行し、最終的なコンテンツを表示します。.

利点:

  • 君はまさにスクラップしている ユーザーに表示される内容, 、読み込まれたコンテンツを含めて。.
  • これは 導入が容易, 、たとえ非常に動的なサイトであっても。.

不便な点:

  • これは 低調 直接的な要請よりも。.
  • これは リソースを大量に消費する, 、というのも、完全なブラウザを起動しているからだ。.

このアプローチで最もよく使われるツールは以下の通りです:

  • Selenium :汎用性が高く、長い歴史を持ち、充実したドキュメントを備えたツール。.
  • Playwright : モダンで高速、かつマルチブラウザ対応。.
  • Puppeteer : 専門分野は ChromeChromium.

AJAXページのスクレイピングにおけるヘッドレスブラウザ「Puppeteer」、「Playwright」、「Selenium」の比較
Puppeteer、Playwright、Seleniumは、ヘッドレスブラウザを自動化して動的なページをスクレイピングします。©Christina(Alucare.fr)

ヘッドレスブラウザを以下と組み合わせて使用できます BeautifulSoup (モジュール bs4) :ブラウザはページを読み込み、 レンダリング JavaScriptを、それから君は parses ライブラリを使用してレンダリングされたHTML。.

方法3:オールインワンのスクレイピングAPI

一部のプラットフォームでは、 包括的なスクレイピングサービスうち フリーツール あるいは市場で有料のもの。例を挙げると Bright Data, ZenRows, ScrapingBee どこ Crawlbase. これらは自動的に JavaScriptレンダリング、 彼ら 代理人 そしてデータ抽出 : URLを送ると、最終的なコンテンツが返ってくる。.

利点:

  • シンプルで信頼性が高い, 、たとえ大規模であっても。.
  • お客様側でのインフラやプロキシの管理は一切必要ありません。.

不便な点:

  • the 費用が高くなる可能性がある 数量に応じて。.
  • 君は より少ない制御 プロセスについて。

Bright Dataのインターフェース:AJAXサイト向けのオールインワン・スクレイピングAPI
Bright Dataは、JavaScriptのレンダリングやプロキシを管理するオールインワンのスクレイピングAPIです。©Christina(Alucare.fr)

AJAXを使用したサイトのスクラッピング方法

以下に、記事を以下を通じて読み込むサイトを具体的にスクレイピングする方法を示します。 AJAX, 、C言語のコード例を2つ掲載しています パイソン : 1つは requests, 、そのうちの1つは ヘッドレスブラウザ.

1. 開発ツールでAJAXリクエストを特定する

AJAXで読み込まれたコンテンツは、 元のHTML. したがって、データを取得するネットワーク呼び出しを特定する必要がある。.

  • 開く 開発ツール お使いのブラウザの(キー F12 または右クリックして「要素を検査」を選択します)。.
  • [タブ] を開く ネットワーク (Network) その後、ページを再読み込みします。.
  • それらを観察する サイトによってトリガーされたリクエスト, 、記事の読み込みを行うものを含め。.
  • タイプ別クエリのフィルタ XHR どこ fetch : これらがバックグラウンドでデータを取得する役割を担っています。.

正しいクエリをクリックして、その URL、 彼の ヘッダー とその回答。たいていの場合、回答は次のような形式で表示されます。 JSON, 、場合によってはHTML形式で。.

2. スクレイピング手法の選択

AJAXリクエストを特定したら、2つの選択肢があります。.

  • クエリを再現する : Pythonのライブラリを使って、その呼び出しを直接再現します requests. 生データを取得するには JSON あるいは、ブラウザを使わずにHTML形式で表示することもできます。これが最も手っ取り早い方法です。.
  • ヘッドレスブラウザ : サイトがJavaScriptの実行や複雑な操作(クリック、スクロールなど)を必要とする場合は、 Selenium どこ Playwright. このツールは、実際のユーザーと同じようにページを読み込みます。.

3. requests を使用して AJAX リクエストを再現する

「ネットワーク」タブで特定された通話を再生するための基本コードは以下の通りです。.

リクエストのインポート

# 開発者ツールで特定されたAJAXリクエストのURL
url = 'https://example.com/ajax-endpoint'

# リクエストのパラメータ (観測されたデータに合わせて調整してください)
params = {
    'page': 1,
    'category': 'technology'
}

# 「ネットワーク」タブからコピーするヘッダー(User-Agent、Referer、tokenなど)
headers = {
    'User-Agent': 'Mozilla/5.0',
    'X-Requested-With': 'XMLHttpRequest'
}

# GETリクエストの送信
response = requests.get(url, params=params, headers=headers)

# レスポンスのステータスを確認
if response.status_code == 200:
    data = response.json()
    print(data)
else:
    print(f"エラー {response.status_code}")

行ごとの詳細:

  • import requests : HTTPリクエストを送信するライブラリを読み込みます。.
  • url : このアドレスを、 [ネットワーク] タブ.
  • headers : 「ネットワーク」タブに表示されるヘッダーをコピーします。一部のサイトでは、 User-AgentReferer またはトークン CSRF リクエストを受け入れるには。.
  • A ステータス 200 は、リクエストが成功したことを意味します。.
  • response.json() JSONレスポンスをPythonの辞書に変換します。.
  • print(data) : 抽出されたデータ(商品リスト、価格など)を表示します。.
  • else : 呼び出しが失敗した場合、エラーコードを表示します(例: 403 どこ 404).

4. ヘッドレスブラウザを使用したスクレイピング(Selenium + BeautifulSoup)

クエリの複製だけでは不十分な場合、ブラウザは ヘッドレス JavaScriptを代わりに実行します。その後、レンダリングされたHTMLを取得し、それを parsesBeautifulSoup (モジュール bs4).

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
import time

# Chromeをヘッドレスモード(インターフェースなし)で起動する
options = Options()
options.add_argument("--headless")
driver = webdriver.Chrome(options=options)

# AJAXでコンテンツを読み込むページを開く
driver.get("https://example.com")

# JavaScriptによるデータの読み込みを待つ
time.sleep(3)

# BeautifulSoupを使用してレンダリングされたHTMLを解析する
soup = BeautifulSoup(driver.page_source, "html.parser")
articles = soup.find_all("div", class_="article")

for article in articles:
    print(article.get_text())

driver.quit()

ここだよ、 Selenium 本物のパイロット Chrome が担当する レンダリング ページの、そして driver.page_source AJAXによるコンテンツの読み込みが完了すると、HTMLを返します。. PlaywrightPuppeteer 同じ仕組みで動作しますが、構文が異なります。.

5. JSONまたはレンダリングされたHTMLからデータを抽出する

回答を取得したら、その形式に応じて必要な情報を抽出する。.

  • JSON形式での応答 : 使用する response.json() Pythonの辞書を取得し、キーを使って値にアクセスします。.
  • HTML形式での回答 : 経由して BeautifulSoup (モジュール bs4) と find どこ select クラスやIDを使って要素を指定するため。.

どのAJAXスクレイピング手法を選ぶべきか?

それぞれのアプローチには、あなたのレベルや目標に応じて、それぞれ長所があります。以下に簡単な比較表を掲載します。.

方法 スピード 複雑性 料金 ~に最適…
クエリの複製 非常に速い 高い 弱い 大規模なスクレイピング、構造化データ
ヘッドレスブラウザ 遅い 平均 弱い 複雑なサイト、短期間のプロジェクト、初心者
スクレイピングAPI 速い 非常に低い 高い 重要なプロジェクト、インフラのメンテナンス不要

実践編:まずは クエリの複製 AJAXエンドポイントが正しいJSONを返す場合。次の ヘッドレスブラウザ JavaScriptが不可欠になった時点で。.

AJAXスクレイピングの課題とその解決策とは?

サイトをスクレイピングする AJAX 従来のスクレイピングでは生じない問題を引き起こします。ここでは、主な課題と、とりわけそれらを回避する方法について解説します。.

課題1:一見して見えないコンテンツ

AJAXページを読み込むと、 初期のHTMLは空であることがよくあります : データはJavaScriptの実行が終わってからしか届きません。解決策としては、次のようなヘッドレスブラウザを使用することです。 Selenium, Playwright どこ Puppeteer, 、その役割を担っているのは レンダリング ページ全体を閲覧してから、その内容を読む。.

課題2:失敗する単純なクエリ

AJAXリクエストを再現するだけでは、必ずしも十分とは限りません。多くのサイトでは APIを保護する, そしてあなたのリクエストは エラー 403 一方、ブラウザ自体は正常にレスポンスを受け取っています。リクエストに情報が不足しています。実際には、多くの場合、次のような処理が必要になります:

  • をコピーする headers 必須 [Network] タブに表示される(例: User-Agent どこ Referer).
  • を追加する。 トークン CSRF または、サーバーが要求する場合のセッションクッキー。.
  • チェック ステータスコード 回答から、何が原因で詰まっているのかを素早く特定するため。.

課題3:積載時間の管理

AJAXによって読み込まれたデータは、 現れるのに時間がかかる. スクラッパーがページを読み込むのが早すぎると、何も見つかりません。ニーズに応じて2つのアプローチがあります:

  • 固定休止 (1 sleep (秒単位)で、ページを読み込む前に。シンプルだが、信頼性は低い。.
  • 条件付き待機, 、はるかにきれいな、以下の 待ち時間Selenium : ……’暗黙の期待 要素が利用可能になるまで自動的に待機しますが、一方、’明示的な期待 特定の要素または条件が満たされるのを待ってから、処理を続行します。.

課題4:ブロックされずに大規模なスクレイピングを行う

数ページ程度なら問題ない。でも、もしスクレイピングするなら 数千ページ, 、そうしていると、サイト側に気づかれてブロックされてしまう。長く続けるためには:

  • やってみて リクエストをプロキシ経由で送信する IPアドレスを変化させるために。.
  • 1つ守る 通話間の間隔 一度にすべてを送るのではなく。.
  • を管理する ページ番号 そしてその 無限スクロール 徐々に、まるで本物の観光客のように。.

重要なのは、目立たないようにすることだ。人間の振る舞いに近ければ近いほど、接続を切断されるリスクは低くなる。.

よくある質問

BeautifulSoupを使って、AJAXを使用しているウェブサイトをスクレイピングすることはできますか?

直接ではない。. BeautifulSoup は、 静的解析 : これは、最初に読み込まれたHTMLのみを読み取ります。AJAXはJavaScriptを介してコンテンツを挿入するため、このJavaScriptを実行できるツール(例えば Selenium どこ Playwright. ヘッドレスブラウザがレンダリングされたHTMLを取得し、そのコンテンツを BeautifulSoup のために 解析.

別の方法:直接 AJAXリクエスト そして、JSON形式のレスポンスを取得します。これは、HTMLよりも処理しやすい場合が多いです。.

AJAXサイトにおいて、認証エラーやセッションヘッダーをどのように処理すればよいでしょうか?

保護されたサイトはエラーを返す場合があります 401 (許可されていない)または 403 (禁止)リクエストに正しいものが含まれていない場合 クッキー あるいはHTTPヘッダー。解決策: これらの情報を傍受する 最初の読み込み時に取得し、その後、シミュレートしたAJAXリクエストで再利用します。また、多くのサイトでは CSRFトークン またはヘッダー X-Requested-With, 、これがなければサーバーはリクエストを拒否します。まさにその理由から、単純なリクエスト requests 船が通る場所で座礁する。.

無限スクロールや「さらに読み込む」ボタンがあるサイトをスクレイピングするにはどうすればよいですか?

無限スクロールは、AJAXによる読み込みの一種です。これを自動化するには、次の2つの方法があります:

  • AJAXリクエストの識別 追加コンテンツを読み込み、それを直接再生する(多くの場合、ページネーションパラメータを含むURL)。.
  • あるいは 「さらに読み込む」ボタンをクリックする動作をシミュレートする 次のようなヘッドレスブラウザを介して Selenium どこ Puppeteer, 、すべてのデータが復元されるまで。.

AJAXスクレイピング用のChrome拡張機能はありますか?

はい。 いくつかの Chrome拡張機能 簡単な用途であれば、コードを1行も書かずにAJAXスクレイピングを容易に行えます。最もよく知られているものは:

  • Web Scraper
  • Data Miner
  • Instant Data Scraper

AJAXを使用しているウェブページから抽出されたデータを表示するChrome拡張機能「Instant Data Scraper」。.
「Instant Data Scraper」は、コーディングなしでウェブページのデータを収集できるChrome拡張機能です。©Christina(Alucare.fr)

SeleniumやPlaywrightにおいて、明示的な「wait」と暗黙的な「wait」にはどのような違いがあるのでしょうか?

  • A 暗黙の待機 これは、すべての要素に適用されるグローバルな待機処理です。要素が表示されない場合、スクリプトは一定時間待機してからエラーを発生させます。.
  • A 明示的な待機 これは、特定の要素を対象とした条件付き待機です。条件が満たされるまで待機するだけです。.

実際には、 明示的な待機 の方が望ましい:AJAXコンテンツの読み込みに時間がかかる場合、不必要な遅延を防ぎ、エラーを減らすことができる。.

要するに、AJAXを使ったスクレイピングには少し工夫が必要ですが、適切な方法を使えば、見逃すことはありません。皆さんはどうですか? AJAXサイトからデータをスクレイピングする際、どのような方法を使っていますか? コメント欄でコツを共有してください。.

👍あなたの意見
記事は参考になる
記事は客観的である
記事は私の質問に答えている
コンテンツは最新
エラーが見つかりましたか? 場所を教えてください!

気に入りましたか?シェアする

このコンテンツはもともと フランス語で (すぐ下のエディタを参照)。DeeplやGoogle翻訳APIを使用して様々な言語で翻訳・校正されており、できるだけ多くの国で利用できるようになっています。この翻訳には毎月数千ユーロのコストがかかっています。もし100 %が完璧でない場合は、コメントを残していただければ修正いたします。校正や翻訳記事の品質向上にご興味のある方は、お問い合わせフォームからメールをお送りください!
私たちは、私たちのコンテンツを改善するためにあなたのフィードバックに感謝します。ご意見・ご感想は、お問い合わせフォームまたは下記までお寄せください。 あなたのコメントは、私たちのウェブサイトAlucare.frの品質を向上させるために常に役立ちます。


Alucareは独立系メディアです。Googleニュースのお気に入りに追加して応援してください:

ディスカッション・フォーラムにコメントを投稿する