구글 검색엔진 API, Node js, Vue js를 사용하여 이미지 크롤링하기 - 1
구글 검색엔진 API, Node js, Vue js를 활용하여 간단하게 이미지 크롤링하는 프로젝트를 만들어 보려고 한다.
본인은 구글 이미지를 크롤링 할 수 있는 오픈소스가 있는지 검색하였고
github에서 google-images라는 오픈소스를 발견하여 npm을 이용하여 해당 오픈소스를 설치하여 활용하였다.
1. 일단 제일 먼저 Nodejs프로젝트를 생성해보자.
폴더를 하나 만들고 cmd에서 해당폴더의 경로로 이동 후 npm init을 한다.
그럼 package.json이 생성되고 해당 폴더경로로 VSC(visual studio code)로 오픈한다.
2. VSC에서 TERMINAL창을 열고 해당 위치에서 필요한 package를 설치한다.
3. 구글 커스텀 검색 엔진을 생성한다.
들어가서 간단하게 구글 검색엔진을 생성할 수 있고
생성하면 검색엔진 ID가 나오게 된다.
이미지 검색 부분을 가능하게 설정해주고
해당 검색엔진 ID를 보관한다.
4. 구글 개발자 콘솔로 접속하여 프로젝트를 생성 및 연결하기
https://console.developers.google.com/
구글 개발자 콘솔로 접속하여 프로젝트를 생성한다.
본인은 googleSearchApiTest라는 프로젝트를 생성했다.
프로젝트 생성 이후 라이브러리로 이동하여 custom search api를 검색하여 api 사용해보기를 설정한다.
그다음 사용자 인증정보 탭으로 이동 후 API 키를 하나 생성한다.
여기서 생성한 API_KEY를 보관한다.
우리는 총 2개의 값 (검색엔진 ID와 API_KEY) 를 갖게 되었다.
오픈소스 google-images 레퍼런스
https://github.com/vadimdemedes/google-images
5. 다시 프로젝트로 돌아온다.
getGoogleImg.js라는 자바스크립트 파일을 하나 생성한다.
6. 구글검색엔진으로 이미지 크롤링 하기 위한 코드를 작성한다.
getGoogleImg.js 파일에 해당 코드를 작성한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | const GoogleImages = require('google-images'); let url = require('url'); let request = require('request'); const fs = require('fs'); var zip = new require('node-zip')(); // ** 8라인 본인의 검색엔진 ID와 API_KEY로 교체 필수 const client = new GoogleImages('검색엔진 ID', 'API_KEY'); const keyWord = "조현영"; const pageStVal = 1; const pageEndVal = 201; let saveDir = __dirname + "/"+keyWord; if(!fs.existsSync(saveDir)){ fs.mkdirSync(saveDir); } // 이미지 검색 const searchFunc = (pageStVal) =>{ client.search(keyWord, {page: pageStVal, size: 'large'}).then(images => { images.forEach(img => { console.log(img); let filePath = url.parse(img.url).pathname; let newFilePath = filePath.replace(/[^a-zA-Z0-8\.]+/g, '_'); let localFilePath = saveDir + "/" + newFilePath; let pattern = /\.(jpg|png|gif)\b/; // 파일길이가 200 미만이고 이미지 파일인지 체크 if(newFilePath.length<200 && pattern.test(newFilePath)){ try { request.get(img.url).on('error', function(err) { console.log('request error1:', err); }).pipe( fs.createWriteStream(localFilePath).on('close', function() {}) ); } catch (err) { console.log('request error2:', err); } }; }); compareTwoVal(pageStVal, pageEndVal); }).catch(error => { console.log(">>>>>>>>>>>>>>>>>>>"+error); console.log("모든 이미지를 수집했습니다."); makeImgToZip(); return; }); } // 이미지 압축파일 만들기 const makeImgToZip = () =>{ var zipName = keyWord+".zip"; var someDir = fs.readdirSync(__dirname+"/"+keyWord); var newZipFolder = zip.folder(keyWord); for(var i = 0; i < someDir.length; i++){ newZipFolder.file(someDir[i], fs.readFileSync(__dirname+"/"+keyWord+"/"+someDir[i]),{base64:true}); } var data = zip.generate({base64:false,compression:'DEFLATE'}); fs.writeFile(__dirname +"/"+ zipName, data, 'binary', function(err){ if(err){ console.log(err); } }); } // 페이징 검색 const compareTwoVal = (pageStVal, pageEndVal) =>{ if(pageStVal<=pageEndVal){ setTimeout(function() { pageStVal += 10; console.log("pageStVal: >>>>>>>>"+pageStVal); searchFunc(pageStVal); }, 500); }else{ console.log("모든 이미지를 수집했습니다."); makeImgToZip(); return; } } // 이미지 수집 시작 searchFunc(pageStVal); | cs |
코드를 작성 및 저장 후
termial에서 node getGoogleImg.js 로 실행한다.
정상적으로 동작한다면
크롤링한 이미지 데이터를 json형태로 return받게 된다.
이제 이 많은 데이터가
키워드의 폴더 하위로 로컬컴퓨터에 저장하게 되고 zip파일도 만든다.
레인보우 조현영의 이미지 데이터가 잘 크롤링 된 것을 확인 할 수 있다.
Nodejs로 크롤링 테스트가 완료되었으니
프론트에 Vuejs를 사용해 사용자가 키워드를 넣어 크롤링 할수 있게 구현해보자.
[수정된 코드 github url]
https://github.com/shlee0882/node-crawling-google-image