初心者でもできる!PHPでスクレイピング入門の10ステップ

PHPでのスクレイピングを学ぶ初心者のためのイメージ画像PHP
この記事は約10分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

この記事を読めば、PHPを用いたスクレイピングの基本的な手法を理解し、自分でスクレイピングを行うことができるようになります。

今日からあなたもデータ取得のプロフェッショナル。

スクレイピングの世界へ、一緒に飛び込んでいきましょう。

●PHPとは

PHPは、ウェブサイトの開発に特化したプログラミング言語の一つです。

HTMLと組み合わせて使うことが多く、データベースと連携して動的なウェブページを作成するのに適しています。

●スクレイピングとは

スクレイピングとは、ウェブページから自動的に情報を取得・抽出する技術のことを指します。

例えば、あるウェブサイトの商品価格を日々取得し、価格変動を分析する、といった用途でよく使われます。

スクレイピングは情報収集の手間を著しく省くことができるため、データ分析やマーケティングの分野で非常に重宝されています。

●PHPによるスクレイピングの基本

では、PHPを用いて具体的にどのようにスクレイピングを行うのか、基本的な手法について見ていきましょう。

○必要なツールと環境設定

PHPでスクレイピングを行うためには、まずPHPの実行環境が必要です。

また、スクレイピングにはHTTPリクエストを送信するためのライブラリも必要となります。

PHPでは、「cURL」や「Guzzle」などのライブラリがよく用いられます。

○PHPでのスクレイピングの基本的な流れ

  1. まず、対象となるウェブページのURLにアクセスします。
  2. 次に、取得したHTMLを解析します。
    これには「DOM」(Document Object Model)という技術を用いることが多いです。
  3. 必要な情報を抽出したら、それを保存または活用します。

○サンプルコード1:基本的なスクレイピング

こちらのコードでは、cURLを使ってウェブページからHTMLを取得し、その後DOMを用いてHTMLを解析、そして特定の情報を抽出する、という基本的なスクレイピングの流れを示しています。

<?php
$ch = curl_init(); // cURLセッションの初期化
curl_setopt($ch, CURLOPT_URL, "https://example.com"); // 取得するURLを指定
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 結果を文字列で返すように設定

$html = curl_exec($ch); // URLの情報を取得
curl_close($ch); // cURLセッションの終了

$dom = new DOMDocument;
@$dom->loadHTML($html); // 取得したHTMLをDOMDocumentオブジェクトに読み込む

$xpath = new DOMXPath($dom);
$nodes = $xpath->query('//p'); // すべての<p>要素を取得

foreach ($nodes as $node) { // 取得した要素を表示
    echo $node->nodeValue, PHP_EOL;
}
?>

このコードでは、”https://example.com”というウェブページからHTMLを取得し、そのHTML内のすべての<p>要素を抽出しています。

●PHPでのスクレイピングの応用例

基本的なスクレイピングの方法を理解したところで、より実践的な応用例をいくつか見ていきましょう。

○サンプルコード2:複数ページのスクレイピング

次のコードでは、複数のウェブページから情報を取得する方法を示しています。

具体的には、複数のURLを配列で指定し、それぞれのURLに対してスクレイピングを行うという流れです。

<?php
$urls = ["https://example.com/page1", "https://example.com/page2", "https://example.com/page3"]; // スクレイピング対象のURLを配列で指定

foreach ($urls as $url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url); // 取得するURLを指定
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 結果を文字列で返すように設定

    $html = curl_exec($ch);
    curl_close($ch);

    $dom = new DOMDocument;
    @$dom->loadHTML($html); // 取得したHTMLをDOMDocumentオブジェクトに読み込む

    $xpath = new DOMXPath($dom);
    $nodes = $xpath->query('//p'); // すべての<p>要素を取得

    foreach ($nodes as $node) { // 取得した要素を表示
        echo $node->nodeValue, PHP_EOL;
    }
}
?>

この例では、”https://example.com/page1″, “https://example.com/page2”, “https://example.com/page3″の3つのウェブページから、それぞれのページ内にある全ての<p>要素を取得し、その内容を表示しています。

○サンプルコード3:ログインが必要なサイトのスクレイピング

このコードでは、ログインが必要なウェブサイトから情報を取得する方法を示しています。

具体的には、ユーザー名とパスワードを用いてログインし、その後に特定のページから情報を取得します。

これは、特定のウェブサイトでユーザー認証が必要な場合に役立ちます。

