PHP 動的なサイトを作成するためだけのものではありません。また、 オンラインでデータを収集する.
専門ライブラリのおかげで、簡単に スクレーパーをセットする 効果的だ。その方法を見てみよう。

PHPでスクレイピングするための前提条件
始める前に、:
- ✅ 持つこと PHPによる基本プログラミング.
- ✅ 持つこと HTMLとCSSの知識 を使用して、抽出するデータのターゲットを絞ります。
- ✅ 使い方を知る ダイヤルこれは、Guzzle、Symfony DomCrawler、GoutteなどのスクレイピングライブラリをインストールするためのPHPの依存関係を管理するツールです。
- ✅ 持つこと ローカルウェブサーバー でコードを実行します(XAMPP、WAMP、MAMP)。
- ✅ 持つこと コードエディタ を使用してPHPスクリプトを記述します。
PHPを使ったウェブスクレイピングに欠かせないツールとは?
PHPだけでは十分ではない。ここでは 図書館 スクレイピングを迅速かつ効率的に行う。
1.Guzzle : HTTPクライアント
ガズル のための最も広く使われているライブラリである。 HTTPリクエストを送信するインストールするには ダイヤルターミナルを開き、プロジェクトフォルダーに移動し、.NETコマンドを入力する:
composer require guzzlehttp/guzzle
Composerはライブラリをダウンロードし、あなたのコードで直接使えるようにする。
以下は URLのコンテンツを取得する :
request('GET', $url);
// HTTP コードを取得する
$statusCode = $response->getStatusCode();
// ページコンテンツを取得する
$content = $response->getBody()->getContents();
echo "HTTP コード : " .$statusCode .PHP_EOL;
echo "ページの内容:" .PHP_EOL;
echo $content;
} catch (応答なし例外 $e) { { echo "エラー: " .
echo "エラー: " .$e->getMessage();
}
2. Symfony DomCrawler と Goutte:データ抽出
HTMLの閲覧や分析には、2つのライブラリが広く使われている:
- symfony DomCrawler CSSセレクタを使用してHTMLをナビゲートし、特定の要素をターゲットにすることができます。
- ドロップ GuzzleとDomCrawlerのラッパーであるDomCrawlerは、スクレイピングプロセスを大幅に簡素化する。
symfony DomCrawlerを使った例 :
request('GET', 'https://exemple.com');
$html = $response->getBody()->getContents();
$crawler = new Crawler($html);
// クラスによる選択
$crawler->filter('.my-class')->each(function ($node) {)
echo $node->text() .PHP_EOL;
});
// IDによる選択
$crawler->filter('#mon-id')->each(関数 ($node) { )
echo $node->text() .PHP_EOL;
});
// タグによる選択
$crawler->filter('h1')->each(function ($node) { .
echo $node->text() .PHP_EOL;
});
グーテの例
request('GET', 'https://exemple.com');
// クラスによる選択
$crawler->filter('.ma-class')->each(function ($node) {)
echo $node->text() .PHP_EOL;
});
// IDによる選択
$crawler->filter('#mon-id')->each(関数 ($node) { )
echo $node->text() .PHP_EOL;
});
// タグによる選択
$crawler->filter('p')->each(function ($node) { .
echo $node->text() .PHP_EOL;
});
3.その他のライブラリやツール
さらに詳しく知りたい方は、以下のオプションをご覧ください:
- PHP-Scraper 🔥 PHPスクレイパー これは、HTMLやセレクタの複雑さを管理することで、ウェブページからの情報抽出を容易にするPHPライブラリです。Composerを介して、開発者によるプロジェクトで広く利用されています。
Composerによる#のインストール
コンポーザーはfabpot/goutteを必要とする
request('GET', 'https://example.com');
$title = $crawler->filter('title')->text();
echo "ページタイトル: " .$title;
- 🔥 ブライトデータ これは、プロキシを内蔵した大規模データ収集のためのプロフェッショナル向けプラットフォームです。

