Node, Vue 일지 #8 (20210907) 데이터 수집
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 { By, Key } = 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
//크롬에 원하는 주소 입력
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 입력
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);
*책 제목, 이미지 값 출력
*책 제목, 이미지 위치 확인
**책 제목 위치 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=0; i<resultElements.length; i++) {
//<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 : title, url : url, buffer : buffer};
console.log(obj); <- obj 값 출력하여 확인
*cmd창 출력
*db 저장
//db에 저장할 object 만들기
const obj = {title : title, url : url, buffer : buffer};
coll.insertOne(obj); <- 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 { By, Key } = 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=0; i<resultElements.length; i++) {
//<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 : title, url : url, buffer : 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;