このパッケージは、Web サイト上のリンクをクロールするためのクラスを提供します。内部では、Guzzle Promise を使用して複数の URL を同時にクロールします。
クローラーは JavaScript を実行できるため、JavaScript でレンダリングされたサイトをクロールできます。内部では、この機能を強化するために Chrome と Puppeteer が使用されています。
私たちはクラス最高のオープンソース パッケージの作成に多くのリソースを投資しています。有料製品のいずれかを購入することで、私たちをサポートできます。
当社のどのパッケージを使用しているかについて、故郷から葉書を送っていただき、誠にありがとうございます。当社の住所は、お問い合わせページに記載されています。受け取ったすべてのポストカードをバーチャル ポストカード ウォールに公開します。
このパッケージは Composer 経由でインストールできます。
作曲家にはスパティ/クローラーが必要です
クローラーは次のようにインスタンス化できます
SpatieCrawlerCrawlerを使用します。 クローラー::create() ->setCrawlObserver(<SpatieCrawlerCrawlObserversCrawlObserverを拡張したクラス>) ->startCrawling($url);
setCrawlObserver
に渡される引数は、 SpatieCrawlerCrawlObserversCrawlObserver
抽象クラスを拡張するオブジェクトである必要があります。
名前空間 SpatieCrawlerCrawlObservers;GuzzleHttpExceptionRequestException を使用する;PsrHttpMessageResponseInterface を使用する;PsrHttpMessageUriInterface を使用する;抽象クラス CrawlObserver {/* * クローラーが URL をクロールするときに呼び出されます。 */public function willCrawl(UriInterface $url, ?string $linkText): void{ }/* * クローラーが指定された URL を正常にクロールしたときに呼び出されます。 */abstract public function crashed(UriInterface $url,ResponseInterface $response, ?UriInterface $foundOnUrl = null、 ?string $linkText, ): void;/* * クローラーが指定された URL をクロールする際に問題が発生した場合に呼び出されます。 */abstract public function crashFailed(UriInterface $url,RequestException $requestException, ?UriInterface $foundOnUrl = null、 ?string $linkText = null、 ): void;/** * クロールが終了すると呼び出されます。 */パブリック関数finishedCrawling(): void{ } }
setCrawlObservers
を使用して複数のオブザーバーを設定できます。
クローラー::create() ->setCrawlObservers([ <SpatieCrawlerCrawlObserversCrawlObserver を拡張したクラス>, <SpatieCrawlerCrawlObserversCrawlObserver を拡張したクラス>, ... ]) ->startCrawling($url);
あるいは、 addCrawlObserver
を使用して複数のオブザーバーを 1 つずつ設定することもできます。
クローラー::create() ->addCrawlObserver(<SpatieCrawlerCrawlObserversCrawlObserver を拡張するクラス>) ->addCrawlObserver(<SpatieCrawlerCrawlObserversCrawlObserverを拡張したクラス>) ->addCrawlObserver(<SpatieCrawlerCrawlObserversCrawlObserverを拡張したクラス>) ->startCrawling($url);
デフォルトでは、クローラーは JavaScript を実行しません。 JavaScript の実行を有効にする方法は次のとおりです。
クローラー::create() ->JavaScript()を実行 ...
JavaScript の実行後に本文の HTML を取得できるようにするために、このパッケージは Browsershot パッケージに依存しています。このパッケージは内部で Puppeteer を使用します。システムにインストールする方法については、次のようなヒントがあります。
Browsershot は、その依存関係がシステム上のどこにインストールされているかについて、経験に基づいた推測を行います。デフォルトでは、Crawler は新しい Browsershot インスタンスをインスタンス化します。 setBrowsershot(Browsershot $browsershot)
メソッドを使用して、カスタム作成インスタンスを設定する必要がある場合があります。
クローラー::create() ->setBrowsershot($browsershot) ->JavaScript()を実行 ...
Browsershot に必要なシステム依存関係がない場合でも、クローラーは引き続き機能することに注意してください。これらのシステム依存関係は、 executeJavaScript()
呼び出す場合にのみ必要です。
setCrawlProfile
関数を使用すると、クローラーに特定の URL にアクセスしないように指示できます。この関数はSpatieCrawlerCrawlProfilesCrawlProfile
を拡張するオブジェクトを想定しています。
/* * 指定された URL をクロールする必要があるかどうかを決定します。 */パブリック関数 shouldCrawl(UriInterface $url): bool;
このパッケージには、すぐに使える 3 つのCrawlProfiles
が付属しています。
CrawlAllUrls
: このプロファイルは、外部サイトへの URL を含む、すべてのページのすべての URL をクロールします。
CrawlInternalUrls
: このプロファイルは、ホストのページ上の内部 URL のみをクロールします。
CrawlSubdomains
: このプロファイルは、ホストのページ上の内部 URL とそのサブドメインのみをクロールします。
カスタムUrlParser
クローラに渡すことで、ページからリンクを抽出する方法をカスタマイズできます。
クローラー::create() ->setUrlParserClass(<SpatieCrawlerUrlParsersUrlParserを実装するクラス>::class) ...
デフォルトでは、 LinkUrlParser
が使用されます。このパーサーは、 a
のhref
属性からすべてのリンクを抽出します。
サイトマップからすべてのリンクを抽出してクロールする組み込みのSitemapUrlParser
もあります。サイトマップ インデックス ファイルはサポートされています。
クローラー::create() ->setUrlParserClass(SitemapUrlParser::class) ...
デフォルトでは、クローラーはロボットのデータを尊重します。次のようにしてこれらのチェックを無効にすることができます。
クローラー::create() ->ignoreRobots() ...
ロボット データは、 robots.txt
ファイル、メタ タグ、または応答ヘッダーのいずれかから取得できます。仕様の詳細については、http://www.robotstxt.org/ を参照してください。
ロボット データの解析は、パッケージ spatie/robots-txt によって行われます。
デフォルトでは、クローラは属性 rel="nofollow" を含むすべてのリンクを拒否します。次のようにしてこれらのチェックを無効にすることができます。
クローラー::create() ->acceptNofollowLinks() ...
カスタム ユーザー エージェントの robots.txt ルールを尊重するために、独自のカスタム ユーザー エージェントを指定できます。
クローラー::create() ->setUserAgent('my-agent')
robots.txt の「my-agent」に特定のクロール ルール グループを追加できます。この例では、「my-agent」で識別されるクローラーのサイト全体のクロールを禁止します。
// my-agent のクロールを禁止します ユーザーエージェント: 私のエージェント 許可しない: /
クロールの速度を向上させるために、パッケージはデフォルトで 10 個の URL を同時にクロールします。この数値を変更したい場合は、 setConcurrency
メソッドを使用できます。
クローラー::create() ->setConcurrency(1) // これで、すべての URL が 1 つずつクロールされます
デフォルトでは、クローラーは、見つかったすべてのページをクロールするまで続行します。サーバーレス環境などの制限のある環境で作業している場合、この動作により問題が発生する可能性があります。
クロール動作は、次の 2 つのオプションで制御できます。
合計クロール制限( setTotalCrawlLimit
): この制限は、クロールする URL の最大数を定義します。
現在のクロール制限( setCurrentCrawlLimit
): 現在のクロール中に処理される URL の数を定義します。
これら 2 つの方法の違いを明確にするために、いくつかの例を見てみましょう。
setTotalCrawlLimit
メソッドを使用すると、クローラーを呼び出す頻度に関係なく、クロールする URL の総数を制限できます。
$queue = <キューの選択/実装>;// 5 つの URL をクロールして終了します。Crawler::create() ->setCrawlQueue($queue) ->setTotalCrawlLimit(5) ->startCrawling($url);// 合計制限に達すると、それ以上クロールしません。Crawler::create() ->setCrawlQueue($queue) ->setTotalCrawlLimit(5) ->startCrawling($url);
setCurrentCrawlLimit
は、実行ごとにクロールされる URL の数に制限を設定します。このコード部分は、クロールするページの合計制限なしに、実行ごとに 5 ページを処理します。
$queue = <キューの選択/実装>;// 5 つの URL をクロールして終了します。Crawler::create() ->setCrawlQueue($queue) ->setCurrentCrawlLimit(5) ->startCrawling($url);// 次の 5 つの URL をクロールして終了します。Crawler::create() ->setCrawlQueue($queue) ->setCurrentCrawlLimit(5) ->startCrawling($url);
両方の制限を組み合わせて、クローラーを制御できます。
$queue = <キューの選択/実装>;// 5 つの URL をクロールして終了します。Crawler::create() ->setCrawlQueue($queue) ->setTotalCrawlLimit(10) ->setCurrentCrawlLimit(5) ->startCrawling($url);// 次の 5 つの URL をクロールして終了します。Crawler::create() ->setCrawlQueue($queue) ->setTotalCrawlLimit(10) ->setCurrentCrawlLimit(5) ->startCrawling($url);// 合計制限に達すると、それ以上クロールしません。Crawler::create() ->setCrawlQueue($queue) ->setTotalCrawlLimit(10) ->setCurrentCrawlLimit(5) ->startCrawling($url);
setCurrentCrawlLimit
使用すると、長時間実行されるクロールを分割できます。次の例は、(簡略化された) アプローチを示しています。これは、最初のリクエストと、クロールを継続する任意の数のフォローアップ リクエストで構成されます。
さまざまなリクエストにわたるクロールを開始するには、選択したキュードライバーの新しいキューを作成する必要があります。まず、キュー インスタンスをクローラーに渡します。ページが処理され、新しい URL が検出されると、クローラーはキューを埋め始めます。クローラーが終了した後、キュー参照をシリアル化して保存します (現在のクロール制限を使用)。
// queue-driver.$queue = <キューの選択/実装> を使用してキューを作成します。// URL の最初のセットをクロールしますCrawler::create() ->setCrawlQueue($queue) ->setCurrentCrawlLimit(10) ->startCrawling($url);// キューをシリアル化して保存します$serializedQueue = Serialize($queue);
次のリクエストの場合は、元のキューをシリアル化解除してクローラーに渡す必要があります。
// シリアル化を解除します queue$queue = unserialize($serializedQueue);// 次の URL セットをクロールしますCrawler::create() ->setCrawlQueue($queue) ->setCurrentCrawlLimit(10) ->startCrawling($url);// キューをシリアル化して保存します$serialized_queue = Serialize($queue);
動作はキュー内の情報に基づいています。同じキュー インスタンスが渡された場合のみ、動作は説明どおりに機能します。まったく新しいキューが渡されると、同じ Web サイトであっても、以前のクロールの制限は適用されません。
詳細な例はここにあります。
デフォルトでは、クローラーは、指定された URL のすべてのページをクロールするまで継続します。クローラーの深さを制限したい場合は、 setMaximumDepth
メソッドを使用できます。
クローラー::create() ->setMinimumDepth(2)
ほとんどの HTML ページは非常に小さいです。ただし、クローラーが PDF や MP3 などの大きなファイルを誤って拾ってしまう可能性があります。このような場合にメモリ使用量を低く抑えるために、クローラーは 2 MB 未満の応答のみを使用します。応答をストリーミングするときに応答が 2 MB を超えると、クローラーは応答のストリーミングを停止します。空の応答本文が想定されます。
最大応答サイズを変更できます。
// 最大 3 MB を使用しましょう。Crawler::create() ->set最大応答サイズ(1024 * 1024 * 3)
場合によっては、クロールが過剰に行われるとレート制限が発生する可能性があります。これを回避するには、 setDelayBetweenRequests()
メソッドを使用して、各リクエストの間に一時停止を追加します。この値はミリ秒単位で表されます。
クローラー::create() ->setDelayBetweenRequests(150) // 各ページがクロールされた後、クローラーは 150 ミリ秒待機します。
デフォルトでは、見つかったすべてのページがダウンロードされ (サイズはsetMaximumResponseSize()
まで)、追加のリンクがないか解析されます。 setParseableMimeTypes()
に許可されたタイプの配列を設定することで、ダウンロードおよび解析するコンテンツ タイプを制限できます。
クローラー::create() ->setParseableMimeTypes(['text/html', 'text/plain'])
これにより、バイナリ ファイル、オーディオ/ビデオなど、リンクが埋め込まれている可能性が低い、さまざまな MIME タイプを持つページの本文がダウンロードされなくなります。この機能は主に帯域幅を節約します。
サイトをクロールするとき、クローラーはクロールする URL をキューに入れます。デフォルトでは、このキューは組み込みのArrayCrawlQueue
使用してメモリに保存されます。
サイトが非常に大きい場合は、そのキューを別の場所 (データベースなど) に保存したい場合があります。このような場合は、独自のクロール キューを作成できます。
有効なクロール キューは、 SpatieCrawlerCrawlQueuesCrawlQueue
インターフェイスを実装する任意のクラスです。クローラーのsetCrawlQueue
メソッドを介してカスタム クロール キューを渡すことができます。
クローラー::create() ->setCrawlQueue(<SpatieCrawlerCrawlQueuesCrawlQueueの実装>)
ここ
配列クロールキュー
RedisCrawlQueue (サードパーティ パッケージ)
Laravel 用 CacheCrawlQueue (サードパーティ パッケージ)
キューとしての Laravel モデル (サードパーティのサンプルアプリ)
デフォルトでは、クローラはベース URL スキームをhttp
に設定します(存在しない場合)。 setDefaultScheme
を使用してこれを変更できます。
クローラー::create() ->setDefaultScheme('https')
最近の変更点の詳細については、CHANGELOG を参照してください。
詳細については、「貢献」を参照してください。
まず、Puppeteer の依存関係をインストールします。そうしないと、テストが失敗します。
npm install puppeteer
テストを実行するには、最初に別のターミナル ウィンドウで、含まれているノード ベースのサーバーを起動する必要があります。
cd テスト/サーバー npmインストール ノードサーバー.js
サーバーが実行されたら、テストを開始できます。
作曲家テスト
セキュリティに関するバグを見つけた場合は、問題トラッカーを使用する代わりに [email protected] にメールを送信してください。
このパッケージを自由に使用できますが、実稼働環境に届いた場合は、どのパッケージを使用しているかを記載した葉書を故郷から送っていただければ幸いです。
私たちの住所は、Spatie, Kruikstraat 22, 2018 Antwerp, Belgiumです。
いただいたはがきはすべて当社ホームページに掲載しております。
フリーク・ファン・デル・ヘルテン
すべての貢献者
MIT ライセンス (MIT)。詳細については、ライセンス ファイルを参照してください。