ホームページ > バックエンド開発 > PHPチュートリアル > DOM 操作を使用して、複数のリンクを持つ Web ページからデータを抽出する堅牢な PHP クローラーを構築するにはどうすればよいですか?

DOM 操作を使用して、複数のリンクを持つ Web ページからデータを抽出する堅牢な PHP クローラーを構築するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-11-08 07:11:01
オリジナル
994 人が閲覧しました

How can I build a robust PHP crawler using DOM manipulation for extracting data from web pages with multiple links?

PHP によるクロール: 総合ガイド

複数のリンクを含む Web ページからデータを抽出するために、PHP ではさまざまな可能性が提供されています。 1 つのアプローチには正規表現の利用が含まれますが、HTML 解析に正規表現のみに依存しないようにすることが重要です。

DOM ベースのクローラーの実装

Tatu の DOM ベースのクローラーは、信頼できる代替品。改善されたバージョンは次のとおりです。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

function crawl_page($url, $depth = 5)

{

    static $seen = array();

    if (isset($seen[$url]) || $depth === 0) {

        return;

    }

 

    $seen[$url] = true;

 

    $dom = new DOMDocument('1.0');

    @$dom->loadHTMLFile($url);

 

    $anchors = $dom->getElementsByTagName('a');

    foreach ($anchors as $element) {

        $path = $element->getAttribute('href');

        if (0 !== strpos($path, 'http')) {

            $path = '/' . ltrim($path, '/');

            if (extension_loaded('http')) {

                $href = http_build_url($url, array('path' => $path));

            } else {

                $parts = parse_url($url);

                $href = $parts['scheme'] . '://';

                if (isset($parts['user']) && isset($parts['pass'])) {

                    $href .= $parts['user'] . ':' . $parts['pass'] . '@';

                }

                $href .= $parts['host'];

                if (isset($parts['port'])) {

                    $href .= ':' . $parts['port'];

                }

                $href .= dirname($parts['path'], 1).$path;

            }

        }

        crawl_page($href, $depth - 1);

    }

    echo "URL:", $url, PHP_EOL, "CONTENT:", PHP_EOL, $dom->saveHTML(), PHP_EOL, PHP_EOL;

}

ログイン後にコピー

この改善されたバージョンでは、https、ユーザー、パス、ポートなどのさまざまな URL シナリオが考慮されています。

機能強化

George は、URL パスを上書きするのではなく相対 URL を末尾に追加するオリジナル バージョンのバグを指摘しました。その結果、この問題は解決され、相対 URL が期待どおりに動作するようになりました。

出力の保存

クローラーの修正バージョンは出力を STDOUT にエコーするため、次のことが可能になります。

これらの機能強化を組み込むことで、この DOM ベースのクローラーは、PHP の複数のリンクを持つ Web ページからデータを抽出するための堅牢なソリューションを提供します。

以上がDOM 操作を使用して、複数のリンクを持つ Web ページからデータを抽出する堅牢な PHP クローラーを構築するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート