ウェブスクレイピングにLaravelを使うには?

反応する:

コメント

と Laravel, ウェブサイトをスクレイピングするには、次の3つの手順でできます:次のようなパッケージをインストールして Symfony DomCrawler 経由 Composer, 注文を作成する Artisan, 、そして要素を指定する HTML セレクタ付き CSS.

このウェブスクレイピングガイドでは、具体的な手順を、 PHPコード すぐに使える。.

ウェブスクレイピングプロジェクト向けのLaravelとPHPの連携
LaravelはPHPを基盤としており、明確な構造と、ウェブスクレイピングを簡素化するツールを提供しています。©Christina(Alucare.fr)

Laravelでスクレイピングするための前提条件

Laravel は PHPフレームワーク 最新のWebアプリケーション向けに設計されています。その充実したエコシステムにより、クリーンでメンテナンスしやすいスクレイピングプロジェクトを構築するための理想的な基盤となります。.

始める前に、適切な環境が整っていることを確認してください:

  • Composer, 、パッケージをインストールするための依存関係管理ツール。.
  • の最新版 PHP お使いのLaravelのバージョンに対応しています。.
  • Laravel 以下の方法を通じてインストール composer create-project laravel/laravel my-scraper.

スキルに関しては、始めるには基本的な知識さえあれば十分です:

  • の基礎知識を身につける PHP およびアプリケーションの構造 Laravel (制御装置、道路、建築 MVC).
  • 理解する HTML そしてその CSSセレクタ ページ内の要素を正確に指定するために。.
  • 使い方を身につける Composer コマンドラインからプロジェクトにパッケージを追加するには。.

クロール自体については、以下の通りです。 スクレイピングツール 最も役立つもの:

  • Symfony DomCrawler + HttpClient : 現在、定番の組み合わせです。この組み合わせでは、ページをダウンロードし、メソッドを使ってHTMLを閲覧します。 filter() から DomCrawler. クライアントを初期化するには、次のようにします。 HttpClient::create() 希望するオプションを指定して。.
  • HTTP Client の Laravel : に基づく Guzzle, 彼は次のようにして単純なコンテンツを取得します Http::get() また、への呼び出しを適切に処理し、 API.
  • Puppeteer / Headless クローム : インターフェースのないブラウザ。JavaScriptや アヤックス. Puppeteer これはNode.jsのツールであるため、以下から操作します Laravel パッケージ経由で spatie/browsershot.

Laravelで最初のスクレーパーを作成するためのチュートリアル

以下の手順に従って、 機能的なスクレイパー と Laravel. スクレイピング用のパッケージをインストールし、コマンドを生成します Artisan, 、その後、CSSのセレクタを使ってデータを絞り込みます。.

ステップ1:インストールと設定

新しいプロジェクトを作成する Laravel と Composer, 、そしてコンポーネントを追加する Symfony スクレイピングに必要なもの:

# 1) 新しいLaravelプロジェクトを作成する
composer create-project laravel/laravel scraper-demo
cd scraper-demo

# 2) スクレイピング用コンポーネントを追加する
composer require symfony/browser-kit symfony/http-client symfony/dom-crawler symfony/css-selector

よく出くわすだろう Goutte どこ weidner/goutte 以前のチュートリアルで。これらのパッケージは公式にサポート終了となっており、 weidner/goutte は、最新バージョンの Laravel (11およびそれ以降)。.

彼らの直接の後任は HttpBrowser の Symfony, 、そしてコードはほぼ同じままです。.

ステップ2:Artisanの注文を作成する

以下のコードを使用して、スクレイピングロジックを含むリクエストを生成します。 php artisan :

php artisan make:command ScrapeData

ファイルはここで作成される: app/コンソール/コマンド/ScrapeData.php. まさにこの クラス HTTPリクエストの作成とデータの抽出を行うことになります。このクラス ScrapeData 広がる コマンド, 、およびその方法 public function handle() スクレイピングのロジックがすべて含まれています。.

ステップ3:スクレイパーコードを書く

生成されたコマンドでは、3つの重要な要素を組み合わせることになります:

  • あ HTTPリクエスト ページのHTMLコンテンツを取得するために。.
  • の CSSセレクタ ~に移行した DomCrawler データを絞り込むには filter().
  • あ ループ で項目をブラウズし、結果を表示します。