- 🔥 スクレイパーAPI これは、APIを介してアクセス可能なクラウドベースのウェブスクレイピングサービスです。すべての作業をローカルライブラリで行う代わりに、スクレイピングするページのURLを指定して、ScraperAPIのAPIに簡単なリクエストを送信します。
PHPで簡単なウェブスクレーパーを作るには?
PHPで機能的なスクレーパーを作成するためのチュートリアルです:
ステップ 1: 依存関係のインストール
用途 ダイヤル インストールする ドロップ に感謝する:
compose require ファブポット/グート
ステップ2:ページのコンテンツを取得する
作る HTTP GETリクエスト およびHTMLコンテンツを読み飛ばす というコマンドで、グーテを使ってページの:
request('GET', $url);
// 必要であれば、生のHTMLを取得する
$html = $crawler->html();
echo substr($html, 0, 500) .'...'; // プレビュー
ステップ3:データの抽出
ページのHTMLコンテンツを取得したら、特定のデータを抽出することが目的です。
のPHPコードの例です。 ページのタイトルをスクレイピングする をターゲットにCSSセレクタを使用しています。 <h2> 要素で <記事.
<?php
require 'vendor/autoload.php';
use Goutte\Client;
$client = new Client();
$url = 'https://exemple.com/blog'; // Remplacez par l'URL de votre page cible
// Faire une requête GET pour récupérer la page
$crawler = $client->request('GET', $url);
// Sélectionner les éléments <h2> dans <article> avec le sélecteur CSS
$titres = [];
$crawler->filter('article h2')->each(function ($node) use (&$titres) {
// Récupérer le texte du titre
$titres[] = trim($node->text());
});
// Afficher les titres extraits
print_r($titres);
?>
この例では:
- CSSセレクタ
項目 h2タグで記事タイトルを指定する。<h2>タグ内<記事. - 各タイトルのテキストは
テキスト()、そしてそれを表に追加します1TP65タイトル. - タイトルは次のように表示される。
print_r($itles);.
The CSSセレクタ (またはXPath)を使用することもできます。 抜粋 属性 HTML要素。例えば、各ブログのタイトルがリンクである場合、 <a>, 属性 href = "/stock/stock_detail.html? で記事のURLを取得する。
以下は、グーテを使った例である。 を取り出す。 リンク の記事:
request('GET', $url);
// タイトルのリンクを選択する
$itles = [];
$crawler->filter('article h2 a')->each(function ($node) use (&$itles) { // タイトルのリンクを選択する。
$itle = trim($node->text());
$link = $node->attr('href'); // 属性hrefを抽出する。
// タイトルとURLをテーブルに追加する
$itles[] = [
title' => $itle、
url' => $lien、
];
});
// 結果を表示する
print_r($itles);
?>
この例では:
- に含まれるリンクを選択します。
<a>タグ内<h2>要素で<記事. - 属性を取得します
href = "/stock/stock_detail.html?各リンクのattr('href'). - タイトルとそのURLがテーブルに追加される
1TP65タイトルと表示される。print_r($itles);.
絵画 1TP65タイトル の両方を持つ要素が含まれます。 タイトル そしてその リンク を返します。以下は、返されるデータのフォーマットの例である:
配列
(
[0] => 配列
(
[タイトル] => 記事1タイトル
[url] => /article1
)
[1] => 配列
(
[タイトル] => 記事2のタイトル
[url] => /article2
)
)
この例では:
- 配列の各要素は、2つのキーを持つ連想配列である:
タイトル記事のタイトルとしてurl対応するURLに対して。 - 抽出されたデータは、各エントリーにタイトルと関連するリンクが含まれる2階層テーブルの形式で表示される。
ステージ4:データの構造化と保存
データを抽出したら、それを正しく整理することが重要です。そのために、データを PHPテーブルのような構造化フォーマットでエクスポートする。 JSON どこ シーエスブイ.
request('GET', $url);
// 構造化されたテーブルでタイトルとURLを抽出する
$data = [];
$crawler->filter('article h2 a')->each(function ($node) use (&$data) { // タイトルとURLを構造化されたテーブルに抽出する。
$data[] = [ タイトル' => トリム($node)
title' => trim($node->text()), // タイトルを抽出する。
url' => $node->attr('href'), // href属性(URL)を抽出する。
];
});
// 抽出したデータを表示する
print_r($data);
?>
データが整理されたら、以下のフォーマットでエクスポートできます。 JSONこれはAPIやウェブ・アプリケーションで使用するのに便利である:
<?php
// Exporter les données en JSON
file_put_contents('export.json', json_encode($data, JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE));
echo "Les données ont été exportées en JSON dans 'export.json'.";
?>
ファイル エクスポート.json は読みやすいフォーマットで作成され、次のようになる:
[
{
"title": "記事1のタイトル"、
"url": "/article1"
},
{
"title": "記事2のタイトル"、
"url": "/article2".
}
]
データをCSVテーブルとしてエクスポートしたい場合は fputcsv をクリックして、データをCSVファイルに書き出します:
<?php
// Exporter les données en CSV
$fp = fopen('export.csv', 'w');
// Ajouter l'en-tête (titres des colonnes)
fputcsv($fp, ['title', 'url']);
// Ajouter chaque ligne de données
foreach ($data as $row) {
fputcsv($fp, [$row['title'], $row['url']]);
}
// Fermer le fichier
fclose($fp);
echo "Les données ont été exportées en CSV dans 'export.csv'.";
?>
ファイル エクスポート.csv はこのようになる:
タイトル,url
記事タイトル1,/article1
記事タイトル2,/article2
PHPでよくあるWebスクレイピングの問題に対処するには?
ある操作中に PHPでウェブスクレイピングしかし、問題が発生する可能性もある。ここでは、最も一般的な問題に対する解決策を紹介する。
1.エラーの管理
- 接続エラー
時には、リクエストがサーバーに届かないこともあります。次のような状況に遭遇する可能性があります。 「ネットワークがありません」, 「無効なURL」, 「サーバーにアクセスできません」その他この場合 トライ/キャッチ スクリプトが突然停止するのを防ぐため。
ガズルを使った例です:
request('GET', 'https://example.com/api/data');
// リクエストが成功したかどうかをチェックする
if ($response->getStatusCode() === 200) { // リクエストが成功したかどうかをチェックする。
// 成功した場合、レスポンスを処理する
$body = $response->getBody();
echo "Data received : " .$body;
}
} catch (RequestException $e) { // 接続エラーとリクエストエラーを捕捉します。
// 接続エラーとリクエストエラーを捕捉する
if ($e->hasResponse()) { // エラーコードがあれば表示する。
// エラーコードがあれば表示する
echo "リクエストエラー: " .$e->getResponse()->getStatusCode();
} else {
// 接続に失敗した場合 (サーバに到達できないなど)
echo "接続エラー: " .$e->getMessage();
}
}
}
// 関数を呼び出す
make_request_with_guzzle();
?>
- HTTPステータスコード
接続がうまくいっても、サーバーがエラー(404 = ページが見つかりません, 500 = インターネットエラーなど)。ステータスコードは getStatusCode().
request('GET', 'https://example.com/api/data');
// レスポンスのステータスコードをチェックする
$status_code = $response->getStatusCode();
// リクエストが成功したかどうかをチェックする
if ($status_code === 200) { // リクエストが成功したかどうかをチェックする。
// 成功した場合、レスポンスを処理する
$body = $response->getBody();
echo "Response successful with code: " .$status_code ."
";
echo "受信したデータ: " .$body;
} elseif ($status_code === 404) { echo "エラー 404 : ページが見つかりません。
echo "エラー 404 : ページが見つかりません。
";
} elseif ($status_code === 500) {
echo "エラー 500 : 内部サーバーエラー
";
} else {
echo "ステータスコード: " .$status_code ."
";
}
} catch (RequestException $e) { // 接続エラーとリクエストエラーを捕捉する。
// 接続エラーとリクエストエラーを捕捉する
if ($e->hasResponse()) { // HTTPエラーコードがあれば表示する。
// もしあれば、HTTP エラーコードを表示します。
echo "HTTP エラー: " .$e->getResponse()->getStatusCode() ."
";
} else {
// 接続に失敗した場合 (サーバーに到達できないなど)
echo "接続エラー: " .$e->getMessage();
}
}
}
// 関数を呼び出す
make_request_with_guzzle();
?>
- 解析エラー
パーシングとは、スクレイパーによるHTMLの解析です。ページの形式が不正な場合、DomCrawlerやGoutteがクラッシュしたり、何も返さなかったりすることがあります。
この種のエラーに対処するには、コンテンツを抽出しようとする前に、そのコンテンツが存在するかどうかを常に確認する必要があります。条件を使用してください。 (カウント()), フィルター()...) 対象の要素が確実に存在することを確認するためです。その後、その要素を トライ/キャッチ スクリプトがクラッシュしないようにする。
request('GET', 'https://example.com');
// 抽出を試みる前に、ターゲット要素が存在することを確認する
$elements = $crawler->filter('div.target-element');
if ($elements->count() > 0) { // 要素が存在する。
// 要素が存在する。
$content = $elements->first()->text();
echo "抽出された内容: " .$content;
} else {
// 要素が見つかりません
echo "対象の要素はページ上に見つかりませんでした;
}
} catch (Exception $e) { // 解析エラーをキャッチします。
// パースエラーをキャッチする
echo "ページの解析中にエラーが発生しました: " .$e->getMessage();
}
}
// 関数を呼び出す
scrape_website() 関数を呼び出します;
?>
2.制限を回避する
サイトによっては、スクレイピングをより困難にする保護手段を用いている。
- IPによるブロック Bright Dataプラットフォームのようなプロキシを使用することができます。
- ❗ ジャバスクリプト デフォルトでは、PHP は JavaScriptを実行するそのためには、ヘッドレスブラウザの使用が必要です。
- ❗ ロボット.txt スクラップする前に、このファイルをチェックし、合法的かつ責任ある行動をとることが重要である。
よくある質問
ウェブスクレイピングは合法か?
📌 その ウェブ・スクレイピングの合法性 は複雑なテーマである。フランスでも他の国と同様、すべては法的枠組み、収集されたデータ、そしてその使用方法によって決まる。
ウェブスクレイピングとウェブクローリングの違いは?
- the ウェブスクレイピング 特定のサイトから正確なデータを抽出することです。
- the ウェブクローリング とは、インデックスを作成するためにページを閲覧することである。

