PHPでGoutteを使ったWebスクレイピング:2025チュートリアル

このステップバイステップガイドでGoutteウェブスクレイピングをマスターしましょう。より良いデータ抽出のために、セットアップ、代替案、スクレイピングの制限を回避する方法を学びます。
2 分読
Web Scraping With Goutte blog image

このGoutteウェブ・スクレイピング・ガイドでは、以下のことを学びます:

  • PHPライブラリGoutteとは
  • ステップバイステップのチュートリアルでウェブスクレイピングに使用する方法
  • ウェブスクレイピングのためのGoutteに代わるもの
  • このアプローチの限界と可能な解決策

さあ、飛び込もう!

グーテとは何か?

Goutteは画面スクレイピングとウェブクローリングのためのPHPライブラリで、直感的なAPIを提供してウェブサイトをナビゲートし、HTML/XMLレスポンスからデータを抽出します。HTTPクライアントとHTML解析機能が統合されており、HTTPリクエストでWebページを取得し、データスクレイピングのために処理することができます。

:2023年4月1日現在、Goutteはメンテナンスされておらず、現在は非推奨とされている。しかし、この記事を書いている時点では、まだ確実に機能している。

Goutteでウェブスクレイピングを行う方法:ステップ・バイ・ステップ・ガイド

このステップバイステップのチュートリアルセクションに従って、”Hockey Teams“サイトからデータを抽出するためのGoutteの使い方をご覧ください:

ホッケーチーム」ターゲットページ

目標は、上の表からデータを抽出し、CSVファイルにエクスポートすることである。

Goutteでウェブスクレイピングを行う方法を学ぶ時間だ!

ステップ1:プロジェクトのセットアップ

始める前に、お使いのシステムがGoutteの要件-PHP7.1以上-を満たしていることを確認してください。現在のPHPバージョンを確認するには、以下のコマンドを実行してください:

  php -v

出力は次のようになるはずだ:

  PHP 8.4.3 (cli) (built: Jan 19 2025 14:20:58) (NTS)nCopyright (c) The PHP GroupnZend Engine v4.4.3, Copyright (c) Zend Technologiesn    with Zend OPcache v8.4.3, Copyright (c), by Zend Technologies

PHPのバージョンが7.1より低い場合は、先に進む前にPHPをアップグレードする必要があります。

次に、GoutteはPHPの依存性マネージャであるComposerを介してインストールされることに留意してください。Composerがインストールされていない場合は、公式サイトからダウンロードし、インストール手順に従ってください。

次に、Goutteプロジェクト用の新しいディレクトリを作成し、ターミナルでそこに移動する:

  mkdir goutte-parserncd goutte-parser

次に、composer initコマンドを使って、フォルダ内のComposerプロジェクトを初期化する:

  composer init

Composerは、パッケージ名や説明など、プロジェクトの詳細を入力するよう促します。デフォルトの答えで大丈夫ですが、あなたの目的に応じて自由にカスタマイズしてください。

次に、プロジェクトフォルダをお好みの PHP IDE で開きます。Visual Studio Code (PHP 拡張モジュール付き)あるいはIntelliJ WebStormがよいでしょう。

プロジェクトフォルダーに空のindex.phpファイルを作成する:

  php-html-parser/n  ├── vendor/n  ├── composer.jsonn  └── index.php

index.phpを開き、Composerライブラリをインポートするために以下のコードを追加する:

  u003c?phpnnrequire_once __DIR__ . u0022/vendor/autoload.phpu0022;nn// scraping logic...

このファイルには間もなくグーテのスクレイピング・ロジックが含まれることになる。

これで、このコマンドを使ってスクリプトを実行できる:

  php index.php

素晴らしい!これでPHPでGoutteを使ったデータスクレイピングの準備は完了です。

ステップ2:Goutteのインストールと設定

以下のComposeコマンドでGoutteをインストールする:

  composer require fabpot/goutte

これで、composer.jsonファイルにfabpot/goutteの依存関係が追加され、以下を含むようになります:

  u0022requireu0022: {n    u0022fabpot/goutteu0022: u0022^4.0u0022n}

index.phpに以下のコードを追加してGoutteをインポートする:

  use GoutteClient;

これは、ターゲット・ページに接続し、そのHTMLを解析し、そこからデータを抽出するために使用できるGoutte HTTPクライアントを公開している。その方法は次のステップで説明する!