以下は、をスクレイピングするための完全なコード例です。 記事の見出し あるブログから:

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Symfony\Component\BrowserKit\HttpBrowser;
use Symfony\Component\HttpClient\HttpClient;
use Symfony\Component\DomCrawler\Crawler;

class ScrapeData extends Command
{
    protected $signature = 'scrape:data';
    protected $description = 'Scraper simple des titres d\'articles';

    public function handle(): int
    {
        $url = 'https://example.com/blog'; // URL du blog à scraper
        $this->info("Scraping: {$url}");

        // 1) Requête HTTP pour récupérer le HTML
        $browser = new HttpBrowser(HttpClient::create());
        $crawler = $browser->request('GET', $url);

        // 2) Utilisation de sélecteurs CSS avec DomCrawler
        $nodes = $crawler->filter('h2 a');

        // 3) Boucle sur les éléments et affichage
        $nodes->each(function (Crawler $node, $i) {
            $title = $node->text();
            $link  = $node->attr('href');
            $this->line(($i+1) . ". " . $title . " - " . $link);
        });

        return self::SUCCESS;
    }
}

ここだよ、 DomCrawler HTMLの解析作業をすべて行います。このメソッド filter('h2 a') タイトルに含まれる各リンクを取得し、その後 each() 上部をループさせて、 テキスト および属性 href = "/stock/stock_detail.html?. 次に、ターミナルから次のコマンドでスクレイパーを実行してください php artisan scrape:data そうすれば、タイトルが一つずつ表示されていくのがわかるでしょう。.

また、次のコマンドを実行することもできます php artisan serve デプロイする前に、ローカルでアプリケーションをテストするため。.

Laravelによるウェブスクレイピングのベストプラクティス

Laravelで適切にスクレイピングを行うには、いくつかの習慣を変えるだけで状況が一変します。以下に、以下のいずれを扱う場合でも適用すべきベストプラクティスを紹介します。 ウェブスクレイピング用ボット あるいは単発の注文。.

1.タスクとキューイングの管理

スクレイピングには時間がかかる場合があります 1ページあたり数秒. スクレイピングをしなければならないと想像してみてください 1000ページ あるサイトの場合:あなたのアプリは長時間ブロックされ、使用できなくなってしまいます。解決策は一言で言えば、「 求人 そしてその 列 Laravelの。.

  • A 仕事, 、これはバックグラウンドで実行したいタスクです。.
  • あ テール (キュー)とは、これらのジョブを順次実行するために一時的に保管する場所であり、他の処理を妨げることなく処理が行われる仕組みです。.

スクレイピングのロジックをジョブに組み込む方法は以下の通りです:

<?php
// app/Jobs/ScrapePageJob.php

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Symfony\Component\BrowserKit\HttpBrowser;
use Symfony\Component\HttpClient\HttpClient;

class ScrapePageJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected string $url;

    public function __construct(string $url)
    {
        $this->url = $url;
    }

    public function handle(): void
    {
        $client = new HttpBrowser(HttpClient::create());

        $crawler = $client-&gt;request('GET', $this-&gt;url);

        // Exemple simple : extraire tous les <h1>
        $titles = $crawler-&gt;filter('h1')-&gt;each(function ($node) {)
            return $node-&gt;text();
        });

        // 永続化 / ログ / イベント...
        foreach ($titles as $title) { // 永続性/ログ/イベント...
            \Log::info("[スクレイピング] {$this-&gt;url} - H1: {$title}");
        }
    }
}
onQueue('scraping'); // 専用のキューを使用したい場合
 }

 return response()->json(['status' => 'バックグラウンドでスクレイピングが開始されました']);
    }
}

このコントローラーを起動するには、routes/web.php ファイルにルートを定義してください。例えば、次のようにします。 Route::get('/scrape', [ScraperController::class, 'start']). また、以下のコマンドで専用のコントローラーを生成することもできます。 php artisan make:controller ScraperController.
Laravel には、このキューを管理するためのいくつかの仕組みが用意されています。最もよく使われるのは以下の 2 つです:

  • データベース付きファイル : ジョブはSQLテーブルの行として格納され、その後、ワーカーによって1つずつ実行されます。.
  • 「File」と一緒に Redis : ジョブはメモリ内の超高速キューに格納されるため、大量のタスクを処理するのに最適です。.