認証(ログイン)が必要なサイトをスクレイピングするには?
認証が必要なサイトをスクレイピングするには、以下が必要です。 接続をシミュレートする.PHPの場合、最も一般的な解決策は ガズル.
POSTリクエストで識別子を送信し、保護されたページを取得するためにセッションを開いたままにします。
AJAXでロードされたダイナミックなページを持つサイトのスクレイピングをどのように管理していますか?
⚠ 注意点として、PHPはクライアント側のJavaScriptコードを実行できません。
PHPでこの種のページをスクレイピングするには、次のようにします。 使用 ブラウザショットバックグラウンドで実際のブラウザ(ヘッドレスChrome/Chromium)を使ってページを読み込み、JavaScriptを実行するライブラリです。
もうひとつの解決策は PHPとNode.jsベースのツールの統合PuppeteerのようにレンダリングされたHTMLを生成し、PHPからデータを取得します。
動的ページを含むあらゆるタイプのウェブスクレイピングには、次のような特別なツールを使用することもできます。 ヘッドレスブラウザ.
ウェブスクレイピングのためにPHPに代わるものはありますか?
はい、いくつかの言語が人気です:
- パイソン BeautifulSoupやScrapyのような強力なライブラリがある。
- Node.js これは、PuppeteerやCheerioのようなライブラリを使って、動的なウェブサイトをスクレイピングするのに非常に効果的である。

倫理的かつ責任ある方法で「スクレイパー」をプログラムする方法とは?
倫理的にスクレイピングを行うには、:
- ✔ robots.txtファイルをチェックする をクリックしてルールを確認する。
- ✔ リクエストの頻度を制限する サイトサーバーに過負荷をかけないように。
- ✔ 条件を尊重する サイトの利用について。
- ✔ 個人情報を収集しない 無許可で。
まとめ ウェブスクレイピング は強力な練習法だが、理路整然と責任を持って使わなければならない。
👉そして、あなたは、次のようなものを作ったことがありますか? PHPスクレイパー または他の言語?あなたの経験をコメント欄で共有してください。





