댓글 검색 목록

[Nodejs] Node.js를 사용한 웹 스크랩 핑 101

페이지 정보

작성자 운영자 작성일 20-12-26 23:23 조회 793 댓글 0

이 게시물에서는 웹 스크래핑을 위해 Nodejs에서 제공하는 모든 도구/라이브러리에 대해 설명합니다. 먼저 쉽고 기본적인 라이브러리로 시작한 다음 고급 도구로 진행합니다. 각 도구의 장단점에 대해 간략하게 설명합니다. 스크래핑 하는 동안 도움이 될 수 있는 모든 도구의 모든 세부 사항을 강조하려고 노력할 것입니다.


https://www.scrapingdog.com/blog/web-scraping-101-with-nodejs


Libraries 


  1. Simplecrawler
  2. Cheerio
  3. Puppeteer
  4. Playwright
  5. HTTP Client — Axios, Unirest & Superagent
  6. Nightmare

데이터 추출 중에 명심해야 할 가장 중요한 사항에 대해 이야기하겠습니다.


Simplecrawler 


Simplecrawler는 웹 사이트 크롤링을 위한 기본적이고 유연하며 강력한 API를 제공하도록 설계되었습니다. 매우 큰 웹 사이트를 보관, 분석 및 검색하기 위해 작성되었으며 수십만 페이지를 스크랩하고 문제 없이 수십 기가 바이트를 디스크에 기록했습니다. 디스크에 고정하고 해동 할 수 있는 유연한 대기열 시스템이 있습니다.


Example 


Simplecrawler를 이해하기 위해 이 웹 사이트를 살펴보겠습니다. Nodejs를 설치했으며 Nodejs 스크립트를 저장할 작업 디렉토리가 있다고 가정합니다. 따라서 먼저 Simplecrawler를 설치합니다.


npm install --save simplecrawler 


내 폴더에 scraper.js 파일을 만들었습니다. 그 파일 안에 쓰기.


var Crawler = require("simplecrawler");
var crawler = new Crawler("https://books.toscrape.com/"); 


크롤링 할 도메인과 먼저 가져올 리소스를 나타내는 URL을 생성자에 제공합니다. 웹 사이트를 스크랩 하기 전에 3 가지를 구성 할 수 있습니다.


a) Request Interval 


crawler.interval = 10000; // Ten seconds 


b) Concurrency of requests


crawler.maxConcurrency = 3; 


c) Number of links to fetch 


crawler.maxDepth = 1; // Only first page is fetched (with linked CSS & images)// Or:crawler.maxDepth = 2; // First page and discovered links from it are fetched


이 라이브러리는 여기에서 찾을 수 있는 더 많은 속성도 제공합니다.


수신하려는 이벤트에 대한 이벤트 리스너도 설정해야 합니다. crawler.fetchcomplete 및 crawler.complete는 시작하기에 좋은 위치입니다.


crawler.on("fetchcomplete", function(queueItem, responseBuffer, response) {  console.log("I just received %s (%d bytes)", queueItem.url,      responseBuffer.length);  console.log("It was a resource of type %s", response.headers['content-type']);});


그런 다음 만족스럽고 갈 준비가 되면 크롤러를 시작하십시오! 더 이상 찾을 수 없을 때까지 다운로드 할 도메인에서 연결된 리소스를 찾는 대기열을 살펴 봅니다.


crawler.start(); 


장점 


  • 헤더 조정 및 robots.txt 준수
  • 많은 사용자 정의 속성을 사용할 수 있습니다.
  • 이벤트 리스너를 사용하여 쉽게 설정할 수 있습니다.

단점 


  • 가장 큰 단점은 Promise를 지원하지 않는다는 것입니다.
  • 오류 처리
  • 무차별 대입 방식으로 인해 잘못된 URL도 가져 오려고 합니다.

Cheerio 


Cheerio는 HTML 및 XML 문서를 구문 분석하는 데 사용되는 라이브러리입니다. 다운로드 한 데이터에 jquery 구문을 사용할 수 있습니다. Cheerio는 jQuery 라이브러리에서 모든 DOM 불일치 및 브라우저 크랙을 제거하여 진정으로 멋진 API를 보여줍니다. 선택기를 사용하여 원하는 데이터를 필터링 할 수 있습니다. Cheerio는 매우 간단하고 일관된 DOM 모델로 작동합니다. 결과적으로 구문 분석, 조작 및 렌더링이 매우 효율적입니다. 예비 엔드 투 엔드 벤치 마크에 따르면 cheerio는 JSDOM보다 약 8 배 더 빠릅니다.


Example 


URL에서 'Books to Scrape'라는 헤더 행을 긁어냅니다.


먼저 cheerio를 설치해야 합니다.


npm install cheerio 


그런 다음 다음 코드를 입력하여 원하는 텍스트를 추출하십시오.


const cheerio = require(‘cheerio’)
const axios = require(‘axios’);
var scraped_data =await axios.get("https://books.toscrape.com/");const $ = cheerio.load(scraped_data.data)
var name = $(".page_inner").first().find("a").text();
console.log(name)
//Books to Scrape


Image for post 


먼저 웹 사이트에 HTTP 요청을 한 다음 데이터를 scraped_data에 저장했습니다. cheerio에 로드 한 다음 클래스 이름을 사용하여 데이터를 가져옵니다.


장점 


  • 데이터 파싱 및 추출이 매우 쉬워집니다.
  • 이미 구성된 방법을 사용할 수 있습니다.
  • API는 빠릅니다.

단점 

  • JavaScript를 구문 분석 할 수 없습니다.

Puppeteer 


Puppeteer는 DevTools 프로토콜을 통해 Chrome 또는 Chromium을 제어하는 ​​고급 API를 제공하는 노드 라이브러리입니다. Puppeteer는 기본적으로 헤드리스로 실행되지만 전체 (헤드리스가 아닌) Chrome 또는 Chromium을 실행하도록 구성 할 수 있습니다. 또한 헤드리스가 아닌 모드에서 실행을 실시간으로 볼 수 있도록 변경할 수도 있습니다. 작업을 실행하기 위해 외부 드라이버에 대한 종속성을 제거합니다. Puppeteer는 크롬을 더 잘 제어합니다.


Example 


웹 사이트를 스크랩하겠습니다. 먼저 꼭두각시 라이브러리를 설치하십시오.


npm i puppeteer --save 


그런 다음 scraper.js 파일에 다음 코드를 작성하십시오.


const browser = await puppeteer.launch({headless: false});
const page = await browser.newPage();
var results = await page.goto('https://books.toscrape.com/');
await page.waitFor(1000);
browser.close();
console.log(results); 


대박! 한 줄씩 분류 해 보겠습니다.


먼저 브라우저를 만들고 헤드리스 모드를 false로 설정합니다. 이를 통해 무슨 일이 일어나고 있는지 정확히 볼 수 있습니다.


const browser = await puppeteer.launch({headless: false}); 


그런 다음 브라우저에 새 페이지를 만듭니다.


const page = await browser.newPage(); 


다음으로 books.toscrape.com URL로 이동합니다.


var results = await page.goto('https://books.toscrape.com/'); 


1000 밀리 초의 지연을 추가했습니다. 일반적으로 필요하지는 않지만 페이지의 모든 항목이로드되도록합니다.


await page.waitFor(1000); 


마지막으로 모든 작업이 완료되면 브라우저를 닫고 결과를 인쇄합니다.


browser.close();
console.log(results); 


설정이 완료되었습니다. 데이터가 준비되었습니다!


장점 


  • Puppeteer를 사용하면 Chrome 성능 분석 도구에서 제공하는 로드 및 렌더링 시간 측정에 액세스 할 수 있습니다.
  • Puppeteer는 테스트를 실행하기 위해 외부 드라이버에 대한 종속성을 제거합니다.


단점 

Image for post 


  • Puppeteer는 Firefox 지원이 완료 될 때까지 현재 Chrome 브라우저로만 제한됩니다.
  • Puppeteer는 현재 도구를 사용하는 소규모 테스트 커뮤니티를 보유하고 있으며 Selenium에 대한 더 많은 테스트 별 지원이 있습니다.

Playwright 


Playwright는 인형과 매우 유사한 단일 API로 Chromium, Firefox, WebKit을 자동화하는 Node.js 라이브러리입니다. Playwright는 항상 친환경적이고 기능이 뛰어나고 안정적이며 빠른 브라우저 간 웹 자동화를 지원하도록 제작되었습니다. 작업 자동화 및 웹 애플리케이션 테스트에서 데이터 마이닝까지.


Example 


