PHPプログラミング言語によるWebスクレイピング

ガイド, ハウツー, スクレイピング, 12月25日-2024年5分で読める

ウェブスクレイピングは、ウェブから情報を抽出して分析する必要のある開発者やデータアナリストにとって不可欠なツールとなっています。商品価格の追跡、調査のためのデータ収集、カスタマイズされたダッシュボードの構築など、ウェブスクレイピングには無限の可能性があります。

もしあなたがPHP愛好家なら、Goutteはウェブスクレイピングのニーズに応える素晴らしいライブラリだ。 Goutteは軽量でユーザーフレンドリーかつ強力で、Guzzle のHTTP クライアント機能とSymfony の DomCrawlerを組み合わせることで、スムーズで効率的な Web スクレイピングを実現します。

このガイドでは、Goutteを使用したPHPによるWebスクレイピングの基本から、インストール、最初のスクリプト、フォーム処理やページネーションなどの高度なテクニックまでを紹介します。

ウェブスクレイピングにGoutteを選ぶ理由

Goutteは様々な理由で開発者の間で人気を博しており、PHPのスクレイピング・ライブラリとしてよく使われている:

  • シンプルでクリーンなAPI:Goutteは、初心者でも習得しやすい、クリーンで直感的なインターフェイスを提供します。
  • シームレスな統合:HTTPリクエストとHTML解析が統合され、別個のライブラリーが不要になります。
  • 強力な機能: Goutteは、セッション処理、クッキーの管理、プログラムによるフォーム送信などの高度な機能をサポートしています。
  • 初心者に優しく、それでいて堅牢:最も単純なスクレイピング作業から、より複雑なプロジェクトまで、始めるために必要なものがすべて揃っています。

PHPの初心者でもベテランの開発者でも、Goutteはシンプルさとパワーの理想的なバランスを保っている。

グーテの設置

コーディングに飛び込む前に、必要な前提条件が整っていることを確認する:

  • PHPがインストールされていること:開発環境にPHP 7.3以上がインストールされていることを確認してください。PHPはこちらのリンクから直接ダウンロードしてください。
  • Composerがインストールされています:Composerは依存関係を管理し、Goutteをインストールするために必要です。

Goutteをインストールするには、ターミナルで以下のコマンドを実行するだけだ:

コンポーザーはファブポット/グートを必要とする

インストールが完了したら、プロジェクトにComposerのオートローダーが必要なので、ライブラリにアクセスできることを確認する:

require 'vendor/autoload.php'

これでスクレイピングを始める準備ができた!

Goutteで初めてのWebスクレイピング・スクリプト

簡単な例から始めよう。Goutteを使ってウェブページのタイトルをスクレイピングしてみよう。以下は基本的なスクリプトである:

ページタイトルの取得と表示

<?php
require 'vendor/autoload.php';

use Goutte\Client;

// Initialize Goutte Client
$client = new Client();

// Send a GET request to the target URL
$crawler = $client->request('GET', 'https://books.toscrape.com/');

// Extract the title of the page
$title = $crawler->filter('title')->text();
echo "Page Title: $title\n";

// Extract the titles of the first 5 books
echo "First 5 Book Titles:\n";
$crawler->filter('.product_pod h3 a')->slice(0, 5)->each(function ($node) {
    echo "- " . $node->attr('title') . "\n";
});
?>

出力:

ページタイトル: 全商品|刮目すべき本-サンドボックス
最初の5冊:
- 屋根裏の光
- ティッピング・ザ・ベルベット
- スウミッション
- シャープ・オブジェクト
- サピエンス人類史

これほど簡単なことはない!たった数行のコードで タイトルタグを使用する。

ウェブページからのデータ抽出

ウェブページを取得する方法を学んだら、次のステップは、特定のHTML要素からリンクやコンテンツなどの特定のデータを抽出することです。

Extracting All Links (`<a>` Tags)

以下のスクリプトは href = "/stock/stock_detail.html? すべての <a> タグをウェブページに貼り付ける:

<?php
require 'vendor/autoload.php';

use Goutte\Client;

$client = new Client();
$crawler = $client->request('GET', 'https://books.toscrape.com/');

// Extract all <a> tags
$links = $crawler->filter('a')->each(function ($node) {
    return $node->attr('href');
});

// Print all extracted links
foreach ($links as $link) {
    echo $link . "\n";
}

これは、ページ上に存在するすべてのハイパーリンクを返します。

クラスまたはIDによるコンテンツの抽出

Goutteを使えば、HTMLからデータを抽出したり解析したりするのが簡単になる。 クラス または 身分証明書 セレクタを使用します。この例では ウェブサイトをスクラップする本.具体的には、各書籍の情報をスクレイピングする、 プロダクトポッド.ウェブサイトでの表示はこうだ:

以下は、グーテを使った例である:

<?php
require 'vendor/autoload.php';

use Goutte\Client;

$client = new Client();
$crawler = $client->request('GET', 'https://books.toscrape.com/');

// Extract all <a> tags
$links = $crawler->filter('a')->each(function ($node) {
    return $node->attr('href');
});

// Print all extracted links
foreach ($links as $link) {
    echo $link . "\n";
}

// Extract elements with class 'product_pod'
$products = $crawler->filter('.product_pod')->each(function ($node) {
    return $node->text();
});

