node, vue

Node, Vue 일지 #8 (20210907) 데이터 수집

uni5948 2021. 9. 10. 14:46

8. 데이터 수집

-데이터 수집(node)

  **교보문고 검색창에 node.js 검색 후 나오는 책들의 제목과 이미지를 db에 저장**

 *모듈 설치

  **npm install selenium webdriver --save

모듈 설치

 *크롬 버전 확인

    주소창 옆 점 세개 아이콘 클릭 - 도움말 - 크롬 정보

 

크롬 버전 확인

 *크롬 드라이버 다운로드, 적용

 주소 : https://chromedriver.storage.googleapis.com/index.html?path=93.0.4577.63/ 

 win32 다운로드

크롬 드라이버 다운

 *vscode에서 driver 폴더 생성(node)

 **다운받은 크롬 드라이버를 압축 해제한 후 exe 파일을 driver 폴더에 넣는다.

크롬 드라이버 적용

  *구현하기(node users.js)

  **설치했던 모듈을 구현하기 위해 변수 등록

  **실행 시 크롬창이 열리면서 지정한 페이지로 이동한다.( ex) 교보문고)

var express = require('express');

var router = express.Router();

 

//npm install selenium webdriver --save

const webdriver = require('selenium-webdriver');

const { ByKey } = require('selenium-webdriver');

const chrome = require('selenium-webdriver/chrome');

 

//async 함수 만들기

const run = async () => {

  const dbconn = await mongoclient.connect(mongourl);

  const coll = dbconn.db(mongodb).collection(mongocoll);

  

  //크롬 자동화 설치

  const service = new chrome.ServiceBuilder('./driver/chromedriver.exe').build();

  chrome.setDefaultService(service);

  const driver = await new webdriver.Builder().forBrowser('chrome').build();

 

  //크롬에 원하는 주소 입력

  await driver.get('http://kyobobook.co.kr/');

 }

//함수 실행하기

run();

 

 *실행하기

 **실행하면 지정한 페이지가(ex) 교보문고) 열리게 된다.

실행 화면

  *node.js 검색 구현

  **페이지를 실행한후 node.js 입력을 해야하므로 검색창의 xpath를 복사해야한다.

    마우스 오른쪽 클릭 -> 검사 -> 실행된 elenments 에서 마우스 오른쪽 클릭 -> Copy -> Copy XPath

검색창의 xpath 복사하기

//크롬에 원하는 주소 입력

  await driver.get('http://kyobobook.co.kr/');

  //console.log("routes/users.js파일");

 

  //화면에 표시되는 html의 요소를 찾기 (css, xpath, id, classname)

  //*[@id="searchKeyword"] <- Copy XPath 내용 

await driver.findElement(By.xpath(`//*[@id="searchKeyword"]`)).sendKeys("nodejs");  <- 검색 창에 node.js 입력

node.js 입력

await driver.findElement(By.xpath(`//*[@id="searchKeyword"]`)).sendKeys(Key.ENTER); <- enter키 입력하여 페이지 이동

검색하여 페이지 이동

 *책 제목, 이미지 값 출력하기

 **검색된 책들의 제목과 이미지를 cmd 창에서 출력한다.

 **검색된 책들에서 마우스 오른쪽 클릭 -> 검사 클릭하여 elements 창에서 위치 확인

검색된 책의 위치 확인

 *검색된 책 숫자 확인

 let resultElements = await driver.findElements(By.css('#search_list > tr'));

  console.log('length : ' + resultElements.length);

length 확인

 *책 제목, 이미지 값 출력

 *책 제목, 이미지 위치 확인

  **책 제목 위치 td.detail -> div.title -> a 안의 텍스트

  **이미지 위치 td.image -> div.cover -> a -> img 의 "src"

책 제목의 위치
이미지 위치 확인

 *확인한 위치를 참고하여 변수 설정

