웹 페이지 정보를 크롤링 할 때 전자 상거래 플랫폼의 제품 리뷰 및 뉴스 웹 사이트에서의 콘텐츠를 스크롤하는 것과 같이 비동기로드 컨텐츠를 직접 얻을 수없는 문제가 종종 발생합니다. 이러한 유형의 컨텐츠는 일반적으로 Ajax 기술을 통해 동적으로로드되므로 전통적인 크롤러가 캡처하기가 어렵습니다.
비동기로드는 웹 페이지가 처음로드 될 때 컨텐츠의 일부만 렌더링되고 나머지는 배경 요청을 통해 비동기 적으로 완료됨을 의미합니다. 이 방법은 웹 페이지 응답 속도와 사용자 경험을 향상 시키지만 데이터 크롤링에 도전을 가져옵니다.
Selenium은 실제 사용자 작동 브라우저를 시뮬레이션하고 JavaScript 코드를 실행하여 완전한 비동기 데이터를로드 할 수있는 자동 테스트 도구입니다. 브라우저가 페이지를 자동으로 스크롤하고로드가 완료 될 때까지 기다려 동적으로 생성 된 컨텐츠를 기어 다닐 수 있습니다.
$ driver = remotewebdriver :: create ($ host, destiredCapabilities :: firefox ()); $ driver-> get ($ url); $ driver-> executescript ( "window.scrollto (0, document.body.scrollheight);"); // 페이지를 스크롤하여 sleep (5); // 완료를 위해 비동기 데이터가로드 될 때까지 기다립니다. $ html = $ driver-> getPagesource ();
과도한 빈번한 스크롤 및로드 작업을 피하기 위해 사용시 성능 소비에주의하십시오.
일부 웹 사이트는 인터페이스를 통해 비동기로로드 된 데이터를 반환하고 JSON 또는 기타 형식의 데이터를 효율적으로 얻기 위해 인터페이스를 직접 요청합니다. 웹 페이지 네트워크 요청을 분석하고 해당 API 인터페이스를 찾으면 페이지 렌더링을 건너 뛰고 필요한 정보를 신속하게 캡처 할 수 있습니다.
$ url = "http://xxxxx.com/api/xxxx"; $ data = file_get_contents ($ url); $ json = json_decode ($ data, true);
인터페이스에 권한 제한이있는 경우 먼저 로그인 또는 기타 확인 프로세스를 완료해야합니다.
Phantomjs는 JavaScript 코드를 실행하고 비동기 콘텐츠를 렌더링하며 전체 HTML을 내보낼 수있는 인터페이스리스 브라우저입니다. PHP 통화 명령 줄 방법과 결합하여 비동기 데이터 크롤링을 실현할 수 있습니다.
$ js = "var page = require ( 'webpage'). create (); page.open ( ' ". $ url."', function (status) { if (status === 'success') { Console.log (page.content); } phantom.exit (); }); "; $ html = exec ( "phantomjs -e '". $ js. "'");
이 방법을 사용하기 전에 Phantomjs를 설치하고 PHP 환경이 EXEC 기능을 지원하는지 확인해야합니다.
비동기로드는 최신 웹 페이지에서 일반적으로 사용되는 기술로 크롤러에 특정 어려움을 가져다줍니다. Selenium을 통해 브라우저 작업을 시뮬레이션하고 비동기 인터페이스를 분석하여 데이터를 직접 가져오고 Phantomjs를 사용하여 웹 페이지 컨텐츠를 렌더링하면이 세 가지 솔루션은 비동기 콘텐츠를 크롤링하는 문제를 효과적으로 해결할 수 있습니다. 개발자는 크롤러 효율과 안정성을 향상시키기 위해 특정 요구에 따라 적절한 방법을 유연하게 선택할 수 있습니다.