// Print all extracted product details
foreach ($products as $product) {
    echo $product . "\n";
}

ページ間の移動

では、ページ間を移動したり、ページ送りしたりする方法を探ってみよう。今回使用するサンプル・ページには、次のページへのページ送りを可能にする "Next "ボタンがあります。このボタンを活用して、ページ送りを実装してみましょう。

まず、ボタンの位置をその クラス 属性の値として 次のページ .この要素の中に <a> タグには次のページのURLが含まれています。このURLを抽出することで、新しいリクエストを送信し、シームレスに次のページに移動するために使用することができます。 次のページ ボタンをクリックする。

これを実現するコードはこんな感じだ:

<?php
require 'vendor/autoload.php';

use Goutte\Client;

$client = new Client();
$crawler = $client->request('GET', 'https://books.toscrape.com/');

// Handle pagination using the 'next' button
while ($crawler->filter('li.next a')->count() > 0) {
    $nextLink = $crawler->filter('li.next a')->attr('href');
    $crawler = $client->request('GET', 'https://books.toscrape.com/catalogue/' . $nextLink);
    
    // Extract and print the current page URL
    echo "Currently on: " . $crawler->getUri() . "\n";
}

この方法を使えば、ページ間のナビゲーションを自動化し、データをスクレイピングし続けることができる。

グーテでフォームを扱う

Goutteはフォームを扱うこともできます。この機能を実証するために、下の画像に示すような入力フィールドが1つあるこのウェブサイトを使ってみましょう:

このフォームを送信するコードはこんな感じです:

<?php
require 'vendor/autoload.php';

use Goutte\Client;

$client = new Client();
$crawler = $client->request('GET', 'https://www.scrapethissite.com/pages/forms/');

// Submit the search form with a query
$form = $crawler->selectButton('Search')->form();
$form['q'] = 'Canada';

$crawler = $client->submit($form);

// Extract and print the results
$results = $crawler->filter('.team')->each(function ($node) {
    return $node->text();
});

foreach ($results as $result) {
    echo $result . "\n";
}

このスクリプトは q を持つ。 ウェブスクレイピング と入力して送信する。ここから、先の例と同じように、検索結果ページからコンテンツを抽出することができる。

エラー処理とベストプラクティス

ネットワークエラーの処理

ネットワーク接続の失敗や存在しないURLのような不測の事態に対処するために、常にエラー処理を追加してください。

<?php
require 'vendor/autoload.php';

use Goutte\Client;

$client = new Client();

try {
    $crawler = $client->request('GET', 'https://invalid-url-example.com');
    echo "Page title: " . $crawler->filter('title')->text();
} catch (Exception $e) {
    echo "An error occurred: " . $e->getMessage();
}
}

Robots.txtの尊重

ウェブスクレイピングは、常に倫理的かつ責任を持って行われるべきです。robots.txt`ファイルは、ウェブサイトがウェブクローラーと通信するために使用するシンプルなテキストファイルで、サイトのどの部分にアクセスできるか、またはアクセスできないかを概説しています。スクレイピングを行う前に、`robots.txt`ファイルを確認し、そのサイトのルールに従っているか、その条件を尊重しているかを確認することが重要です。これらのガイドラインを無視すると、法的および倫理的な問題につながる可能性があるため、スクレイピング・プロセスでは常にこのステップを優先してください。

続きを読む robots.txt これ.

レート制限

短時間に多くのリクエストを送信すると、サーバーに負担がかかり、他のユーザーのパフォーマンスが低下する可能性があります。サーバーへの負荷を最小限に抑え、トラフィックを効率的に処理できるようにするため、各リクエストの間に短い遅延を設けるのは良い習慣です。このような手順を踏むことは、サーバーの安定性を維持するのに役立つだけでなく、共有リソースの責任ある思いやりのある利用を示すことにもなります。

sleep(1);// リクエスト間で1秒待つ

よくある落とし穴

  • 最近のウェブサイトの多くは、コンテンツのロードにJavaScriptを使用しているため、従来のスクレイピングツールでは必要なデータをすべて取得できない可能性があります。Puppeteerや Seleniumのようなツールは、ユーザーのインタラクションをシミュレートし、ブラウザと同じようにコンテンツをロードすることができます。
  • エラーを避けるために、スクレイピングする HTTPS エンドポイントが有効な証明書を表示していることを確認してください。無効な証明書や期限切れの証明書は、スクレイパーを失敗させたり、セキュリティ上の懸念を引き起こす可能性があります。スクレイピングの前に必ず証明書のステータスを確認し、これらの問題をシームレスに処理するライブラリの使用を検討してください。

結論

ウェブスクレイピングは、効率的にデータを収集するための強力なツールですが、よくある落とし穴を避け、倫理的な使用を保証するためには、責任を持って思慮深いアプローチが必要です。ウェブサイトの利用規約を尊重し、リクエスト間の適切な遅延を実装し、動的コンテンツを処理できるツールを使用するなどのベストプラクティスを遵守することで、サーバーへの影響を最小限に抑えながら効果的に動作するスクレイパーを作成することができます。さらに、HTTPS証明書を確認し、セキュリティに留意することで、スクレーパーとそれが収集するデータを保護することができます。適切な計画と実行により、ウェブスクレイピングは調査、分析、革新のための貴重なリソースとなる。