극작가의 적용을 보여주기 위해 간단한 스크레이퍼를 만들 것입니다. 이 URL에서 첫 번째 책을 긁어냅니다.


이제 Playwright를 설치하겠습니다.


npm i playwright 


스크레이퍼 만들기 


Playwright로 스크레이퍼를 만드는 것은 이전에 스크래핑 경험이 없더라도 놀랍도록 쉽습니다. JavaScript와 CSS를 이해한다면 케이크 조각이 될 것입니다.


프로젝트 폴더에서 scraper.js라는 파일을 만들고 (또는 다른 이름을 선택) 즐겨 찾는 코드 편집기에서 엽니다. 먼저 간단한 스크립트를 실행하여 Playwright가 올바르게 설치되고 작동하는지 확인합니다.



// Import the playwright library into our scraper.
const playwright = require('playwright');

async function main() {
// Open a Chromium browser. We use headless: false
// to be able to watch what's going on.
const browser = await playwright.chromium.launch({
headless: false
});
// Open a new page / tab in the browser.
const page = await browser.newPage();
// Tell the tab to navigate to the JavaScript topic page.
var results= await page.goto('https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html');
// Pause for 10 seconds, to see what's going on.
await page.waitForTimeout(10000);
// Turn off the browser to clean up after ourselves.
await browser.close();
}

main(); 


Chromium 창이 열리고 도서 페이지가 성공적으로로드되면 축하합니다. Playwright로 웹 브라우저를 로봇 화 한 것입니다!


Image for post 


결과 변수에는 모든 데이터가 있습니다. 이제 cheerio를 사용하여 모든 정보를 얻을 수 있습니다.


Playwright에서는 버튼을 클릭하는 것이 매우 쉽습니다. 찾고 있는 문자열에 text = 접두사를 붙이면 Playwright가 이 문자열을 포함하는 요소를 찾아 클릭합니다. 또한 페이지에 아직 렌더링 되지 않은 경우 요소가 나타날 때까지 기다립니다. 이것은 인형을 조종하는 사람보다 큰 이점입니다. 클릭하면 페이지가 로드 될 때까지 기다린 다음 cheerio를 사용하여 원하는 정보를 얻어야 합니다. 그러나 지금은 그 방향으로 가고 있지 않습니다.


장점 


  • 버튼을 클릭하는 것이 Puppeteer보다 훨씬 쉽습니다.
  • 브라우저 간 지원.
  • 문서는 훌륭합니다

단점 


  • 그들은 실제 렌더링 엔진을 패치 하지 않았습니다.


HTTP Clients 


HTTP 클라이언트를 사용하여 서버에 요청을 보내고 응답을 검색 할 수 있습니다. 스크랩 하려는 웹 페이지 또는 서버에 HTTP 요청을 하는데 사용되는 3 개의 라이브러리에 대해 설명합니다. 


Axios 


브라우저와 node.js 모두에 대한 약속 기반 HTTP 클라이언트입니다. 대상 웹 사이트의 완전한 HTML 코드를 제공합니다. Axios를 사용하여 요청하는 것은 매우 간단하고 간단합니다.