2.Laravelタスクスケジューラによる自動化

Laravelは タスクプランナー (スケジューラ)を使えば、手間をかけずにスクレイパーを自動化できます。これにより、例えば、一定の間隔でコマンドを実行するようにスケジュール設定することができます。 毎時.

routes/console.php での設定方法は以下の通りです:

hourly();

// 役立つ例:
// Schedule::command('scrape:data')->everyFifteenMinutes();
// Schedule::command('scrape:data')->dailyAt('02:30')->timezone('Indian/Antananarivo');

3.スクレイピング防止を回避する

多くのサイトでは、スクレイパー対策が講じられています。ブロックされないようにするには:

  • User-Agentを変更する : HTTPクライアントのデフォルトのヘッダーの代わりに、実際のブラウザをエミュレートします。.
  • 締め切りの管理 : 休止符を挿入します (sleep, throttle)リクエストの間に、ターゲットサーバーに過負荷をかけないようにする。
  • プロキシの使用 : リクエストを複数のIPアドレスに分散させる。.

4. robots.txt および法的枠組みを遵守する

保護機能を回避するからといって、何でもしていいというわけではない。スクレイピングには一定の規制があり、それを無視すると大きな代償を払うことになる。.

  • robots.txt ファイルに従う : サイトがクロールを許可または禁止しているページを示しています。これは守らなければならない最初のマナーです。.
  • 利用規約を確認する :ウェブサイトは、利用規約を通じてスクレイピングを禁止することができる。.
  • GDPRについて考えてみてください : もしあなたが 個人データ, 、その収集および処理に関しては、EUの規則を遵守しなければなりません。.

Laravelを使ったウェブスクレイピングの代替手段は?

Laravelは、スクレイピングをアプリケーションに組み込む際に依然として便利である PHPアプリケーション 既存のものです。しかし、プロジェクトの内容によっては、他の解決策の方が適している場合もあります。ここでは、2つの主な選択肢とそのメリット・デメリットをご紹介します。.

Pythonを使ったウェブスクレイピング

パイソン は、スクレイピングで最もよく使われている言語です。これは、次のような成熟したライブラリを活用しています。 Scrapy と BeautifulSoup.

  • 利点 : 非常に充実したエコシステム、大規模なクロール機能のネイティブ対応、巨大なコミュニティ。.
  • デメリット : Laravelの世界から抜け出す必要があります。もしあなたのサイトとAPIがすでに PHP.

具体的には、スクレイピングがプロジェクトの中核であり、単なるアプリケーションの一要素ではない場合に、Pythonを選ぶべきだ。.

コードフリー・ツール

スクレイピングができるツールがますます増えている コーディングなし, 、時には……の助けを借りて、’IA. 最も有名なものは ブライトデータ, オクトパース と アピファイ.

  • 利点 : 視覚的な設定、JavaScriptによるページ管理とブロック機能の統合、コードを1行も書く必要がありません。.
  • デメリット : 有料のサブスクリプションサービスだが、Laravelで自作したスクレイパーほど細かい制御はできない。.

コードを記述することなくウェブデータの収集を表示する、Bright Dataのインターフェース。.
コードの管理をせずにスクレイピングを行いたい場合、Bright Dataは依然として有力な選択肢です。©Christina(Alucare.fr)

よくある質問

Laravelでログイン保護されたウェブサイトをスクレイピングするには?

仕組みは簡単です。まず接続をシミュレートし、そのセッションを再利用して保護されたページにアクセスします。具体的には、次の手順を行います:

  1. 接続のシミュレーション フォームにメールアドレスとパスワードを送信するPOSTリクエストを使用して。.
  2. クッキーを保存する セッションを維持し、その後のリクエストでも認証状態が保たれるようにするため。.

とともに HttpBrowser の Symfony, これら2つのステップを非常にスムーズに続けて実行できます。これは、 HttpClient::create(), 、そして各リクエストの間にクッキーを自動的に管理します:

use Symfony\Component\BrowserKit\HttpBrowser;
use Symfony\Component\HttpClient\HttpClient;

$browser = new HttpBrowser(HttpClient::create());

$crawler = $browser->request('GET', 'https://exemple.com/login');
$form = $crawler->selectButton('Se connecter')->form();

$browser->submit($form, [
    'email'    => 'ton@email.com',
    'password' => 'ton_mot_de_passe',
]);

// Les cookies de session sont gardés automatiquement
$page = $browser->request('GET', 'https://exemple.com/compte');
echo $page->filter('h1')->text();

ご注意 HttpBrowser 2つのリクエストの間に、クッキーは自動的に管理される。したがって、手動で保存する必要はない。.

Laravelでウェブスクレイピングを行う場合、ページネーションをどのように管理しますか?

複数のページを続けて閲覧するには、「次のページ」というリンクを見つけ、その CSSセレクタ, 、そしてそれが存在する限りループを続ける。その論理は次の通りだ:

  1. 最初のページを削る そして、必要なデータを抽出する。.
  2. 「次へ」というリンクを検出する« CSSのセレクタを介して。.
  3. 締めくくる 次のページがなくなるまで。.
$url = 'https://exemple.com/blog?page=1';

while ($url) {
    $crawler = $browser->request('GET', $url);

    $crawler->filter('.article-title')->each(function ($node) {
        echo $node->text() . PHP_EOL;
    });

    // Récupère le lien "page suivante" s'il existe
    $next = $crawler->filter('a.next');
    $url  = $next->count() ? $next->attr('href') : null;
}

このループは、セレクタが a.next 何も返さなくなった。.

スクレイピングしたデータを(CSV、Excel、またはJSON形式で)エクスポートするにはどうすればよいですか?

データを取得したら、Laravel を使ってさまざまな形式でエクスポートできます:

  • fputcsv() ファイルを生成するために シーエスブイ ネイティブ。.
  • 書店 Maatwebsite\Excel ファイルを作成するために エクセル.
  • ネイティブ関数 json_encode() エクスポート用 JSON, 、その後APIを通じてデータを公開する場合に便利です。.

スクレイピング中のエラーや例外はどのように処理しますか?

ウェブサイトはエラーを返す場合や、HTMLの構造が変わる場合、あるいは接続が切断される場合があります。堅牢なスクレイパーを作るためには、こうしたケースを想定しておく必要があります:

  1. 各リクエストをカプセル化する での try/catch.
  2. HTTPコードを確認する (404、429、500…) となり、エラーを記録するか、一定時間をおいて再試行する。.
try {
    $crawler = $browser->request('GET', $url);
    $status  = $browser->getResponse()->getStatusCode();

    if ($status !== 200) {
        \Log::warning("Réponse inattendue: $status sur $url");
    }
} catch (\Exception $e) {
    \Log::error('Scraping échoué: ' . $e->getMessage());
}

ウェブスクレイピングは合法か違法か?

The ウェブ・スクレイピングの合法性 対象となるサイトや、データの活用方法によって異なります。以下の3つの点を念頭に置いてください:

  • データベースに関する独自の権利 その 欧州指令96/9/EC データベースの内容を保護します。サイトの一部の重要な部分を抽出することは禁止されている場合があります。.
  • 利用規約 :ライアンエアー対PRアビエーション事件(欧州司法裁判所、2015年)の判決では、データベースが著作権法や sui generis 権のいずれによっても保護されていない場合、ウェブサイトが利用規約においてスクレイピングを禁止できることが確認された。.
  • RGPD : 収集し次第、 個人データ (メールアドレス、氏名、プロフィールなど)については、欧州の規制の対象となります。最大限の注意を払ってください。.

実際には、常にそのファイルを尊重してください robots.txt, 、リクエストの頻度を制限し、法的根拠のない個人データの取り扱いは避けてください。質問や具体的な事例があれば、コメント欄でお知らせください。.

👍あなたの意見
記事は参考になる
記事は客観的である
記事は私の質問に答えている
コンテンツは最新
エラーが見つかりましたか? 場所を教えてください!

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

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


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

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