크롤러의 주요 목적은 인터넷에서 공개적으로 사용 가능한 일부 특정 데이터를 수집하는 것입니다. 이 데이터를 사용하여 일부 추세를 분석하고 비교하거나 딥 러닝을 위한 모델을 훈련할 수 있습니다. 이번 호에서는 웹 크롤링에 특별히 사용되는 node.js
패키지인 node-crawler
소개하고 이를 사용하여 웹 페이지의 이미지를 크롤링하고 로컬로 다운로드하는 간단한 크롤러 사례를 완성할 것입니다.
node-crawler
효율성과 편의성을 모두 고려한 경량 node.js
크롤러 도구로, 분산 크롤러 시스템, 하드 코딩 및 http 프런트엔드 에이전트를 지원합니다. 또한, 완전히 nodejs
로 작성되었으며 본질적으로 비차단 비동기 IO를 지원하므로 크롤러의 파이프라인 작동 메커니즘에 큰 편의성을 제공합니다. 동시에 웹 페이지의 특정 부분을 크롤링하는 작업의 킬러 기능이라고 할 수 있는 DOM
의 빠른 선택( jQuery
구문 사용 가능)을 지원합니다. 정규식을 직접 작성할 필요가 없습니다. 이는 크롤러 개발의 효율성을 향상시킵니다.
먼저 새 프로젝트를 생성하고 항목 파일로 index.js를 생성합니다.
그런 다음 크롤러 라이브러리 node-crawler
설치합니다.
#PNPM pnpm 크롤러 추가 #NPM npm i -S 크롤러 #방사 Yarn은 크롤러를 추가한
다음 require
사용하여 이를 도입합니다.
// index.js const Crawler = require("crawler");
// index.js 크롤러 = 새 크롤러({ 시간 초과:10000, jQuery: 사실, }) 함수 getImages(uri) { 크롤러.큐({ 우리, 콜백: (err, res, done) => { 만약 (err) throw err; } }) }
이제부터 html 페이지의 이미지를 가져오는 메소드 작성을 시작하겠습니다. crawler
인스턴스화되면 주로 대기열에 링크와 콜백 메소드를 작성하는 데 사용됩니다. 이 콜백 함수는 각 요청이 처리된 후에 호출됩니다.
또한 여기서는 Crawler
request
라이브러리를 사용하므로 Crawler
구성에 사용할 수 있는 매개변수 목록은 request
라이브러리 매개변수의 상위 집합입니다. 즉, request
라이브러리의 모든 구성이 Crawler
에 적용 가능하다는 점에 유의해야 합니다.
아마도 지금 jQuery
매개변수를 보셨을 것입니다. 짐작하셨겠지만, 이 매개변수는 jQuery
구문을 사용하여 DOM
요소를 캡처할 수 있습니다.
// index.js 데이터 = []로 설정 함수 getImages(uri) { 크롤러.큐({ 우리, 콜백: (err, res, done) => { 만약 (err) throw err; $ = res.$로 두세요; 노력하다 { $imgs = $("img"); Object.keys($imgs).forEach(색인 => { img = $imgs[index]; const { 유형, 이름, 속성 = {} } = img; let src = attribs.src || if (유형 === "태그" && src && !data.includes(src)) { let fileSrc = src.startsWith('http') src : `https:${src}` 파일 이름 = src.split("/")[src.split("/").length-1] downloadFile(fileSrc, fileName) // 사진 다운로드 방법 data.push(src) } }); } 잡기 (e) { console.error(e); 완료() } 완료(); } }) }
요청에서 img
태그를 캡처하기 위해 $
사용했음을 알 수 있습니다. 그런 다음 다음 논리를 사용하여 완성된 이미지에 대한 링크를 처리하고 나중에 저장하고 이름을 지정할 수 있도록 이름을 제거합니다. 여기에도 배열이 정의되어 있으며, 그 목적은 캡처된 이미지 주소를 저장하는 것입니다. 다음 캡처에서 동일한 이미지 주소가 발견되면 다운로드가 반복적으로 처리되지 않습니다.
다음은 Nuggets 홈 페이지 HTML을 캡처하기 위해 $("img")
사용하여 인쇄된 정보입니다.
이미지를 다운로드하기
전에nodejs
패키지( axios
를 설치해야 합니다. 예, 잘 읽으셨습니다. axios
프런트 엔드용으로 제공될 뿐만 아니라 백 엔드에서도 사용할 수 있습니다. 그러나 사진 다운로드는 데이터 스트림으로 처리되어야 하므로 responseType
stream
으로 설정됩니다. 그런 다음 pipe
방법을 사용하여 데이터 흐름 파일을 저장할 수 있습니다.
const { 기본값: axios } = require("axios"); const fs = require('fs'); 비동기 함수 downloadFile(uri, name) { dir = "./imgs"로 설정 if (!fs.existsSync(dir)) { fs.mkdirSync(dir)를 기다립니다 } 파일 경로 = `${dir}/${name}` res = axios({를 기다리십시오. URL: 우리, 응답 유형: '스트림' }) ws = fs.createWriteStream(filePath)을 보자 res.data.pipe(ws) res.data.on("닫기",()=>{ ws.close(); }) }
사진이 많을 수 있으므로 하나의 폴더에 넣으려면 그런 폴더가 있는지 확인해야 합니다. 없으면 하나 만듭니다. 그런 다음 createWriteStream
메소드를 사용하여 얻은 데이터 스트림을 파일 형식으로 폴더에 저장합니다.
그런 다음 시도해 볼 수 있습니다. 예를 들어 Nuggets 홈페이지의 html에서 이미지를 캡처합니다.
// index.js getImages("https://juejin.cn/")를실행하면
정적 HTML의 모든 이미지가 캡처된 것을 확인할 수 있습니다.
노드 index.js
결론
마지막에는 이 코드가 SPA(Single Page Application)에서 작동하지 않을 수도 있음을 알 수 있습니다. 단일 페이지 애플리케이션에는 HTML 파일이 하나만 있고 웹 페이지의 모든 콘텐츠가 동적으로 렌더링되므로 어떤 경우에도 해당 데이터 요청을 직접 처리하여 원하는 정보를 수집할 수 있습니다. .
또 말씀드리고 싶은 점은 많은 친구들이 이미지 다운로드 요청을 처리하기 위해 request.js
사용하고 있다는 점입니다. 물론 이것도 가능하고 심지어 코드의 양도 적다는 점은 이 라이브러리가 이미 사용되었다는 것입니다. 2020년에는 더 이상 사용되지 않습니다. 지속적으로 업데이트되고 유지 관리되는 라이브러리로 변경하는 것이 좋습니다.