Node.js + Cheerio의 스크래핑이 ProxyCrawl로 쉬워졌습니다.

저처럼 웹 스크래핑을 처음 사용하는 경우 이미 특정 웹사이트에서 차단되었거나 CAPTCHA를 우회할 수 없는 경험이 있을 것입니다.

차단에 대해 너무 걱정하지 않고 웹 페이지를 스크랩하는 쉬운 방법을 찾던 중 사용하기 쉬운 Crawler API를 제공하는 ProxyCrawl을 발견했습니다. 이 제품을 사용하면 놀라운 안정성으로 Amazon 페이지를 원활하게 스크랩할 수 있습니다.

이 기사에서는 스크레이퍼를 빌드한 다음 크롤링 API를 내 프로젝트에 통합하는 방법에 대한 단계를 공유하고 싶었습니다. 이 간단한 코드는 Amazon URL 목록에서 제품 리뷰를 쉽게 스크랩하고 스크랩한 데이터를 CSV 파일에 바로 씁니다.

준비



이번 Node 프로젝트에서는 ProxyCrawl의 라이브러리와 웹 스크래핑에 사용되는 서버용 JQuery와 같은 Cheerio를 사용했습니다. 따라서 실제 코딩을 시작하기 전에 이것이 작동하는 데 필요한 모든 것을 나열하겠습니다.
  • URL 목록이 필요하므로 몇 가지 예를 제공했습니다here.
  • A ProxyCrawl account . 처음 1000건의 요청에 대해 API를 무료로 호출하는 데 사용할 수 있는 무료 평가판이 있으므로 우리 프로젝트에 적합합니다.
  • ProxyCrawl
  • Nodejs library

  • GitHub의 Node Cheerio Library

  • 정말로, 그게 다야. 따라서 더 이상 고민하지 않고 코드 작성을 시작하겠습니다.

    노드로 코딩



    이 시점에서 이미 즐겨 사용하는 코드 편집기를 설치했을 수 있지만 그렇지 않은 경우 Visual Studio 코드를 설치하는 것이 좋습니다.

    프로젝트 구조를 설정하려면 다음을 수행하십시오.
  • 프로젝트 폴더 이름을 Amazon으로 생성합니다
  • .
  • 폴더 안에 파일을 만들고 이름을 Scraper.js로 지정합니다.

  • 완료되면 터미널로 이동하여 다음 요구 사항을 설치합니다.
  • npm i 프록시 크롤링
  • npm i 신박한

  • 패키지 설치 후 Amazon 폴더로 이동하여 나중에 코드로 스크랩할 Amazon URL 목록이 포함된 텍스트 파일을 붙여넣습니다.

    이제 프로젝트 구조는 다음과 같아야 합니다.



    이제 모든 것이 설정되었으므로 Scraper.js 파일에 코드 작성을 시작하겠습니다. 다음 줄은 Amazon-product.txt 파일을 배열로 로드합니다.

    const fs = require('fs');
    const file = fs.readFileSync('Amazon-products.txt');
    const urls = file.toString().split('\n');
    


    다음으로 ProxyCrawl 노드 라이브러리를 활용하여 크롤링 API를 프로젝트에 쉽게 통합할 수 있습니다.

    const { ProxyCrawlAPI } = require('proxycrawl');
    


    아래 코드는 토큰을 배치할 수 있는 작업자를 생성합니다. 값을 ProxyCrawl 계정의 일반 토큰으로 바꾸십시오.

    const api = new ProxyCrawlAPI({ token: '_YOUR_TOKEN_' });
    


    그런 다음 이제 API에 대해 초당 10개의 요청을 수행하는 코드를 작성할 수 있습니다. 또한 setInterval 함수를 사용하여 텍스트 파일의 각 URL을 크롤링합니다.

    const requestsPerSecond = 10;
    var currentIndex = 0;
    setInterval(() => {
      for (let i = 0; i < requestsPerSecond; i++) {
        api.get(urls[currentIndex]);
        currentIndex++;
      }
    }, 1000);
    


    이 시점에서 URL을 로드하는 중입니다. 실제 스크래핑을 수행하기 위해 Node Cheerio 라이브러리를 사용하고 웹 페이지의 전체 HTML 코드에서 리뷰를 추출합니다.

    const cheerio = require('cheerio');
    


    코드의 다음 부분은 반환된 HTML을 구문 분석하는 함수입니다.

    function parseHtml(html) {
      // Load the html in cheerio
      const $ = cheerio.load(html);
      // Load the reviews
      const reviews = $('.review');
      reviews.each((i, review) => {
      // Find the text children
      const textReview = $(review).find('.review-text').text().replace(/\s\s+/g, '')
    ;
        console.log(textReview);
      })
    }
    


    이 코드는 사용할 준비가 되었지만 콘솔에 결과만 기록합니다. 계속해서 몇 줄을 삽입하여 대신 CSV 파일에 작성해 보겠습니다.

    이를 위해 노드와 함께 제공되는 FS 모듈을 사용한 다음 writeStream이라는 변수를 생성합니다.

    const fs = require('fs');
    const writeStream = fs.createWriteStream('Reviews.csv');
    


    *Reviews.csv는 CSV 파일이며 원하는 이름을 지정할 수 있습니다.

    헤더도 추가하겠습니다.

    writeStream.write(`ProductReview \n \n`);
    


    마지막으로 실제 값을 CSV 파일에 쓰도록 코드에 지시해야 합니다.

    writeStream.write(`${textReview} \n \n`);
    


    스크레이퍼가 완성되었으므로 전체 코드는 다음과 같아야 합니다.

    const fs = require('fs');
    const { ProxyCrawlAPI } = require('proxycrawl');
    const cheerio = require('cheerio');
    const writeStream = fs.createWriteStream('Reviews.csv');
    
    //headers
    writeStream.write(`ProductReview \n \n`);
    
    const file = fs.readFileSync('Amazon-products.txt');
    const urls = file.toString().split('\n');
    const api = new ProxyCrawlAPI({ token: '_YOUR_TOKEN_' });
    
    function parseHtml(html) {
      // Load the html in cheerio
      const $ = cheerio.load(html);
      // Load the reviews
      const reviews = $('.review');
      reviews.each((i, review) => {
        // Find the text children
        const textReview = $(review).find('.review-text').text().replace(/\s\s+/g, '');
        console.log(textReview);
        // write the reviews in the csv file
        writeStream.write(`${textReview} \n \n`);
      })
    }
    
    const requestsPerSecond = 10;
    var currentIndex = 0;
    setInterval(() => {
      for (let i = 0; i < requestsPerSecond; i++) {
        api.get(urls[currentIndex]).then(response => {
          // Make sure the response is success
          if (response.statusCode === 200 && response.originalStatus === 200) {
            parseHtml(response.body);
          } else {
            console.log('Failed: ', response.statusCode, response.originalStatus);
          }
        });
        currentIndex++;
      }
    }, 1000);
    


    결과



    스크레이퍼를 실행하려면 Windows에서 F5를 누르거나 터미널로 이동하여 노드 파일 이름을 입력하십시오.

    출력 예:


    이 가이드에서 무언가를 배웠기를 바랍니다. ProxyCrawl에 가입하여 토큰을 받고 API를 사용하여 블록을 피하는 것을 잊지 마십시오.

    원하는 대로 이 코드를 자유롭게 활용하세요 😊

    좋은 웹페이지 즐겨찾기