<?php
$login_url = 'https://example.com/login';
$data = array(
    'username' => 'your_username',
    'password' => 'your_password'
);

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $login_url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

curl_exec($ch);

curl_setopt($ch, CURLOPT_URL, 'https://example.com/target_page');
$html = curl_exec($ch);

curl_close($ch);

$dom = new DOMDocument;
@$dom->loadHTML($html);

$xpath = new DOMXPath($dom);
$nodes = $xpath->query('//p');

foreach ($nodes as $node) {
    echo $node->nodeValue, PHP_EOL;
}
?>

このコードでは、「your_username」および「your_password」の部分に自分のユーザー名とパスワードを入力し、「https://example.com/login」にPOSTリクエストを送信してログインします。

その後、「https://example.com/target_page」のページから全ての<p>要素を取得し、その内容を表示します。

●PHPスクレイピングの注意点と対処法

PHPでウェブスクレイピングを行う際には、いくつかの注意点があります。

まず、ウェブサイトの情報を取得することは、そのウェブサイトの所有者の許可なしに行うべきではありません。

特に商用目的でスクレイピングを行う場合は、事前に許可を得ることが重要です。

また、スクレイピングを行う頻度も重要な点です。

連続して多数のリクエストを送ると、サーバーに負荷をかける可能性があります。そのため、一定の間隔をあけてリクエストを送るようにしましょう。

さらに、スクレイピングした結果を公開する際には、個人情報保護法や著作権法を遵守することが求められます。

これらの法律に違反すると、罰則が科せられる可能性があります。

また、スクレイピングを行っていると、ウェブページの構造が変わったり、サイトが閉鎖されたりすることがあります。

このような場合、スクレイピングのコードを適宜更新する必要があります。

●PHPスクレイピングのカスタマイズ方法

PHPでのスクレイピングは、様々な方法でカスタマイズすることが可能です。

例えば、特定の条件を満たす要素だけを取得したい場合や、取得したデータを特定の形式で保存したい場合などに応じて、コードを変更することができます。

○サンプルコード4:特定の要素の取得

このサンプルコードでは、特定の要素を取得する方法を示しています。

この例では、ウェブページから<h2>要素のみを取得し、その内容を表示しています。

<?php
$url = 'https://example.com';
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$html = curl_exec($ch);

curl_close($ch);

$dom = new DOMDocument;
@$dom->loadHTML($html);

$xpath = new DOMXPath($dom);
$nodes = $xpath->query('//h2');

foreach ($nodes as $node) {
    echo $node->nodeValue, PHP_EOL;
}
?>

このコードでは、最初に指定したURLのウェブページからHTMLを取得します。

その後、DOMXPathを使用して<h2>要素を取得し、その内容を表示します。

○サンプルコード5:取得データの保存と活用

次のサンプルコードは、スクレイピングで取得したデータを保存し、そのデータを活用する方法を示しています。

この例では、取得したデータをCSVファイルに保存し、そのCSVファイルを読み込んで表示しています。

<?php
$url = 'https://example.com';
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$html = curl_exec($ch);

curl_close($ch);

$dom = new DOMDocument;
@$dom->loadHTML($html);

$xpath = new DOMXPath($dom);
$nodes = $xpath->query('//h2');

$data = [];
foreach ($nodes as $node) {
    $data[] = [$node->nodeValue];
}

$fp = fopen('data.csv', 'w');
foreach ($data as $row) {
    fputcsv($fp, $row);
}
fclose($fp);

if (($handle = fopen("data.csv", "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        var_dump($data);
    }
    fclose($handle);
}
?>

このコードでは、最初に指定したURLのウェブページからHTMLを取得し、その中から<h2>要素を取得します。

取得した<h2>要素のテキストは配列に保存され、その配列はCSVファイルに書き出されます。

その後、作成したCSVファイルを開き、その内容を表示します。

まとめ

PHPでウェブスクレイピングを行う方法について解説しました。

基本的なスクレイピングから、複数ページのスクレイピング、ログインが必要なサイトのスクレイピング、特定の要素の取得、取得データの保存と活用まで、幅広いテーマについて触れました。

しかし、スクレイピングはその使用方法によっては法的な問題を引き起こす可能性もあるため、常に適切な方法で使用することが重要です。

また、PHPでスクレイピングを行う際は、サイトの構造変更などに対応できるよう、コードのメンテナンスも忘れずに行いましょう。