이 패키지는 웹사이트의 링크를 크롤링하기 위한 클래스를 제공합니다. 내부적으로 Guzzle promise는 여러 URL을 동시에 크롤링하는 데 사용됩니다.
크롤러는 JavaScript를 실행할 수 있으므로 JavaScript로 렌더링된 사이트를 크롤링할 수 있습니다. 내부적으로는 Chrome과 Puppeteer가 이 기능을 강화하는 데 사용됩니다.
우리는 동급 최고의 오픈 소스 패키지를 만드는 데 많은 리소스를 투자합니다. 유료 제품 중 하나를 구매하여 우리를 지원할 수 있습니다.
귀하가 사용하고 있는 당사 패키지를 언급하면서 귀하의 고향에서 엽서를 보내주셔서 진심으로 감사드립니다. 연락처 페이지에서 주소를 확인하실 수 있습니다. 우리는 수신된 모든 엽서를 가상 엽서 월에 게시합니다.
이 패키지는 Composer를 통해 설치할 수 있습니다.
작곡가는 spatie/crawler가 필요합니다.
크롤러는 다음과 같이 인스턴스화될 수 있습니다.
SpatieCrawlerCrawler를 사용하십시오. 크롤러::만들기() ->setCrawlObserver(<SpatieCrawlerCrawlObserversCrawlObserver를 확장하는 클래스>) ->크롤링 시작($url);
setCrawlObserver
에 전달된 인수는 SpatieCrawlerCrawlObserversCrawlObserver
추상 클래스를 확장하는 객체여야 합니다.
네임스페이스 SpatieCrawlerCrawlObservers;GuzzleHttpExceptionRequestException 사용;PsrHttpMessageResponseInterface 사용;PsrHttpMessageUriInterface 사용;추상 클래스 CrawlObserver {/* * 크롤러가 URL을 크롤링할 때 호출됩니다. */공용 함수 willCrawl(UriInterface $url, ?string $linkText): void{ }/* * 크롤러가 지정된 URL을 성공적으로 크롤링하면 호출됩니다. */추상 공개 함수 크롤링됨(UriInterface $url,ResponseInterface $response, ?UriInterface $foundOnUrl = null, ?string $linkText, ): void;/* * 크롤러가 지정된 URL을 크롤링하는 데 문제가 있을 때 호출됩니다. */추상 공용 함수 크롤링실패(UriInterface $url,RequestException $requestException, ?UriInterface $foundOnUrl = null, ?string $linkText = null, ): void;/** * 크롤링이 종료되면 호출됩니다. */공용 함수 doneCrawling(): void{ } }
setCrawlObservers
사용하여 여러 관찰자를 설정할 수 있습니다.
크롤러::생성() ->setCrawlObservers([ <SpatieCrawlerCrawlObserversCrawlObserver를 확장하는 클래스>, <SpatieCrawlerCrawlObserversCrawlObserver를 확장하는 클래스>, ... ]) ->크롤링 시작($url);
또는 addCrawlObserver
사용하여 여러 관찰자를 하나씩 설정할 수 있습니다.
크롤러::생성() ->addCrawlObserver(<SpatieCrawlerCrawlObserversCrawlObserver를 확장하는 클래스>) ->addCrawlObserver(<SpatieCrawlerCrawlObserversCrawlObserver를 확장하는 클래스>) ->addCrawlObserver(<SpatieCrawlerCrawlObserversCrawlObserver를 확장하는 클래스>) ->크롤링 시작($url);
기본적으로 크롤러는 JavaScript를 실행하지 않습니다. JavaScript 실행을 활성화하는 방법은 다음과 같습니다.
크롤러::생성() ->JavaScript() 실행 ...
자바스크립트가 실행된 후 본문 html을 가져올 수 있도록 이 패키지는 Browsershot 패키지에 의존합니다. 이 패키지는 내부적으로 Puppeteer를 사용합니다. 다음은 시스템에 설치하는 방법에 대한 몇 가지 지침입니다.
Browsershot은 시스템의 종속 항목이 어디에 설치되어 있는지에 대해 정보를 바탕으로 추측합니다. 기본적으로 Crawler는 새 Browsershot 인스턴스를 인스턴스화합니다. setBrowsershot(Browsershot $browsershot)
메소드를 사용하여 사용자 정의 생성 인스턴스를 설정해야 할 수도 있습니다.
크롤러::만들기() ->setBrowsershot($browsershot) ->JavaScript() 실행 ...
Browsershot에 필요한 시스템 종속성이 없더라도 크롤러는 계속 작동합니다. 이러한 시스템 종속성은 executeJavaScript()
호출하는 경우에만 필요합니다.
setCrawlProfile
-함수를 사용하여 크롤러가 특정 URL을 방문하지 않도록 지시할 수 있습니다. 해당 함수에는 SpatieCrawlerCrawlProfilesCrawlProfile
확장하는 객체가 필요합니다.
/* * 주어진 URL을 크롤링해야 하는지 결정합니다. */공용 함수 shouldCrawl(UriInterface $url): bool;
이 패키지에는 기본적으로 세 가지 CrawlProfiles
함께 제공됩니다.
CrawlAllUrls
: 이 프로필은 외부 사이트에 대한 URL을 포함하여 모든 페이지의 모든 URL을 크롤링합니다.
CrawlInternalUrls
: 이 프로필은 호스트 페이지의 내부 URL만 크롤링합니다.
CrawlSubdomains
: 이 프로필은 호스트 페이지의 내부 URL과 해당 하위 도메인만 크롤링합니다.
사용자 정의 UrlParser
크롤러에 전달하여 페이지에서 링크를 추출하는 방법을 사용자 정의할 수 있습니다.
크롤러::생성() ->setUrlParserClass(<SpatieCrawlerUrlParsersUrlParser를 구현하는 클래스>::class) ...
기본적으로 LinkUrlParser
가 사용됩니다. 이 파서는 a
의 href
속성에서 모든 링크를 추출합니다.
사이트맵에서 모든 링크를 추출하고 크롤링하는 내장 SitemapUrlParser
도 있습니다. 사이트맵 색인 파일을 지원합니다.
크롤러::생성() ->setUrlParserClass(SitemapUrlParser::class) ...
기본적으로 크롤러는 로봇 데이터를 존중합니다. 다음과 같이 이러한 검사를 비활성화할 수 있습니다.
크롤러::생성() ->로봇 무시() ...
로봇 데이터는 robots.txt
파일, 메타 태그 또는 응답 헤더에서 가져올 수 있습니다. 사양에 대한 자세한 내용은 http://www.robotstxt.org/에서 확인할 수 있습니다.
로봇 데이터 구문 분석은 spatie/robots-txt 패키지로 수행됩니다.
기본적으로 크롤러는 rel="nofollow" 속성을 포함하는 모든 링크를 거부합니다. 다음과 같이 이러한 검사를 비활성화할 수 있습니다.
크롤러::생성() ->NofollowLinks()를 수락합니다. ...
사용자 정의 사용자 에이전트에 대한 robots.txt 규칙을 준수하기 위해 고유한 사용자 정의 사용자 에이전트를 지정할 수 있습니다.
크롤러::생성() ->setUserAgent('my-agent')
robots.txt의 'my-agent'에 대한 특정 크롤링 규칙 그룹을 추가할 수 있습니다. 이 예에서는 'my-agent'로 식별된 크롤러에 대한 전체 사이트 크롤링을 허용하지 않습니다.
// my-agent에 대한 크롤링을 허용하지 않습니다. 사용자 에이전트: my-agent 허용하지 않음: /
크롤링 속도를 향상시키기 위해 패키지는 기본적으로 10개의 URL을 동시에 크롤링합니다. 해당 숫자를 변경하려면 setConcurrency
메소드를 사용할 수 있습니다.
크롤러::생성() ->setConcurrency(1) // 이제 모든 URL이 하나씩 크롤링됩니다.
기본적으로 크롤러는 찾을 수 있는 모든 페이지를 크롤링할 때까지 계속됩니다. 서버리스 환경과 같이 제한이 있는 환경에서 작업하는 경우 이 동작으로 인해 문제가 발생할 수 있습니다.
크롤링 동작은 다음 두 가지 옵션을 사용하여 제어할 수 있습니다.
총 크롤링 제한 ( setTotalCrawlLimit
): 이 제한은 크롤링할 최대 URL 수를 정의합니다.
현재 크롤링 제한 ( setCurrentCrawlLimit
): 현재 크롤링 중에 처리되는 URL 수를 정의합니다.
이 두 가지 방법의 차이점을 명확히 하기 위해 몇 가지 예를 살펴보겠습니다.
setTotalCrawlLimit
메소드를 사용하면 크롤러 호출 빈도에 관계없이 크롤링할 총 URL 수를 제한할 수 있습니다.
$queue = <대기열 선택/구현>;// 5개의 URL을 크롤링하고 끝납니다.Crawler::create() ->setCrawlQueue($queue) ->setTotalCrawlLimit(5) ->startCrawling($url);// 총 한도에 도달하면 더 이상 크롤링하지 않습니다.Crawler::create() ->setCrawlQueue($queue) ->setTotalCrawlLimit(5) ->크롤링 시작($url);
setCurrentCrawlLimit
는 실행당 크롤링되는 UR 수에 대한 제한을 설정합니다. 이 코드 조각은 크롤링할 페이지의 총 제한 없이 각 실행마다 5페이지를 처리합니다.
$queue = <대기열 선택/구현>;// 5개의 URL을 크롤링하고 끝납니다.Crawler::create() ->setCrawlQueue($queue) ->setCurrentCrawlLimit(5) ->startCrawling($url);// 다음 5개의 URL을 크롤링하고 종료합니다.Crawler::create() ->setCrawlQueue($queue) ->setCurrentCrawlLimit(5) ->크롤링 시작($url);
두 가지 제한을 결합하여 크롤러를 제어할 수 있습니다.
$queue = <대기열 선택/구현>;// 5개의 URL을 크롤링하고 끝납니다.Crawler::create() ->setCrawlQueue($queue) ->setTotalCrawlLimit(10) ->setCurrentCrawlLimit(5) ->startCrawling($url);// 다음 5개의 URL을 크롤링하고 종료합니다.Crawler::create() ->setCrawlQueue($queue) ->setTotalCrawlLimit(10) ->setCurrentCrawlLimit(5) ->startCrawling($url);// 총 한도에 도달하면 더 이상 크롤링하지 않습니다.Crawler::create() ->setCrawlQueue($queue) ->setTotalCrawlLimit(10) ->setCurrentCrawlLimit(5) ->크롤링 시작($url);
setCurrentCrawlLimit
사용하여 장기 실행 크롤링을 중단할 수 있습니다. 다음 예에서는 (간단한) 접근 방식을 보여줍니다. 이는 초기 요청과 크롤링을 계속하는 후속 요청으로 구성됩니다.
다양한 요청에 걸쳐 크롤링을 시작하려면 선택한 대기열 드라이버의 새 대기열을 만들어야 합니다. 대기열 인스턴스를 크롤러에 전달하여 시작합니다. 크롤러는 페이지가 처리되고 새 URL이 발견됨에 따라 대기열을 채우기 시작합니다. 크롤러가 완료된 후 대기열 참조를 직렬화하고 저장합니다(현재 크롤링 제한 사용).
// queue-driver를 사용하여 대기열을 만듭니다.$queue = <대기열의 선택/구현>;// URLsCrawler::create()의 첫 번째 집합을 크롤링합니다. ->setCrawlQueue($queue) ->setCurrentCrawlLimit(10) ->startCrawling($url);// 대기열을 직렬화하고 저장합니다.$serializedQueue = serialize($queue);
다음 요청의 경우 원래 대기열을 직렬화 해제하고 이를 크롤러에 전달해야 합니다.
// 대기열 직렬화 해제$queue = unserialize($serializedQueue);// URLsCrawler::create()의 다음 집합을 크롤링합니다. ->setCrawlQueue($queue) ->setCurrentCrawlLimit(10) ->startCrawling($url);// 대기열을 직렬화하고 저장합니다.$serialized_queue = serialize($queue);
동작은 대기열의 정보를 기반으로 합니다. 동일한 대기열 인스턴스가 전달된 경우에만 동작이 설명된 대로 작동합니다. 완전히 새로운 대기열이 전달되면 동일한 웹사이트라도 이전 크롤링의 제한이 적용되지 않습니다.
자세한 내용은 여기에서 확인할 수 있습니다.
기본적으로 크롤러는 제공된 URL의 모든 페이지를 크롤링할 때까지 계속됩니다. 크롤러의 깊이를 제한하려면 setMaximumDepth
메소드를 사용할 수 있습니다.
크롤러::생성() ->설정최대 깊이(2)
대부분의 HTML 페이지는 매우 작습니다. 그러나 크롤러가 PDF나 MP3와 같은 대용량 파일을 실수로 발견할 수도 있습니다. 이러한 경우 메모리 사용량을 낮게 유지하기 위해 크롤러는 2MB보다 작은 응답만 사용합니다. 응답 스트리밍 시 응답 크기가 2MB보다 커지면 크롤러는 응답 스트리밍을 중지합니다. 빈 응답 본문이 가정됩니다.
최대 응답 크기를 변경할 수 있습니다.
// 최대 3MB를 사용하겠습니다.Crawler::create() ->setMaximumResponseSize(1024 * 1024 * 3)
어떤 경우에는 너무 공격적으로 크롤링하면 속도가 제한될 수 있습니다. 이를 방지하려면 setDelayBetweenRequests()
메서드를 사용하여 모든 요청 사이에 일시 중지를 추가할 수 있습니다. 이 값은 밀리초 단위로 표시됩니다.
크롤러::생성() ->setDelayBetweenRequests(150) // 모든 페이지가 크롤링된 후 크롤러는 150ms 동안 기다립니다.
기본적으로 발견된 모든 페이지는 (최대 setMaximumResponseSize()
크기까지) 다운로드되고 추가 링크에 대해 구문 분석됩니다. 허용되는 유형의 배열로 setParseableMimeTypes()
설정하여 다운로드하고 구문 분석해야 하는 콘텐츠 유형을 제한할 수 있습니다.
크롤러::생성() ->setParseableMimeTypes(['text/html', 'text/plain'])
이렇게 하면 바이너리 파일, 오디오/비디오 등과 같이 링크가 포함될 가능성이 없는 다양한 MIME 유형을 가진 페이지 본문을 다운로드하는 것을 방지할 수 있습니다. 이 기능은 대부분 대역폭을 절약합니다.
사이트를 크롤링할 때 크롤러는 크롤링할 URL을 대기열에 넣습니다. 기본적으로 이 큐는 내장된 ArrayCrawlQueue
사용하여 메모리에 저장됩니다.
사이트가 매우 큰 경우 해당 대기열을 데이터베이스 등 다른 곳에 저장하고 싶을 수도 있습니다. 이러한 경우 자체 크롤링 대기열을 작성할 수 있습니다.
유효한 크롤링 대기열은 SpatieCrawlerCrawlQueuesCrawlQueue
인터페이스를 구현하는 모든 클래스입니다. 크롤러의 setCrawlQueue
메소드를 통해 사용자 정의 크롤링 대기열을 전달할 수 있습니다.
크롤러::생성() ->setCrawlQueue(<SpatieCrawlerCrawlQueuesCrawlQueue 구현>)
여기
배열 크롤링 대기열
RedisCrawlQueue(타사 패키지)
Laravel용 CacheCrawlQueue(타사 패키지)
대기열로서의 Laravel 모델(타사 예제 앱)
기본적으로 크롤러는 기본 URL 구성표가 없으면 http
로 설정합니다. setDefaultScheme
사용하여 이를 변경할 수 있습니다.
크롤러::생성() ->setDefaultScheme('https')
최근 변경된 사항에 대한 자세한 내용은 CHANGELOG를 참조하세요.
자세한 내용은 CONTRIBUTING을 참조하세요.
먼저 Puppeteer 종속성을 설치하지 않으면 테스트가 실패합니다.
npm install puppeteer
테스트를 실행하려면 먼저 별도의 터미널 창에서 포함된 노드 기반 서버를 시작해야 합니다.
CD 테스트/서버 npm 설치 노드 서버.js
서버가 실행되면 테스트를 시작할 수 있습니다.
작곡가 테스트
보안 관련 버그를 발견한 경우 이슈 트래커를 사용하는 대신 [email protected]로 메일을 보내주세요.
이 패키지를 무료로 사용할 수 있지만, 귀하의 프로덕션 환경에 적용된다면 귀하가 사용하고 있는 패키지를 언급하면서 고향에서 엽서를 보내주시면 감사하겠습니다.
주소는 Spatie, Kruikstraat 22, 2018 Antwerp, Belgium입니다.
우리는 받은 모든 엽서를 회사 웹사이트에 게시합니다.
프리크 반 데르 헤르텐
모든 기여자
MIT 라이센스(MIT). 자세한 내용은 라이센스 파일을 참조하십시오.