ステップ #3: ターゲットページのHTMLを取得する

まず、新しいGoutte HTTPクライアントを作成する:

  $client = new Client();

GoutteのClientクラスは、SymfonyのBrowserKitHttpBrowserコンポーネントのラッパーです。Laravelを使ったWebスクレイピングのガイドで動作しているところをご覧ください。

次に、対象となるウェブページのURLを変数に格納し、request()メソッドを使用してその内容を取得します:

  $url = u0022https://www.scrapethissite.com/pages/forms/u0022;n$crawler = $client-u003erequest(u0022GETu0022, $url);

これはWebページにGETリクエストを送り、HTMLドキュメントを取得し、あなたのためにそれを解析します。具体的には、$crawlerオブジェクトはsymfonyのDomCrawlerコンポーネントのすべてのメソッドへのアクセスを提供します。crawlerはページからデータを抽出するために使うオブジェクトです。

驚いた!これでGoutteウェブスクレイピングに必要なものはすべて揃った。

ステップ#4: 目的のデータをスクレイピングする準備

データを抽出する前に、対象ページのHTML構造に慣れておく必要がある。

まず、対象データはテーブル内の行に表示されることを覚えておこう。テーブルには複数の行が含まれるため、スクレイピングしたデータを格納するデータ構造としては配列が適している:

  $teams = [];

次に、テーブルのHTML構造に注目する。ブラウザで目的のページにアクセスし、目的のデータを含むテーブルを右クリックし、”Inspect “オプションを選択する:

table要素のHTML構造

