>  기사  >  PHP 프레임워크  >  Laravel에서 Puppeteer를 사용하여 비동기적으로 로드된 웹 페이지 콘텐츠 수집

Laravel에서 Puppeteer를 사용하여 비동기적으로 로드된 웹 페이지 콘텐츠 수집

藏色散人
藏色散人앞으로
2019-10-16 14:24:233435검색

Laravel에서 Puppeteer를 사용하여 비동기적으로 로드된 웹 페이지 콘텐츠 수집

웹 콘텐츠를 수집하는 것은 매우 일반적인 요구 사항이며 보다 전통적인 정적 페이지의 경우 컬을 사용하여 처리할 수 있습니다. 그러나 일부 페이지에서 ajax를 통해 로드된 기사의 텍스트 콘텐츠와 같이 페이지에 동적으로 로드된 콘텐츠가 있고 일부 페이지가 로드 후 추가 처리(이미지 주소 교체 등....)를 거치고 원하는 경우 처리된 콘텐츠를 수집합니다. 그렇다면 멋진 컬은 무력합니다.

비슷한 요구 사항을 가진 사람들은 "할아버지, PhantomJS를 사용하세요!"라고 말할 수도 있습니다.

네, 이것이 방법이고 오랫동안 PhantomJS는 그러한 요구를 해결할 수 있는 몇 안 되는 도구 중 하나였습니다.

하지만 오늘 소개하고 싶은 것은 Chrome Headless 기술의 등장과 함께 빠르게 발전한 Puppeteer라는 도구입니다. 그리고 매우 중요한 점은 Puppeteer가 Chrome 공식 팀에서 개발 및 유지관리된다는 점인데, 이는 꽤 안정적이라고 할 수 있습니다!

puppeteer는 js 패키지입니다. Laravel에서 사용하려면 spatie/browsershot이라는 또 다른 아티팩트를 사용해야 합니다.

Install

Install spatie/browsershot

browsershot은 훌륭한 팀인 spatie

$ composer require spatie/browsershot

Install puppeteer

$ npm i puppeteer --save

의 작곡가 패키지입니다. 또한 전 세계적으로 안전한 puppeteer를 사용할 수도 있지만 개인적인 경험으로 볼 때 프로젝트에 설치하는 것이 더 좋습니다. 권장되는 접근 방식은 여러 프로젝트가 동시에 전역적으로 설치된 Puppeteer의 영향을 받지 않기 때문입니다. 또한 프로젝트 설치 시 phpdeployer를 사용하여 업그레이드하는 것이 편리합니다(phpdeploy 업그레이드는 온라인 프로젝트 작업에 영향을 미치지 않습니다). . puppeteer를 업그레이드/설치하는 데 시간이 많이 걸리며 때로는 성공을 보장할 수 없다는 점을 알아야 합니다.

Puppeteer 설치 시 Chromium-Browser는 국가별 특수한 상황으로 인해 다운로드가 불가능할 가능성이 높습니다. 이에 대한 실력을 보여주세요...

를 사용하세요. 오늘 헤드라인의 모바일 버전을 수집하세요. 페이지 기사 내용을 예로 들어보세요.

use Spatie\Browsershot\Browsershot;
public function getBodyHtml()
{
    $newsUrl = 'https://m.toutiao.com/i6546884151050502660/';
    
    $html = Browsershot::url($newsUrl)
        ->windowSize(480, 800)
        ->userAgent('Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Mobile Safari/537.36')
        ->mobile()
        ->touch()
        ->bodyHtml();
    \Log::info($html);
}

실행 후 로그에서 다음 내용을 볼 수 있습니다(스크린샷은 일부일 뿐입니다)

Laravel에서 Puppeteer를 사용하여 비동기적으로 로드된 웹 페이지 콘텐츠 수집

또한 페이지를 이미지나 PDF 파일로 저장할 수도 있습니다.

use Spatie\Browsershot\Browsershot;
public function getBodyHtml()
{
    $newsUrl = 'https://m.toutiao.com/i6546884151050502660/';
    
    Browsershot::url($newsUrl)
        ->windowSize(480, 800)
        ->userAgent('Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Mobile Safari/537.36')
        ->mobile()
        ->touch()
        ->setDelay(1000)
        ->save(public_path('images/toutiao.jpg'));
}

Laravel에서 Puppeteer를 사용하여 비동기적으로 로드된 웹 페이지 콘텐츠 수집

사진 속 박스는 시스템 폰트와 관련된 것입니다. 콘텐츠가 로드된 후 스크린샷을 찍기 위해 코드에서 setDelay() 메서드가 사용됩니다. 이는 간단하고 조잡하며 최상의 솔루션이 아닐 수 있습니다.

가능한 문제

시스템은 Chromium 브라우저를 지원해야 합니다. 물론 현재 대부분의 브라우저는 이를 지원합니다. 그렇지 않으면 PhantomJS를 사용하면 됩니다.

프로젝트에 puppeteer를 설치한 후 호출하면 권한 문제가 발생할 수 있습니다. 이를 위해서는 프로젝트 아래의 /node_modules/puppeteer 디렉터리에 적절한 권한을 부여해야 합니다.

요약

puppeteer는 테스트, 수집 및 기타 시나리오에 사용되며 매우 강력한 도구입니다. 본 글처럼 라라벨(php)에서 작은 페이지 몇 개를 수집하는 라이트 수집 작업에는 충분하지만, 많은 양의 콘텐츠를 빠르게 수집해야 한다면 파이썬이나 그 비슷한 것이 더 좋습니다

위 내용은 Laravel에서 Puppeteer를 사용하여 비동기적으로 로드된 웹 페이지 콘텐츠 수집의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제