let resultElements = await driver.findElements(By.css('#search_list > tr'));

  console.log('length : ' + resultElements.length);

  for(let i=0i<resultElements.lengthi++) {

    //<span>aaa</span>

    const title = await resultElements[i].findElement(By.css('td.detail > div.title > a')).getText();

    const url =  await resultElements[i].findElement(By.css('td.image > div.cover > a > img')).getAttribute("src");

    console.log(title);

    console.log(url);

   }

 *출력값 확인

책 제목, 이미지 출력

 *db에 저장하기

 *db 연동, 이미지 받기

var express = require('express');

var router = express.Router();

 

//db 연동 npm i mongodb --save

const mongoclient = require('mongodb').MongoClient;

const mongourl  = "mongodb://id311:pw311@1.234.5.158:37017/id311";

const mongodb   = "id311"

const mongocoll = "image8"<- 컬렉션 이름

... ...

//async 함수 만들기

const run = async () => {

  const dbconn = await mongoclient.connect(mongourl);

  const coll = dbconn.db(mongodb).collection(mongocoll);

... ...

//이미지 받기

    const response =await axios.get(url,{ responseType : 'arraybuffer'});

    const buffer = Buffer.from(response.data"utf-8");

   

    //db에 저장할 object 만들기

    const obj = {title : titleurl : urlbuffer : buffer};

    console.log(obj); <- obj 값 출력하여 확인

 

 *cmd창 출력

obj 출력 확인

 *db 저장

  //db에 저장할 object 만들기

    const obj = {title : titleurl : urlbuffer : buffer};

    coll.insertOne(obj); <- db에 저장

db 저장 확인

 *자동 종료 구현

 **지정한 시간 이후 페이지 종료

//자동종료

  setTimeout(async() => {

    await driver.quit();

    process.exit(0);

  }, 3000); //3초

 

-전체 코드

var express = require('express');

var router = express.Router();

 

//db 연동 npm i mongodb --save

const mongoclient = require('mongodb').MongoClient;

const mongourl  = "mongodb://id311:pw311@1.234.5.158:37017/id311";

const mongodb   = "id311"

const mongocoll = "image8";

 

// npm install axios --save

const axios = require('axios');

 

//npm install selenium webdriver --save

const webdriver = require('selenium-webdriver');

const { ByKey } = require('selenium-webdriver');

const chrome = require('selenium-webdriver/chrome');

 

//async 함수 만들기

const run = async () => {

  const dbconn = await mongoclient.connect(mongourl);

  const coll = dbconn.db(mongodb).collection(mongocoll);

  

  //크롬 자동화 설치

  const service = new chrome.ServiceBuilder('./driver/chromedriver.exe').build();

  chrome.setDefaultService(service);

  const driver = await new webdriver.Builder().forBrowser('chrome').build();

 

  //크롬에 원하는 주소 입력

  await driver.get('http://kyobobook.co.kr/');

  //console.log("routes/users.js파일");

 

  //화면에 표시되는 html의 요소를 찾기 (css, xpath, id, classname)

  //*[@id="searchKeyword"]

  await driver.findElement(By.xpath(`//*[@id="searchKeyword"]`)).sendKeys("nodejs");

  await driver.findElement(By.xpath(`//*[@id="searchKeyword"]`)).sendKeys(Key.ENTER);

 

  let resultElements = await driver.findElements(By.css('#search_list > tr'));

  console.log('length : ' + resultElements.length);

  for(let i=0i<resultElements.lengthi++) {

    //<span>aaa</span>

    const title = await resultElements[i].findElement(By.css('td.detail > div.title > a')).getText();

    const url =  await resultElements[i].findElement(By.css('td.image > div.cover > a > img')).getAttribute("src");

    

    //이미지 받기

    const response =await axios.get(url,{ responseType : 'arraybuffer'});

    const buffer = Buffer.from(response.data"utf-8");

   

    //db에 저장할 object 만들기

    const obj = {title : titleurl : urlbuffer : buffer};

    //console.log(obj);

    coll.insertOne(obj);

    //console.log(title);

    //console.log(url);

   }

  //자동종료

  setTimeout(async() => {

    await driver.quit();

    process.exit(0);

  }, 3000); //3초

 }

//함수 실행하기

run();

 

module.exports = router;