DevToolsでは、テーブルがtableクラスを持っていて、id=`”“hockey“という要素を持つ

要素に含まれていることがわかりますこれは、以下のCSSセレクタを使用してテーブルをターゲットにできることを意味します:

  #hockey .table

CSS セレクタを適用し、$crawler->filter()メソッドを使用してテーブルノードを選択します:

  $table = $crawler-u003efilter(u0022#hockey .tableu0022);

次に、各行がチームというクラスを持つ

要素で表現されていることに注意してください。すべての行を選択し、繰り返し処理を行い、データを抽出する準備をします:

      $table-u003efilter(u0022tr.teamu0022)-u003eeach(function ($tr) use (u0026$teams) {n      // data extraction logic...n    });

素晴らしい!これでGoutteデータスクレイピングの骨格ができた。

ステップ#5:データ抽出ロジックの実装

前回同様、今回はテーブルの中の行を検査する:

行要素のHTML構造

各行には、専用のカラムに以下の情報が含まれていることにお気づきだろう:

  • チーム名 →.name要素内
  • シーズン年 →.year要素内
  • 勝利数 →.wins要素内
  • .loss要素内の損失数→損失数
  • 時間外損失 →.ot-losses要素内
  • 勝率 →.pct要素内
  • 得点(Goals For – GF) →.gf要素内
  • 失点数(Goals Against – GA) →.ga要素内
  • ゴール差 →.diff要素内

ひとつの情報を取り出すには、次の2つのステップを踏む必要がある:

  1. filter() を使用して HTML 要素を選択する
  2. text()メソッドでテキストを取り出し、trim()で余分なスペースを削除します。

例えば、チーム名をスクレイピングすることができる:

  $teamElement = $tr-u003efilter(u0022.nameu0022);n$team = trim($teamElement-u003etext());

同様に、このロジックを他のすべての列に拡張する:

  $yearElement = $tr-u003efilter(u0022.yearu0022);n$year = trim($yearElement-u003etext());nn$winsElement = $tr-u003efilter(u0022.winsu0022);n$wins = trim($winsElement-u003etext());nn$lossesElement = $tr-u003efilter(u0022.lossesu0022);n$losses = trim($lossesElement-u003etext());nn$otLossesElement = $tr-u003efilter(u0022.ot-lossesu0022);n$otLosses = trim($otLossesElement-u003etext());nn$pctElement = $tr-u003efilter(u0022.pctu0022);n$pct = trim($pctElement-u003etext());nn$gfElement = $tr-u003efilter(u0022.gfu0022);n$gf = trim($gfElement-u003etext());nn$gaElement = $tr-u003efilter(u0022.gau0022);n$ga = trim($gaElement-u003etext());nn$diffElement = $tr-u003efilter(u0022.diffu0022);n$diff = trim($diffElement-u003etext());

行から目的のデータを取り出したら、それを$teams配列に格納します:

  $teams[] = [n  u0022teamu0022 =u003e $team,n  u0022yearu0022 =u003e $year,n  u0022winsu0022 =u003e $wins,n  u0022lossesu0022 =u003e $losses,n  u0022ot_lossesu0022 =u003e $otLosses,n  u0022win_percu0022 =u003e $pct,n  u0022goals_foru0022 =u003e $gf,n  u0022goals_againstu0022 =u003e $ga,n  u0022goal_diffu0022 =u003e $diffn];

すべての行をループした後、$teamsの配列は以下のようになる:

  Arrayn(n    [0] =u003e Arrayn        (n            [team] =u003e Boston Bruinsn            [year] =u003e 1990n            [wins] =u003e 44n            [losses] =u003e 24n            [ot_losses] =u003en            [win_perc] =u003e 0.55n            [goals_for] =u003e 299n            [goals_against] =u003e 264n            [goal_diff] =u003e 35n        )nn    // ...nn    [24] =u003e Arrayn        (n            [team] =u003e Chicago Blackhawksn            [year] =u003e 1991n            [wins] =u003e 36n            [losses] =u003e 29n            [ot_losses] =u003en            [win_perc] =u003e 0.45n            [goals_for] =u003e 257n            [goals_against] =u003e 236n            [goal_diff] =u003e 21n        )n)

素晴らしい!グーテ・データ・スクレイピング成功。

ステップ#6:クローリングロジックの実装

さて、ターゲット・サイトは複数のページにわたってデータを提示し、一度に一部だけを表示することを忘れてはならない。テーブルの下には、すべてのページへのリンクを提供するページネーション要素があります:

ページネーション要素

このように、以下の簡単なステップで、スクレイピング・スクリプトのページネーションを管理することができる:

  1. ページネーション・リンク要素を選択する
  2. ページ分割されたページのURLを抽出する。
  3. 各ページにアクセスし、先ほど考案したスクレイピング・ロジックを適用する。

ページネーションのリンク要素を調べることから始めよう:

ページネーションリンク要素のHTML構造

以下のCSSセレクタを使えば、すべてのページネーション・リンクを選択できることに注意してください:

  .pagination li a

ステップ2を実装し、すべてのページネーションURLを収集するには、次のロジックを使用します:

  $urls = [$url];nn// select the pagination link elementsn$crawler-u003efilter(u0022.pagination li au0022)-u003eeach(function ($a) use (u0026$urls) {n  // construct the absolute URLn  $url = u0022https://www.scrapethissite.comu0022 . $a-u003eattr(u0022hrefu0022);nn  // add the pagination URL to the list only if it is not already presentn  if (!in_array($url, $urls)) {n    $urls[] = $url;n  }n});

これは、ページ分割リンクを保存する URL のリストを初期化します。そして、すべてのページ分割要素を選択し、 新しい URL がまだ存在しない場合にのみ$urls配列に追加します。ページの URL は相対 URL なので、リストに追加する前に絶対 URL に変換しなければなりません。

ページネーション処理は一度だけ実行されるべきで、データ抽出とは直接関係しないので、関数でラップするのが最善です:

  function getPaginationUrls($client, $url)n{n  // connect to the first page of the siten  $crawler = $client-u003erequest(u0022GETu0022, $url);nn  // initialize the list of URLs to scrape with the current URLn  $urls = [$url];nn  // select the pagination link elementsn  $crawler-u003efilter(u0022.pagination li au0022)-u003eeach(function ($a) use (u0026$urls) {n    // construct the absolute URLn    $url = u0022https://www.scrapethissite.comu0022 . $a-u003eattr(u0022hrefu0022);nn    // add the pagination URL to the list only if it is not already presentn    if (!in_array($url, $urls)) {n      $urls[] = $url;n    }n  });nn  return $urls;n}

このようにgetPaginationUrls()関数を呼び出すことができます:

  $urls = getPaginationUrls($client, u0022https://www.scrapethissite.com/pages/forms/?page_num=1u0022);

実行後、$urlsはすべてのページ分割されたURLを含む:

  Arrayn(n    [0] =u003e https://www.scrapethissite.com/pages/forms/?page_num=1n    [1] =u003e https://www.scrapethissite.com/pages/forms/?page_num=2n    [2] =u003e https://www.scrapethissite.com/pages/forms/?page_num=3n    [3] =u003e https://www.scrapethissite.com/pages/forms/?page_num=4n    [4] =u003e https://www.scrapethissite.com/pages/forms/?page_num=5n    [5] =u003e https://www.scrapethissite.com/pages/forms/?page_num=6n    [6] =u003e https://www.scrapethissite.com/pages/forms/?page_num=7n    [7] =u003e https://www.scrapethissite.com/pages/forms/?page_num=8n    [8] =u003e https://www.scrapethissite.com/pages/forms/?page_num=9n    [9] =u003e https://www.scrapethissite.com/pages/forms/?page_num=10n    [10] =u003e https://www.scrapethissite.com/pages/forms/?page_num=11n    [11] =u003e https://www.scrapethissite.com/pages/forms/?page_num=12n    [12] =u003e https://www.scrapethissite.com/pages/forms/?page_num=13n    [13] =u003e https://www.scrapethissite.com/pages/forms/?page_num=14n    [14] =u003e https://www.scrapethissite.com/pages/forms/?page_num=15n    [15] =u003e https://www.scrapethissite.com/pages/forms/?page_num=16n    [16] =u003e https://www.scrapethissite.com/pages/forms/?page_num=17n    [17] =u003e https://www.scrapethissite.com/pages/forms/?page_num=18n    [18] =u003e https://www.scrapethissite.com/pages/forms/?page_num=19n    [19] =u003e https://www.scrapethissite.com/pages/forms/?page_num=20n    [20] =u003e https://www.scrapethissite.com/pages/forms/?page_num=21n    [21] =u003e https://www.scrapethissite.com/pages/forms/?page_num=22n    [22] =u003e https://www.scrapethissite.com/pages/forms/?page_num=23n    [23] =u003e https://www.scrapethissite.com/pages/forms/?page_num=24n)

完璧だ!Goutteにウェブクローリングを実装したところだ。

ステップ#7:すべてのページからデータをかき集める

これですべてのページのURLが配列に格納されたので、1つずつスクレイピングすることができる:

  1. リストの反復処理
  2. 各URLのHTMLコンテンツの取得と解析
  3. 必要なデータの抽出
  4. スクレイピングした情報を$teams配列に格納する。

上記のロジックを以下のように実装する:

  $teams = [];nn// iterate over all pages and scrape them allnforeach ($urls as $_ =u003e $url) {n  // logging which page the scraper is currently working onn  echo u0022Scraping webpage u0022$urlu0022...nu0022;nn  // retrieve the HTML of the current page and parse itn  $crawler = $client-u003erequest(u0022GETu0022, $url);nn  // $table = $crawler-u003e ...n  // data extraction logicn}

スクレイパーが操作している現在のページを記録するecho命令に注意してください。この情報はスクリプトが実行中に何をしているかを理解するのに便利です。

美しい!あとはスクレイピングしたデータをCSVのような人間が読める形式にエクスポートするだけだ。

ステップ#8:スクレイピングしたデータをCSVにエクスポートする

現在、スクレイピングされたデータは$teams配列に格納されています。他のチームがアクセスできるようにし、分析しやすくするには、CSVファイルにエクスポートします。

PHP はfputcsv()関数によって CSV エクスポートをビルトインでサポートしています。この関数を使用して、スクレイピングしたデータをteams.csvという名前のファイルに書き出します:

  // open the output file for writingn$file = fopen(u0022teams.csvu0022, u0022wu0022);nn// write the header rownfputcsv($file, [u0022Team Nameu0022, u0022Yearu0022, u0022Winsu0022, u0022Lossesu0022, u0022OT Lossesu0022, u0022Win %u0022,u0022Goals For (GF)u0022,        u0022Goals Against (GA)u0022, u0022+ / -u0022]);nn// append each team as a new rownforeach ($teams as $team) {n  fputcsv($file, [n    $team[u0022teamu0022],n    $team[u0022yearu0022],n    $team[u0022winsu0022],n    $team[u0022lossesu0022],n    $team[u0022ot_lossesu0022],n    $team[u0022win_percu0022],n    $team[u0022goals_foru0022],n    $team[u0022goals_againstu0022],n    $team[u0022goal_diffu0022]n  ]);n}nn// close the filenfclose($file);

ミッション完了!グーテ・スクレーパーは完全に機能する。

ステップ9:すべてをまとめる

あなたのGoutteウェブスクレイピングスクリプトは、これで以下の内容を含んでいるはずです:

  u003c?phpnnrequire_once __DIR__ . u0022/vendor/autoload.phpu0022;nnuse GoutteClient;nnfunction getPaginationUrls($client, $url)n{n  // connect to the first page of the siten  $crawler = $client-u003erequest(u0022GETu0022, $url);nn  // initialize the list of URLs to scrape with the current URLn  $urls = [$url];nn  // select the pagination link elementsn  $crawler-u003efilter(u0022.pagination li au0022)-u003eeach(function ($a) use (u0026$urls) {n    // construct the absolute URLn    $url = u0022https://www.scrapethissite.comu0022 . $a-u003eattr(u0022hrefu0022);nn    // add the pagination URL to the list only if it is not already presentn    if (!in_array($url, $urls)) {n      $urls[] = $url;n    }n  });nn  return $urls;n}nn// initialize a new Goutte HTTP clientn$client = new Client();nn// get the URLs of the pages to scrapen$urls = getPaginationUrls($client, u0022https://www.scrapethissite.com/pages/forms/?page_num=1u0022);nn// where to store the scraped datan$teams = [];nn// iterate over all pages and scrape them allnforeach ($urls as $_ =u003e $url) {n  // logging which page the scraper is currently working onn  echo u0022Scraping webpage u0022$urlu0022...nu0022;nn  // retrieve the HTML of the current page and parse itn  $crawler = $client-u003erequest(u0022GETu0022, $url);nn  // select the table element with the data of interestn  $table = $crawler-u003efilter(u0022#hockey .tableu0022);nn  // iterate over each row and extract data from themn  $table-u003efilter(u0022tr.teamu0022)-u003eeach(function ($tr) use (u0026$teams) {n    // data extraction logicnn    $teamElement = $tr-u003efilter(u0022.nameu0022);n    $team = trim($teamElement-u003etext());nn    $yearElement = $tr-u003efilter(u0022.yearu0022);n    $year = trim($yearElement-u003etext());nn    $winsElement = $tr-u003efilter(u0022.winsu0022);n    $wins = trim($winsElement-u003etext());nn    $lossesElement = $tr-u003efilter(u0022.lossesu0022);n    $losses = trim($lossesElement-u003etext());nn    $otLossesElement = $tr-u003efilter(u0022.ot-lossesu0022);n    $otLosses = trim($otLossesElement-u003etext());nn    $pctElement = $tr-u003efilter(u0022.pctu0022);n    $pct = trim($pctElement-u003etext());nn    $gfElement = $tr-u003efilter(u0022.gfu0022);n    $gf = trim($gfElement-u003etext());nn    $gaElement = $tr-u003efilter(u0022.gau0022);n    $ga = trim($gaElement-u003etext());nn    $diffElement = $tr-u003efilter(u0022.diffu0022);n    $diff = trim($diffElement-u003etext());nn    // add the scraped data to the arrayn    $teams[] = [n      u0022teamu0022 =u003e $team,n      u0022yearu0022 =u003e $year,n      u0022winsu0022 =u003e $wins,n      u0022lossesu0022 =u003e $losses,n      u0022ot_lossesu0022 =u003e $otLosses,n      u0022win_percu0022 =u003e $pct,n      u0022goals_foru0022 =u003e $gf,n      u0022goals_againstu0022 =u003e $ga,n      u0022goal_diffu0022 =u003e $diffn    ];n  });n}nn// open the output file for writingn$file = fopen(u0022teams.csvu0022, u0022wu0022);nn// write the header rownfputcsv($file, [u0022Team Nameu0022, u0022Yearu0022, u0022Winsu0022, u0022Lossesu0022, u0022OT Lossesu0022, u0022Win %u0022,u0022Goals For (GF)u0022,        u0022Goals Against (GA)u0022, u0022+ / -u0022]);nn// append each team as a new rownforeach ($teams as $team) {n  fputcsv($file, [n    $team[u0022teamu0022],n    $team[u0022yearu0022],n    $team[u0022winsu0022],n    $team[u0022lossesu0022],n    $team[u0022ot_lossesu0022],n    $team[u0022win_percu0022],n    $team[u0022goals_foru0022],n    $team[u0022goals_againstu0022],n    $team[u0022goal_diffu0022]n  ]);n}nn// close the filenfclose($file);

このコマンドで起動する:

  php index.php

スクレーパーは次のような出力を記録する:

  Scraping webpage u0022https://www.scrapethissite.com/pages/forms/?page_num=1u0022...n// omitted for brevity..nScraping webpage u0022https://www.scrapethissite.com/pages/forms/?page_num=24u0022...

実行の最後には、このデータを含むteams.csvファイルがプロジェクトフォルダーに表示されます:

CSV出力ファイル

出来上がり!ターゲット・サイトの正確なデータが、構造化されたフォーマットで利用可能になった。

ウェブスクレイピング用PHP Goutteライブラリの代替品

この記事の冒頭で述べたように、Goutteは非推奨であり、もはやメンテナンスされていない。つまり、別の解決策を検討する必要がある。

ライブラリの非推奨化に関するGitHubのアナウンス

GitHubで説明されているように、Goutte v4は本質的にSymfonyのHttpBrowserクラスのプロキシになったので、移行すべきです。そのためには、これらのライブラリをインストールするだけです:

  composer require symfony/browser-kit symfony/http-client

そして、交換する:

  use GoutteClient;

  use SymfonyComponentBrowserKitHttpBrowser;

最後に、プロジェクトの依存関係からGoutteを削除する。基本的なAPIは変わらないので、スクリプトを大きく変更する必要はないはずだ。

Goutteの代わりに、HTTPクライアントとHTMLパーサーを組み合わせることもできる。お勧めの選択肢をいくつか紹介しよう:

  • HTTPリクエストを行うためのGuzzleまたはcURL。
  • DomHTMLDocument, Simple HTML DOM Parser あるいはDomCrawlerを使ってPHP で HTML をパースします。

これらの選択肢はすべて、より柔軟性を与え、あなたのウェブスクレイピングスクリプトが長期的に保守可能であることを保証します。

ウェブスクレイピングのこのアプローチの限界

Goutteは強力なツールだが、ウェブスクレイピングに使うにはいくつかの制限がある:

これらの制限のいくつかは、PHPを使ったWebスクレイピングのガイドで取り上げているように、別のライブラリや別のアプローチを使うことで軽減することができます。それでも、Web Unlocker APIを使うことでしか回避できないスクレイピング対策には常に直面することになります。

Web Unlocker API は、アンチボット保護を回避し、あらゆるウェブページの生の HTML を取得するために設計された、特殊なスクレイピング・エンドポイントです。APIコールを行い、返されたコンテンツを解析するのと同じくらいシンプルです。このアプローチでは、この記事で示されたように、Goutte (もしくは symfony の更新されたコンポーネント) とシームレスに統合できます。

結論

このガイドでは、ステップバイステップのチュートリアルを通して、Goutteとは何か、Webスクレイピングのために何を提供してくれるのかを探りました。このライブラリは現在では非推奨となっているため、代替となるライブラリもいくつか紹介しました。

どのPHPスクレイピング・ライブラリを選ぶかにかかわらず、最大の課題は、ほとんどのウェブサイトがアンチボットとアンチスクレイピング技術を用いてデータを保護していることです。これらのメカニズムは、自動化されたリクエストを検知してブロックすることができるため、従来のスクレイピング手法は効果がありません。

幸いなことに、Bright Dataはこのような問題を回避するための一連のソリューションを提供しています:

  • ウェブアンロッカー:アンチスクレイピング保護をバイパスし、最小限の労力であらゆるウェブページからクリーンなHTMLを提供するAPI。
  • スクレイピング・ブラウザ:JavaScriptレンダリングを備えたクラウドベースの制御可能なブラウザ。CAPTCHA、ブラウザフィンガープリント、再試行などを自動的に処理します。PantherやSelenium PHPとシームレスに統合できます。
  • ウェブスクレイピングAPI:数十の一般的なドメインから構造化されたウェブデータにプログラムでアクセスするためのエンドポイント。

ウェブスクレイピングはしたくないけれど、「オンラインウェブデータ」に興味がある?すぐに使えるデータセットをご覧ください!

今すぐBright Dataに登録し、無料トライアルを開始してスクレイピングソリューションをお試しください。