ホームページ >バックエンド開発 >PHPチュートリアル >PHP と Selenium: 信頼性が高く効率的な Web クローラーを構築するためのガイド

PHP と Selenium: 信頼性が高く効率的な Web クローラーを構築するためのガイド

WBOY
WBOYオリジナル
2023-06-15 22:27:142492ブラウズ

インターネットの発展に伴い、クローラーはデータを取得する主要な手段の 1 つになりました。数あるクローラ言語の中でも、PHPとSeleniumの組み合わせも注目を集めているソリューションです。この記事では、PHP と Selenium を使用して、信頼性が高く効率的な Web クローラーを構築する方法を紹介します。

1. Selenium の概要

Selenium は、ブラウザーの操作をシミュレートでき、複数の言語実装 (Java、Python、PHP など) を提供する Web 自動テスト フレームワークです。 php-webdriver に対して呼び出されます。 Selenium の主な役割は自動テストですが、Web クローラーにも使用できます。従来のクローラー ライブラリ (リクエスト、Scrapy など) と比較して、Selenium は JavaScript と動的 Web ページをより適切に処理できるため、クローラーの効率と安定性が向上します。

2. Selenium のインストール

1. Selenium WebDriver のインストール

まず、Selenium WebDriver をインストールする必要があります。Selenium 公式 Web サイト http://www.seleniumhq.org にアクセスしてください。 /download/ Chrome を例として、対応するドライバーをダウンロードします。

ダウンロード後、ドライバー ファイルをシステム パスに配置する必要があります。

2. php-webdriver のインストール

Composer を使用して php-webdriver をインストールし、次のコマンドを実行できます:

composer require facebook/webdriver

3. 簡単な例

インストールが完了したら、php-webdriver を使用して、Web サイトを開いて Web ページのタイトルを取得するなどの簡単な操作を実行できます:

<?php

require_once('vendor/autoload.php');
use FacebookWebDriverRemoteRemoteWebDriver;

$host = 'http://localhost:9515'; // 默认Chrome浏览器启动地址
$driver = RemoteWebDriver::create($host, DesiredCapabilities::chrome());

$driver->get('http://github.com');
echo "网页标题:" . $driver->getTitle() . PHP_EOL;
$driver->quit();

3. クローラーの実装

1. にログインします。 Web サイト

一部の Web サイトでは、データを取得するためにログインが必要です。例として Github を取り上げます。まず、ブラウザに手動でログインし、セッションを維持する必要があります。次に、クローラのセッションを使用して操作します:

<?php

require_once('vendor/autoload.php');
use FacebookWebDriverRemoteRemoteWebDriver;
use FacebookWebDriverRemoteDesiredCapabilities;

// 替换以下参数为自己的github账户和密码
$username = 'yourusername';
$password = 'yourpassword';

// 启动浏览器并登录
$host = 'http://localhost:9515'; // 默认Chrome浏览器启动地址
$driver = RemoteWebDriver::create($host, DesiredCapabilities::chrome());
$driver->get('http://github.com/login');
$driver->findElement(FacebookWebDriverWebDriverBy::cssSelector('input[name="login"]'))->sendKeys($username);
$driver->findElement(FacebookWebDriverWebDriverBy::cssSelector('input[name="password"]'))->sendKeys($password);
$driver->findElement(FacebookWebDriverWebDriverBy::cssSelector('input[type="submit"]'))->click();

// 检查是否登录成功
$cookies = $driver->manage()->getCookies();
if (count($cookies) == 0) {
    echo "登录失败" . PHP_EOL;
    exit;
}

echo "登录成功" . PHP_EOL;

2. データの取得

ログインして対応するページに入ると、CSS セレクターまたは XPath セレクターを通じて対応する要素を取得できます。たとえば、倉庫内の星の数を取得します:

<?php

// 获取某仓库star数目
$driver->get('https://github.com/twbs/bootstrap');
$starText = $driver->findElement(FacebookWebDriverWebDriverBy::cssSelector('.js-social-count'))->getText();
$starCount = (int)str_replace(',', '', $starText);
echo "star数目:" . $starCount . PHP_EOL;

複数の要素を取得する必要がある場合は、WebDriverElement 配列を返す findElements メソッドを使用できます:

<?php

// 获取某用户的star数目
$driver->get('https://github.com/yourusername?tab=stars');
$stars = $driver->findElements(FacebookWebDriverWebDriverBy::cssSelector('.col-12.d-inline-block>a'));
echo "star数目:" . count($stars) . PHP_EOL;

3。めくり操作

データがページ単位で表示されている場合、ページめくりが必要になる場合があります。まず現在のページ番号を取得し、次のページ ボタンをクリックすることをシミュレートしてページをめくることができます。

<?php

// Github starred仓库分页
$driver->get('https://github.com/yourusername?tab=stars');
$pageNum = 1;
while (true) {
    echo "第{$pageNum}页:" . PHP_EOL;
    $pageStars = $driver->findElements(FacebookWebDriverWebDriverBy::cssSelector('.col-12.d-inline-block>a'));
    foreach ($pageStars as $star) {
        echo $star->getText() . PHP_EOL;
    }
    
    $nextPageBtn = $driver->findElement(FacebookWebDriverWebDriverBy::cssSelector('.pagination>button:last-child'));
    if ($nextPageBtn->getAttribute('disabled') == 'true') {
        break;
    }
    $nextPageBtn->click();
    $pageNum++;
}

4. まとめ

PHP と Selenium、JavaScript と動的 Web の組み合わせを通じてページをより適切に処理できるため、クローラーの効率と安定性が向上します。同時に、Selenium はログインやページめくりなどの操作を簡単に実装できる豊富な API も提供します。もちろん、Selenium にはリソース消費量が多く、速度が比較的遅いなどの欠点もあります。どのソリューションを使用するかは、特定のニーズに基づいて選択する必要があります。

以上がPHP と Selenium: 信頼性が高く効率的な Web クローラーを構築するためのガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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