var axios = require(‘axios’);async function main() {

try{
var scraped_data =await axios.get(“https://books.toscrape.com/");
console.log(scraped_data.data);
//<DOCTYPE HTML>......//
}catch(err){
console.log(err)
}
}main();


다음 명령을 통해 Axios를 설치할 수 있습니다.


npm i axios --save 


장점 


  • 요청을 수정하는 인터셉터가 있습니다.
  • 약속을 지원합니다.
  • 오류 처리는 훌륭합니다.

Unirest 


Unirest는 여러 언어로 제공되는 경량 HTTP 라이브러리 모음으로, 오픈 소스 API Gateway Kong도 유지 관리하는 Kong이 구축 및 유지 관리합니다. Unirest를 사용하는 것은 Axios를 사용하는 방법과 유사합니다. Axios의 대안으로 사용할 수 있습니다.


var unirest = require(‘unirest’);async function main() {


try{
var scraped_data =await unirest.get(“https://books.toscrape.com/");
console.log(scraped_data.body);
//<DOCTYPE HTML>……//
}catch(err){
console.log(err)
}
}main();


다음 명령을 통해 Unirest를 설치할 수 있습니다.


npm i unirest --save 


장점 

  • gzip 자동 지원
  • 파일 전송은 간단합니다.
  • URL과 함께 콜백을 제공하여 직접 요청을 보낼 수 있습니다.

Superagent 


작은 점진적 클라이언트 측 HTTP 요청 라이브러리 및 동일한 API를 사용하는 Node.js 모듈은 많은 고급 HTTP 클라이언트 기능을 지원합니다. Axios와 유사한 API가 있으며 promise 및 async / await 구문을 지원합니다.


const superagent = require(‘superagent’);async function main() {


try{
var scraped_data =await superagent.get(“https://books.toscrape.com/");
console.log(scraped_data.text);
//<DOCTYPE HTML>……//
}catch(err){
console.log(err)
}
}main();


다음 명령을 통해 Superagent를 설치할 수 있습니다.


npm i superagent --save 


장점 


  • 요청을 보내기 위한 여러 기능 체인.
  • 많은 공통 기능에 사용할 수 있는 다양한 플러그인
  • 브라우저와 노드 모두에서 작동

단점 

  • API는 어떤 표준도 준수하지 않습니다.


Nightmare 


Nightmare는 Segment의 고급 브라우저 자동화 라이브러리입니다. PhantomJs와 비슷하지만 두 배나 빠르며 약간 현대적인 Electron (Atom 텍스트 편집기를 구동하는 동일한 Google Chrome 파생 프레임 워크)을 사용합니다. 원래 API가 없는 사이트에서 작업을 자동화하도록 설계되었지만 UI 테스트 및 크롤링에 가장 자주 사용됩니다.


Nightmare는 무거운 번들이 마음에 들지 않으면 Puppetteer보다 이상적인 선택입니다. 스크레이퍼는 그것을 넘어 뜨릴 수 있는 많은 성가신 코드를 우회합니다. 뿐만 아니라 대부분 클라이언트 측에서 렌더링 되는 웹 사이트는 여전히 스크래핑 가능합니다. 스크래핑에 양식을 반환하기 위해 AJAX 요청을 해야 하는 상황에 처해 있다면 오늘은 멋진 날이 될 것입니다. !


다음 명령을 실행하여 악몽 라이브러리를 설치할 수 있습니다.


npm install nightmare 


Nightmare가 설치되면 Duckduckgo 검색 엔진을 통해 Scrapingdog의 웹 사이트 링크를 찾을 수 있습니다.


const Nightmare = require(‘nightmare’)const nightmare = Nightmare()nightmare
.goto(‘https://duckduckgo.com')
.type(‘#search_form_input_homepage’, ‘Scrapingdog’)
.click(‘#search_button_homepage’)
.wait(‘#links .result__a’)
.evaluate(() => document.querySelector(‘#links .result__a’).href)
.end()
.then((link) => {
console.log(‘Scrapingdog Web Link:’, link)
//Scrapingdog Web Link: https://www.scrapingdog.com/
})
.catch((error) => {
console.error(‘Search failed:’, error)
})


이제 한 줄씩 이동하겠습니다. 먼저 Nightmare 인스턴스를 만들었습니다. 그런 다음 .goto를 사용하여 Duckduckgo 검색 엔진을 엽니다. 그런 다음 선택기를 사용하여 검색 창을 가져옵니다. .type을 사용하여 검색 창의 값을 'Scrapingdog'로 변경했습니다. 이 모든 작업이 완료되면 제출하겠습니다. Nightmare는 첫 번째 링크가 로드 될 때까지 기다린 후 DOM 메서드를 사용하여 href 속성의 값을 가져옵니다. 링크를 받으면 콘솔에 인쇄됩니다.


장점 


  • ES7 await 키워드에 대한 훌륭한 사용 사례입니다.
  • 브라우저를 일시 중지하는 기능을 기다립니다.
  • Puppeteer보다 가볍습니다.

단점 

  • Electron에는 악의적인 웹 사이트가 컴퓨터에서 코드를 실행할 수 있는 발견되지 않은 취약성이 존재할 수 있습니다.

요약 


따라서 이들은 웹 스크래핑 프로젝트에 사용할 수 있는 오픈 소스 웹 스크래핑 도구 및 라이브러리였습니다. 데이터 수집에만 집중하고 싶다면 언제든지 웹 스크래핑 API를 사용할 수 있습니다.



댓글목록 0

등록된 댓글이 없습니다.

웹학교 로고

온라인 코딩학교

코리아뉴스 2001 - , All right reserved.