PHP の Web クローラー リンク/ページ ロジック
-
21-08-2019 - |
質問
私は PHP でページをキャッシュするだけの基本的なクローラーを作成しています。
使うだけです get_file_contents
Webページのコンテンツを取得し、すべてのリンクを取得する正規表現 <a href="URL">DESCRIPTION</a>
- 返された時点では:
Array {
[url] => URL
[desc] => DESCRIPTION
}
私が抱えている問題は、ページリンクがローカルかどうかを判断する背後のロジックを理解すること、またはページリンクが完全に異なるローカルディレクトリにあるかどうかを判断することです。
組み合わせはいくつでも可能です。つまり href="../folder/folder2/blah/page.html"
または href="google.com"
または href="page.html"
- 可能性は無限大。
これにアプローチする正しいアルゴリズムは何でしょうか?重要なデータを失いたくないのです。
解決
まず、正規表現とHTMLを混在させないでください。使用します:
foreach(DOMDocument::loadHTML($source)->getElementsByTagName('a') as $a)
{
$a->getAttribute('href');
}
あなたのサイトの外に行くかもしれリンクすなわち、プロトコルまたは//
で始まります。
http://example.com
//example.com/
href="google.com"
は、ローカルファイルへのリンクです。
しかし、あなたはサイトの静的なコピーを作成したい場合は、その理由だけでwget
を使わないのでしょうか?
他のヒント
まず、ローカル リンクのプロパティについて考えてみましょう。
これらは次のいずれかになります。
- 相対的 なしで スキーム そしていいえ ホスト, 、 または
- 絶対 「http」または「https」のスキームと ホスト スクリプトが実行されているマシンと一致します
リンクがローカルかどうかを識別するために必要なロジックはこれですべてです。
使用 parse_url URL のさまざまなコンポーネントを分離して、 スキーム そして ホスト.
href で http:// を探す必要があります。それ以外の場合は、./ で始まるか、または「./」の任意の組み合わせで始まるかを判断できます。「/」が見つからない場合は、それがファイルであると考える必要があります。これのスクリプトが欲しいですか?