>  기사  >  백엔드 개발  >  PHP와 Selenium을 사용하여 자신만의 웹 크롤러 시스템을 빠르게 구축하는 방법

PHP와 Selenium을 사용하여 자신만의 웹 크롤러 시스템을 빠르게 구축하는 방법

王林
王林원래의
2023-06-15 22:54:091723검색

최근 인터넷이 대중화되면서 웹 크롤러는 점차 정보 수집의 주요 수단 중 하나가 되었습니다. 그러나 기존의 크롤러 기술은 불안정하고 유지 관리가 어렵습니다. 시중의 순수 웹 크롤러는 정적 환경에서만 작동할 수 있습니다. 페이지를 운영합니다. Selenium과 결합된 PHP는 동적 크롤러의 효과를 얻을 수 있으며 높은 안정성과 포괄적인 데이터 수집이라는 장점을 갖고 있으며 크롤러 개발에 널리 사용됩니다. 이 기사에서는 PHP와 Selenium을 사용하여 자신만의 웹 크롤러 시스템을 빠르게 구축하는 방법을 소개합니다.

1. Selenium 및 ChromeDriver 설치

Selenium은 페이지 렌더링을 위해 코드를 강제로 삽입하지 않고도 웹 애플리케이션의 자동화된 테스트를 수행할 수 있는 자동화된 테스트 도구입니다. 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를 유지하여 반복적인 생성과 소멸을 방지하는 데 사용됩니다. 코드는 다음과 같습니다. :

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. 웹 페이지 소스 코드 구문 분석 클래스 만들기

크롤러 시스템의 핵심은 비정적 페이지를 구문 분석하는 것입니다. 여기서는 소스 코드 구문 분석 클래스를 만들고 정규식 또는 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 메서드는 각각 여러 개의 대상 노드와 하나의 대상 노드의 내용을 찾고 얻는 데 사용됩니다.

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 메소드는 두 개의 매개변수를 받습니다. 하나는 XPath 표현식입니다. 하나는 대상 노드이고 다른 하나는 여러 콘텐츠를 가져올지 여부입니다. getModelContent 함수는 URL을 요청하고 노드를 구문 분석하여 필요한 콘텐츠를 얻습니다. 함수가 완료되면 브라우저 프로세스가 닫힙니다.

5. 사용 예

마지막으로 실제 예를 사용하여 이 크롤러 클래스를 사용하는 방법을 설명합니다. 여러 a 태그가 있는 웹 페이지에서 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 메소드를 통한 태그.

6. 요약

요약하면 이 기사에서는 PHP와 Selenium을 사용하여 웹 크롤러 시스템을 구축하는 방법을 소개하고 실제 예제를 사용하여 페이지에서 노드 정보를 얻는 방법을 설명합니다. 이 크롤러는 안정성이 높다는 장점이 있습니다. 포괄적인 데이터 수집에는 특정 응용 가치가 있습니다. 그러나 동시에 데이터를 크롤링할 때 합법성과 윤리성에 주의를 기울이고 관련 법률 및 규정을 준수해야 한다는 점에 유의해야 합니다.

위 내용은 PHP와 Selenium을 사용하여 자신만의 웹 크롤러 시스템을 빠르게 구축하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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