PHP Manual

PHPでリンクによるサイト全体のダウンロード

2019-11-06T16:41:30.000Z

Obsah článku

一つのサイトやドメイン内の全ページをダウンロードし、その結果で様々な計測を行ったり、全文検索に利用したりすることが比較的多いからです。

一つの解決策として、既製のツールXenuを使用する方法がありますが、これはWebサーバーにインストールするのが非常に難しく(Windowsプログラムです)、またはWgetはどこでもサポートされておらず、別の不必要な依存関係を生み出します。

後で見るためにページのコピーを取るだけなら、HTTrackというプログラムが非常に便利で、私はこれが一番気に入っています。ただ、パラメータ付きのURLをインデントする場合、場合によっては精度が落ちることがあります。

そこで、高度な設定により、PHPで直接すべてのページを自動的にインデックスすることができるツールを探し始めたのです。やがて、これはオープンソースのプロジェクトとなった。

バラハ・ウェブクローラー

まさにこのようなニーズのために、私は独自のComposerパッケージWebCrawlerを実装しました。これは、それ自体でページのインデックス付け処理をエレガントに処理することができ、新しいケースに出会えば、さらにそれを改良しています。

Composerコマンドでインストールされます。

composer require baraja-core/webcrawler

そして、使い勝手の良さ。インスタンスを生成して crawl() メソッドを呼び出すだけでよい。

$crawler = new \Baraja\WebCrawler\Crawler;
$result = $crawler->crawl('https://example.com');

変数 $result には、完全な結果が CrawledResult エンティティのインスタンスとして格納されます。これは、サイト全体に関する興味深い情報をたくさん含んでいるので、研究することをお勧めします。

クローラー設定

多くの場合、ページのダウンロードを何らかの方法で制限する必要があります。そうしないと、インターネット全体をダウンロードしてしまう可能性があるからです。

これは Config エンティティを用いることで実現される。Config エンティティは設定を配列 (key-value) として渡し、コンストラクタによってクローラに渡す。

例えば、こんな感じです。

$crawler = new \Baraja\WebCrawler\Crawler(
new \Baraja\WebCrawler\Config([
// キー => 値
])
);

設定オプション。

| キー|初期値|設定可能な値|||。
|-------------------------|---------------|-----------------|
| followExternalLinks | false | Bool: 同じドメイン内のみに留まるか?外部リンクもインデックスできるのか?
| sleepBetweenRequests | 1000 | Int: 各ページをダウンロードする間の待ち時間(ミリ秒単位)。
| maxHttpRequests | 1000000 | Int: ダウンロードしたURLの最大数?
| maxCrawlTimeInSeconds | 30 | Int: ダウンロードの最大時間を秒単位で指定します。
| allowedUrls | ['.+'] | String[]: 正規表現として許可されるURLフォーマットの配列。
| forbiddenUrls | ['] | String[]: 禁止されたURLフォーマットの正規表現による配列。

正規表現は、URL全体を文字列として正確にマッチさせる必要があります。

Jan Barášek   Více o autorovi

Autor článku pracuje jako seniorní vývojář a software architekt v Praze. Navrhuje a spravuje velké webové aplikace, které znáte a používáte. Od roku 2009 nabral bohaté zkušenosti, které tímto webem předává dál.

Rád vám pomůžu:

Související články

1.
Status:
All systems normal.
2025