ホームページ  >  記事  >  バックエンド開発  >  PHP と Selenium を使用して独自の Web クローラー システムをすばやく構築する方法

PHP と Selenium を使用して独自の Web クローラー システムをすばやく構築する方法

王林
王林オリジナル
2023-06-15 22:54:091723ブラウズ

近年、インターネットの普及に伴い、Web クローラーは情報収集の主要な手段の 1 つになりつつありますが、従来のクローラー技術は不安定であり、保守が困難でした。静的ページ上で操作します。 PHP と Selenium を組み合わせると動的クローラの効果が得られ、高い安定性と包括的なデータ収集という利点があり、クローラ開発で広く使用されています。この記事では、PHP と Selenium を使用して独自の Web クローラー システムを迅速に構築する方法を紹介します。

1. Selenium と ChromeDriver のインストール

Selenium は、Web アプリケーションの自動テストを実行できる自動テスト ツールです. ブラウザとオペレーティング システムを強制挿入せずに個別に処理します. コードはページ レンダリングを実装します。 ChromeDriver は Chrome ブラウザを呼び出す Selenium のドライバーで、これにより Selenium が Chrome を直接操作して動的ページをクロールできるようになります。

まず、Chrome ブラウザと PHP 環境をローカルにインストールする必要があります。次に、対応するバージョンの Selenium と ChromeDriver をインストールする必要があります。コマンド ラインに次のコードを入力してインストールします:

composer require facebook/webdriver

次に、ChromeDriver バイナリ ファイルを配置します (ローカル Chrome に従って、対応するバージョンの ChromeDrive をダウンロードします)

$webdriver = FacebookWebDriverRemoteRemoteWebDriver::create(
    'http://localhost:9515', FacebookWebDriverChromeChromeOptions::class
);

2. Selenium と ChromeDriver のカプセル化クラスを構築します。

Selenium カプセル化クラスは、主に Selenium と ChromeDriver を維持するために使用されます。繰り返しの作成と破棄を避けるための ChromeDriver コードは次のとおりです :

class Selenium
{
    private static $driver;
    private static $selenium;

    public static function getInstance()
    {
        if (null === self::$selenium) {
            $options = new ChromeOptions();
            $options->addArguments(['--no-sandbox','--disable-extensions','--headless','--disable-gpu']);
            self::$driver = RemoteWebDriver::create(
                'http://localhost:9515',
                DesiredCapabilities::chrome()->setCapability(
                    ChromeOptions::CAPABILITY,
                    $options
                )
            );
            self::$selenium = new self();
        }

        return self::$selenium;
    }

    public function __destruct()
    {
        self::$driver->quit();
        self::$selenium = null;
    }

    public function getDriver()
    {
        return self::$driver;
    }
}

パラメータの ChromeOptions は主に GUI (グラフィカル インターフェイス) なしで安定した動作を行うためのものであり、--no-sandbox パラメータはそのためのものであることに注意してください。 Linux システムでの実行時のエラーを防止します。

3. Web ページのソース コード解析クラスを作成する

クローラー システムの中核は、非静的ページを解析することです。ここでは、ソース コード解析クラスを作成し、正規表現を使用する必要があります。または XPath 式を使用してターゲット ノードを見つけて取得します。

class PageParser
{
    private $pageSource;

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

    public function parse(string $expression, $list = false)
    {
        if ($list) {
            return $this->parseList($expression);
        }
        return $this->parseSingle($expression);
    }

    private function parseList(string $expression)
    {
        $domXpath = new DOMXPath(@DOMDocument::loadHTML($this->pageSource));
        $items = $domXpath->query($expression);
        $result = [];
        foreach ($items as $item) {
            array_push($result,trim($item->nodeValue));
        }
        return $result;
    }

    private function parseSingle(string $expression)
    {
        $domXpath = new DOMXPath(@DOMDocument::loadHTML($this->pageSource));
        $item = $domXpath->query($expression)->item(0);
        if ($item) {
            return trim($item->nodeValue);
        }
        return '';
    }
}

ここでは、DOMXPath クラスと DOMDocument クラスは主にページ内の HTML ノードを解析するために使用され、parseList メソッドと parseSingle メソッドはそれぞれ複数および 1 つのターゲット ノードのコンテンツを検索して取得するために使用されます。

4. クローラー クラスの作成

最後に、特にページ コンテンツをクロールするクローラー クラスを構築する必要があります。コードは次のとおりです:

class Spider
{
    private $selenium;
    private $url;

    public function __construct($url)
    {
        $this->selenium = Selenium::getInstance();
        $this->url = $url;
        $this->selenium->getDriver()->get($url);
        sleep(1);
    }

    public function __destruct()
    {
        $this->selenium->getDriver()->close();
        $this->selenium = null;
    }

    public function getContent($expression, $list = false)
    {
        $pageSource = $this->selenium->getDriver()->getPageSource();
        $parser = new PageParser($pageSource);
        return $parser->parse($expression, $list);
    }
}

の getContent メソッドこのクラスは 2 つのパラメータを受け取ります。1 つはターゲット ノードの XPath 式で、もう 1 つは複数のコンテンツを取得するかどうかです。 getModelContent 関数は URL を要求し、ノードを解析して必要なコンテンツを取得します。関数が完了すると、ブラウザ プロセスが閉じられます。

5. 使用例

最後に、実際の例を使用して、このクローラ クラスの使用方法を説明します。複数の a タグを持つ Web ページから a タグ内の href 属性とテキスト情報をクロールする必要があるとします。これは、次のコードで実現できます。

$spider = new Spider('https://www.example.com');
$aTags = $spider->getContent('//a', true);
foreach ($aTags as $a) {
    $href = $a->getAttribute('href');
    $text = $a->nodeValue;
    echo "$href -> $text
";
}

上記のコードでは、最初に Spider クラスを使用してページのソース コードを取得し、次に XPath 式を通じて複数の a タグのノード情報を取得し、最後にそれぞれのタグを取得します。 getAttribute メソッドと nodeValue メソッドによるノード情報、href 属性と a タグのテキスト。

6. 概要

要約すると、この記事では、PHP と Selenium を使用して Web クローラー システムを構築する方法を紹介し、実際の例を使用してページ内のノード情報を取得する方法を説明します。クローラーは安定性があり、高精度で包括的なデータ収集という利点があり、一定の応用価値があります。しかし同時に、データをクロールする際には、合法性と倫理に注意を払い、関連する法律や規制を遵守する必要があることに注意する必要があります。

以上がPHP と Selenium を使用して独自の Web クローラー システムをすばやく構築する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。