>  기사  >  백엔드 개발  >  PHP와 Selenium: 안정적이고 효율적인 웹 크롤러 구축을 위한 가이드

PHP와 Selenium: 안정적이고 효율적인 웹 크롤러 구축을 위한 가이드

WBOY
WBOY원래의
2023-06-15 22:27:142440검색

인터넷이 발달하면서 크롤러는 데이터를 얻는 주요 수단 중 하나가 되었습니다. 수많은 크롤러 언어 중에서도 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.