Web上には、株価、天気予報、商品価格、ニュース記事など、無数の有益な情報が溢れています。
これらの情報を手動でコピー&ペーストして収集するのは、非常に時間がかかり、現実的ではありません。
この課題を解決する技術が「Webスクレイピング」です。
Webスクレイピングとは、プログラムが自動的にWebサイトを巡回し、その中から必要な情報だけを抽出して収集する技術のことです。
PHPを使えば、このスクレイピングを効率的に行うことが可能です。
この記事では、PHPでスクレイピングを始めるための基本的な知識から、便利なライブラリを使った実践的なデータ抽出方法、そして何よりも重要な法律やマナーに関する注意点まで、初心者にもわかりやすく徹底的に解説していきます。
【本記事の信頼性】
- 執筆者は元エンジニア
- 大手プログラミングスクールのWebディレクター兼ライターを経験
- 自らも地元密着型のプログラミングスクールを運営
受講生から評判の良いプログラミングスクール
スクール |
特徴 |
受講料金 |
大手比較サイトで4年連続人気NO.1!受講生からの評判も非常に高く、Web系のエンジニアを目指すならRUNTEQ一択。 | 550,000円(給付金適用あり) | |
月単価80万円以上の現役エンジニア講師による指導!一度入会すればサポートは半永久的。 | 498,000円 | |
格安で質の高いWeb制作スキルを習得したい人におすすめ!業界最安級の料金でありながら、コミュニティやサポートが充実。 | 129,800円~ | |
完全無料でプログラミングが学べる貴重なスクール!最短1ヶ月で卒業可能。ゼロスク運営会社への就職もできる。 | 無料 | |
長期間に渡って学習し、希少人材を目指す人に最適なスクール!受講料は高いものの、高収入を得られる人材を目指せる。 | 96~132万円 |
【最重要】スクレイピングを行う上での注意点とマナー
技術的な解説に入る前に、必ず理解しておかなければならない非常に重要な点があります。
それは、スクレイピングは相手のWebサーバーにアクセスして情報を取得する行為であるため、法律やサイトの利用規約、そして技術的なマナーを遵守する必要があるということです。
無計画なスクレイピングは、相手のサーバーに過剰な負荷をかけて業務を妨害してしまう可能性があり、最悪の場合、法的な問題に発展することもあります。
以下の点を必ず守ってください。
遵守すべきルール | 説明 |
---|---|
サイトの利用規約を確認する | サイトによっては、利用規約でスクレイピングを明示的に禁止している場合があります。必ず事前に確認し、規約に違反しないようにしてください。 |
robots.txt を確認する |
robots.txt は、サイト運営者がクローラー(プログラム)に対して、どのページへのアクセスを許可/禁止するかを示すためのファイルです。通常はhttps://example.com/robots.txt で確認できます。この指示には必ず従いましょう。 |
サーバーに負荷をかけない | プログラムで高速に連続アクセスすると、相手のサーバーに大きな負荷がかかります。リクエストの間にはsleep() 関数などを使って必ず数秒の間隔を空けるように実装してください。 |
取得したデータの著作権を尊重する | スクレイピングで取得したテキストや画像にも著作権は存在します。取得したデータを無断で複製して公開したり、販売したりすることは著作権侵害にあたる可能性があります。個人的な利用の範囲に留めるなど、データの取り扱いには細心の注意を払ってください。 |
これらのルールを守ることが、技術者としての最低限のマナーであり、自分自身を守ることにも繋がります。
PHPでスクレイピングをする際のおすすめライブラリ
PHPでスクレイピングを実装する場合、ゼロからすべてを自作するのは非常に大変です。
幸い、PHPにはスクレイピングを簡単かつ強力にサポートしてくれる便利なライブラリが数多く存在します。
中でも、現代のPHP開発で最も推奨されるライブラリの一つが「Goutte(グート)」です。
Goutteは、Webスクレイピングに必要な機能をまとめた高機能なライブラリです。
内部では、HTTPリクエストを送信する「Guzzle」、HTMLやXMLを解析する「Symfony DomCrawler」、Webサイトを擬似的に操作する「Symfony BrowserKit」といった、実績のある強力なコンポーネントが使われています。
これにより、開発者は複雑な処理を意識することなく、まるでjQueryのように直感的なCSSセレクタを使って、目的のデータを簡単に抽出することが可能になります。
この記事でも、このGoutteを主軸として解説を進めていきます。
【実践】Goutteを使ったスクレイピングの基本ステップ
それでは、実際にGoutteを使ってスクレイピングを行う手順を、ステップ・バイ・ステップで見ていきましょう。
ステップ1:GoutteをComposerでインストールする
まず、プロジェクトでGoutteを使えるようにするために、PHPのパッケージ管理ツールである「Composer」を使ってインストールします。
ターミナル(コマンドプロンプト)で、プロジェクトのディレクトリに移動し、以下のコマンドを実行してください。
composer require fabpot/goutte
このコマンドを実行すると、Goutteライブラリと、Goutteが依存する他のライブラリが自動的にvendor
ディレクトリにインストールされます。
ステップ2:対象ページのHTMLを取得する
ライブラリの準備ができたら、いよいよPHPのコードを書いていきます。
最初のステップは、スクレイピング対象のWebページにアクセスし、そのページのHTMLコンテンツ全体を取得することです。
Goutteでは、Client
クラスのインスタンスを作成し、そのrequest()
メソッドを使うことで、非常に簡単にHTMLを取得できます。
<?php
// Composerのオートローダーを読み込む
require 'vendor/autoload.php';
use Goutte\Client;
// Clientのインスタンスを作成
$client = new Client();
// 取得したいページのURL
$url = 'https://example.com/';
// requestメソッドでページにアクセスし、Crawlerオブジェクトを取得
$crawler = $client->request('GET', $url);
// 取得したページのタイトルを表示してみる
echo $crawler->filter('title')->text();
?>
$client->request()
は、指定したURLにアクセスし、その結果をCrawler
オブジェクトとして返します。
この$crawler
オブジェクトが、HTMLの中から目的のデータを探し出すための、様々な便利機能を持っています。
ステップ3:CSSセレクタで目的のデータを抽出する
HTMLの取得に成功したら、次はその中から自分が欲しい情報が記述されている箇所を特定し、抜き出す作業に入ります。
この「場所を特定する」ために使われるのがCSSセレクタです。
CSSセレクタは、本来CSSでスタイルを適用する要素を指定するための記法ですが、スクレイピングでは「データを抽出したい要素を指定する」ために流用します。
Goutteのfilter()
メソッドにこのCSSセレクタを渡すことで、該当する要素を絞り込むことができます。
h1
…<h1>
タグを指定.news-title
…class="news-title"
が指定された要素を指定#main-contents
…id="main-contents"
が指定された要素を指定
要素を絞り込んだ後、その中身を取得するには、主に以下のメソッドを使います。
text()
: 要素内のテキストコンテンツを取得する。html()
: 要素内のHTMLタグを含めたコンテンツを取得する。attr('属性名')
:href
やsrc
といった、指定した属性の値を取得する。
サンプルコードは以下の通りです。
// <h1 class="page-title">サンプルページ</h1> という要素を想定
$page_title = $crawler->filter('h1.page-title')->text();
echo $page_title; // "サンプルページ" と表示される
// <a href="/about.html">会社概要</a> という要素を想定
$about_link = $crawler->filter('a')->attr('href');
echo $about_link; // "/about.html" と表示される
ステップ4:ループ処理で複数の要素から情報を取得する
ニュースサイトの見出し一覧のように、同じ構造の要素がページ内に複数存在し、それらをすべて取得したい場合は、each()
メソッドを使います。
each()
メソッドは、filter()
で絞り込んだすべての要素に対して、一つずつ同じ処理を繰り返すためのものです。
// <div class="news-item"><h2><a href="...">タイトル</a></h2></div> が複数あるページを想定
$crawler->filter('.news-item')->each(function ($node) {
// 各ニュースアイテムの中から、さらにh2タグのaタグを絞り込む
$title = $node->filter('h2 a')->text();
$link = $node->filter('h2 a')->attr('href');
echo "タイトル: " . $title . "\n";
echo "リンク: " . $link . "\n\n";
});
each()
に渡す無名関数(クロージャ)の引数$node
には、絞り込まれた各要素が一つずつ入ってきます。
その$node
に対してさらにfilter()
などを使うことで、構造化されたデータを効率的に抽出できます。
完成版:Goutteでニュースサイトの見出しを一覧取得する全コード
これまでのステップをすべて組み合わせ、架空のニュースサイトから記事のタイトルとリンクを一覧で取得する、実践的なスクリプトを作成してみましょう。
scrape_news.php
<?php
// Composerのオートローダーを読み込む
require 'vendor/autoload.php';
use Goutte\Client;
// --- スクレイピングの基本設定 ---
$client = new Client();
// 取得対象のURL
$target_url = 'https://news.example.com/'; // 架空のURL
try {
// --- ページの取得 ---
$crawler = $client->request('GET', $target_url);
echo "「${target_url}」からニュース一覧を取得します。\n";
echo "----------------------------------------\n";
// --- データの抽出 ---
// class="article"を持つ要素をすべて取得し、ループ処理
$crawler->filter('.article')->each(function ($node) {
// .article の中から、さらに要素を絞り込む
// タイトルは h2 > a タグの中のテキスト
$title = $node->filter('h2 > a')->text();
// リンクは h2 > a タグの href 属性
$link = $node->filter('h2 > a')->attr('href');
// カテゴリは .category タグの中のテキスト
$category = $node->filter('.category')->text();
// --- 取得したデータの表示 ---
echo "カテゴリ: " . trim($category) . "\n";
echo "タイトル: " . trim($title) . "\n";
echo "リンク: " . $link . "\n";
echo "----------------------------------------\n";
});
} catch (Exception $e) {
// エラーハンドリング
echo "エラーが発生しました: " . $e->getMessage() . "\n";
}
?>
このスクリプトを実行すると、ターミナルに対象サイトのニュース情報が整形されて出力されます。
あとは、この取得したデータをデータベースに保存したり、CSVファイルに出力したりと、目的に応じて自由に加工することが可能です。
その他のスクレイピングライブラリ
Goutteは非常に高機能で便利ですが、よりシンプルなライブラリを好む場合や、特定の要件がある場合には、他の選択肢も存在します。
- PHP Simple HTML DOM Parser:古くから使われている、依存ライブラリのない一枚岩のパーサーです。導入が非常に簡単で、jQueryライクなメソッドで直感的に使えるため、小規模なスクレイピングには手軽で便利です。
- DiDOM:高速なDOMパーサーとして知られています。CSSセレクタだけでなく、XPathもサポートしており、パフォーマンスが求められる場面で強力な選択肢となります。
まとめ
この記事では、PHPを使ってWebスクレイピングを行うための基本的な知識と、モダンなライブラリ「Goutte」を使った実践的な手順を解説しました。
なお、PHPを体系的に学んだり、PHPのスキルを高めたりするためには、プログラミングスクールを利用するのも有効です。
細かな疑問がすぐに解決するだけでなく、現役エンジニアが「質の高いポートフォリオ」を作成するための手助けをしてくれたり、エンジニア就職・転職のコツを教えてくれたりするなど、様々なメリットがありますので、独学に疲れた方は検討してみてはいかがでしょうか。