인터넷이 발달하면서 크롤러는 데이터를 얻는 주요 수단 중 하나가 되었습니다. 수많은 크롤러 언어 중에서도 PHP와 Selenium의 조합 역시 많은 주목을 받는 솔루션이 되었습니다. 이 기사에서는 PHP와 Selenium을 사용하여 안정적이고 효율적인 웹 크롤러를 구축하는 방법을 소개합니다.
1. Selenium 소개
Selenium은 브라우저 작업을 시뮬레이션하고 다양한 언어 구현(Java, Python, PHP 등)을 제공하는 웹 자동화 테스트 프레임워크입니다. PHP 버전은 php-webdriver라고 합니다. Selenium의 주요 역할은 자동화된 테스트이지만 웹 크롤러에도 사용할 수 있습니다. 기존 크롤러 라이브러리(예: 요청, Scrapy 등)와 비교하여 Selenium은 JavaScript 및 동적 웹 페이지를 더 잘 처리할 수 있으므로 크롤러 효율성과 안정성이 향상됩니다.
2. Selenium 설치
1. Selenium WebDriver를 설치하세요. 먼저 Selenium WebDriver를 설치해야 합니다. http://www.seleniumhq.org/download/ 해당 드라이버를 다운로드하세요. 예를 들어 크롬.
다운로드 후 시스템 경로에 드라이버 파일을 넣어야 합니다.
2. php-webdriver 설치
Composer를 사용하여 php-webdriver를 설치하고 다음 명령을 실행할 수 있습니다:
composer require facebook/webdriver
3. 간단한 예
설치가 완료된 후 php-webdriver를 사용하여 간단한 작업을 수행할 수 있습니다. , 예를 들어 웹 사이트 열기 및 웹 페이지 제목 가져오기:
<?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. 웹 사이트에 로그인
일부 웹 사이트에서는 데이터를 얻으려면 로그인이 필요합니다. 다음은 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;
여러 요소를 가져와야 하는 경우 WebDriverElements 배열을 반환하는 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++; }
IV. 요약
PHP와 Selenium의 조합을 통해 자바스크립트와 동적 웹페이지를 더 잘 처리할 수 있으므로 개선됩니다. 크롤러 효율성 및 안정성. 동시에 Selenium은 로그인, 페이지 넘기기 등의 작업을 쉽게 구현할 수 있는 풍부한 API도 제공합니다. 물론 Selenium에는 높은 리소스 소비와 상대적으로 느린 속도와 같은 특정 단점도 있습니다. 사용할 솔루션은 특정 요구 사항에 따라 선택해야 합니다.
위 내용은 PHP와 Selenium: 안정적이고 효율적인 웹 크롤러 구축을 위한 가이드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!