PHPによるWebスクレイピング完全ガイド

反応する:

コメント

PHP 動的なサイトを作成するためだけのものではありません。また、 オンラインでデータを収集する.

専門ライブラリのおかげで、簡単に スクレーパーをセットする 効果的だ。その方法を見てみよう。

PHPはWebスクレイピングを容易にし、Webサイトから直接データを素早く取得して分析することを可能にする。
PHPはウェブスクレイピングを容易にし、ウェブサイトから直接データを迅速に取得・分析することを可能にします。©Christina pour Alucare.fr

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;
  
  • 🔥 ブライトデータ これは、プロキシを内蔵した大規模データ収集のためのプロフェッショナル向けプラットフォームです。
Bright Data: 最も包括的なウェブスクレイピングツール。
Bright Data:最も包括的なウェブスクレイピングツール。©Christina for Alucare.fr
  • 🔥 スクレイパー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 ウェブクローリング とは、インデックスを作成するためにページを閲覧することである。
ウェブクローリングは、複数のウェブサイトを自動的に探索・発見することであり、ウェブスクレイピングは、特殊なソフトウェアを使用して特定のターゲットから正確なデータを抽出することに重点を置いている。
ウェブクローリングとは、複数のウェブサイトを自動的に探索・発見することであり、一方、ウェブスクレイピングは、専用のソフトウェアを使用して特定のターゲットから特定のデータを抽出することに重点を置いています。©Christina for Alucare.fr

認証(ログイン)が必要なサイトをスクレイピングするには?

認証が必要なサイトをスクレイピングするには、以下が必要です。 接続をシミュレートする.PHPの場合、最も一般的な解決策は ガズル.

POSTリクエストで識別子を送信し、保護されたページを取得するためにセッションを開いたままにします。

AJAXでロードされたダイナミックなページを持つサイトのスクレイピングをどのように管理していますか?

⚠ 注意点として、PHPはクライアント側のJavaScriptコードを実行できません。

PHPでこの種のページをスクレイピングするには、次のようにします。 使用 ブラウザショットバックグラウンドで実際のブラウザ(ヘッドレスChrome/Chromium)を使ってページを読み込み、JavaScriptを実行するライブラリです。

もうひとつの解決策は PHPとNode.jsベースのツールの統合PuppeteerのようにレンダリングされたHTMLを生成し、PHPからデータを取得します。

動的ページを含むあらゆるタイプのウェブスクレイピングには、次のような特別なツールを使用することもできます。 ヘッドレスブラウザ.

ウェブスクレイピングのためにPHPに代わるものはありますか?

はい、いくつかの言語が人気です:

  • パイソン BeautifulSoupやScrapyのような強力なライブラリがある。
  • Node.js これは、PuppeteerやCheerioのようなライブラリを使って、動的なウェブサイトをスクレイピングするのに非常に効果的である。
PythonによるWebスクレイピングは、BeautifulSoupやScrapyなどのライブラリを使用してWebページをブラウズし、目的のデータを自動的に抽出することで機能する。
PythonによるWebスクレイピングは、BeautifulSoupやScrapyなどのライブラリを使用してWebページをブラウズし、目的のデータを自動的に抽出することで動作します。Alucare.frのクリスティーナ

倫理的かつ責任ある方法で「スクレイパー」をプログラムする方法とは?

倫理的にスクレイピングを行うには、:

  1. ✔ robots.txtファイルをチェックする をクリックしてルールを確認する。
  2. リクエストの頻度を制限する サイトサーバーに過負荷をかけないように。
  3. 条件を尊重する サイトの利用について。
  4. 個人情報を収集しない 無許可で。

まとめ ウェブスクレイピング は強力な練習法だが、理路整然と責任を持って使わなければならない。

👉そして、あなたは、次のようなものを作ったことがありますか? PHPスクレイパー または他の言語?あなたの経験をコメント欄で共有してください。

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

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


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

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