インターネットの発展に伴い、クローラーはデータを取得する主要な手段の 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 サイトの他の関連記事を参照してください。