Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
6b9aa91
2 웹 데이터 수집 - 1 웹 페이지 다운로드
neverlish Feb 9, 2017
806c553
2 - 2 HTML 해석(링크와 이미지 추출)
neverlish Feb 9, 2017
bfccd83
2 - 3 사이트를 통째로 다운로드
neverlish Feb 9, 2017
16b616e
2 - 4 XML/RSS 해석
neverlish Feb 10, 2017
0208eed
2 - 5 정기적으로 다운로드
neverlish Feb 10, 2017
3e23c3a
3 로그인이 필요한 웹사이트 크롤링 - 1 PhantomJS와 CasperJS
neverlish Feb 10, 2017
227fef1
3 - 2 로그인 후의 데이터를 다운로드
Feb 10, 2017
c996169
3 - 3 DOM 파싱 방법과 CSS 선택자
Feb 10, 2017
47eb300
3 - 4 Electron 으로 데스크톱 애플리케이션 작성
neverlish Apr 15, 2017
4ff5295
3 - 5 Electron으로 스크린 캡처
neverlish Apr 15, 2017
58a2c56
4 데이터 처리 및 저장 - 1 문자 코드와 호환
neverlish Apr 15, 2017
d9aa9d2
4 - 2 정규 표현식을 사용한 데이터 변환
neverlish Dec 31, 2017
57515d6
4 - 3 데이터 형식의 기초
neverlish Apr 6, 2018
7124a95
4 - 4 커피스트립트
neverlish Apr 6, 2018
3b86ab6
4 - 5 데이터베이스 사용법
neverlish Apr 6, 2018
6c78647
4 - 6 리포트 자동 생성
neverlish Apr 16, 2018
cff9476
5 한글 형태소 분석 - 2 특정 품사의 단어들을 추출
neverlish Apr 16, 2018
a7a3e00
5 - 3 마르코프 체인을 이용한 문서 요약
neverlish Apr 16, 2018
afa398c
5 - 4 간단한 문장 교정 도구 작성
neverlish Apr 16, 2018
dc6a042
5 - 5 단어의 출현 빈도 조사
neverlish Apr 16, 2018
3d4e15c
6 크롤링을 위한 데이터 소스 - 2 트위터 크롤링
neverlish Jun 1, 2018
1e8c747
6 - 3 페이스북
neverlish Jun 1, 2018
8548ae0
6 - 4 네이버 API 사용
neverlish Jun 1, 2018
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions node/jpub-web-crawling-technique/02/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
node_modules/
*/*.html
*/img/
*/nodejs.org/
*/*.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
// url에 있는 파일을 savepath에 다운로드한다

// 다운로드할 url을 지정
var url = 'http://jpub.tistory.com/';
// 저장할 위치를 지정
var savepath = 'test.html';

// 사용 모듈 정의
var http = require('http'); // HTTP 모듈
var fs = require('fs'); // 파일 처리 관련 모듈

// 출력 지정
var outfile = fs.createWriteStream(savepath);

// 비동기로 url의 파일 다운로드
http.get(url, function(res) {
res.pipe(outfile);
res.on('end', function() {
outfile.close();
console.log('ok');
})
})
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
// 다운로드
download (
'http://jpub.tistory.com/539',
'spring.html',
function() { console.log('ok, spring') }
)

download (
'http://jpub.tistory.com/537',
'angular.html',
function() { console.log('ok, angular') }
)

// url의 파일을 savepath에 다운로드하는 함수
function download(url, savepath, callback) {
var http = require('http');
var fs = require('fs');
var outfile = fs.createWriteStream(savepath);

var req = http.get(url, function(res) {
res.pipe(outfile);
res.on('end', function() {
outfile.close();
callback();
})
})
}
15 changes: 15 additions & 0 deletions node/jpub-web-crawling-technique/02/02-analyze/01-getPage.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
// 모듈 로드
var client = require('cheerio-httpcli');

// 다운로드
var url = 'http://jpub.tistory.com';
var param = {};

client.fetch(url, param, function(err, $, res) {
// 에러 체크
if (err) { console.log('Error:', err); return; }

// 다운로드한 결과를 화면에 출력
var body = $.html();
console.log(body);
})
16 changes: 16 additions & 0 deletions node/jpub-web-crawling-technique/02/02-analyze/02-showlink.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// 모듈 로드
var client = require('cheerio-httpcli');

// 다운로드
var url = 'http://jpub.tistory.com';
var param = {};
client.fetch(url, param, function(err, $, res) {
if (err) { console.log('error'); return; }

// 링크를 추출하여 표시
$('a').each(function(idx) {
var text = $(this).text();
var href = $(this).attr('href');
console.log(text + ' : ' + href);
})
})
14 changes: 14 additions & 0 deletions node/jpub-web-crawling-technique/02/02-analyze/03-url-test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
// url 모듈 로드
var urlType = require('url');

// 상대 경로를 절대 경로로 변환
var base = 'http://kujirahand.com/url/test/index.html';

var u1 = urlType.resolve(base, 'a.html');
console.log('u1 = ' + u1);

var u2 = urlType.resolve(base, '../b.html');
console.log('u2 = ' + u2);

var u3 = urlType.resolve(base, '/c.html');
console.log('u3 = ' + u3);
27 changes: 27 additions & 0 deletions node/jpub-web-crawling-technique/02/02-analyze/04-showlink-path.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
// 모듈 로드
var client = require('cheerio-httpcli');
var urlType = require('url');

// URL과 파라미터
var url = 'http://jpub.tistory.com';
var param = {};

// 다운로드
client.fetch(url, param, function(err, $, res) {
if (err) { console.log('error'); return; }

// 링크 추출하여 출력
$('a').each(function(idx) {
var text = $(this).text();
var href = $(this).attr('href');

if (!href) return;

// 상대 경로를 절대 경로로 변환
var href2 = urlType.resolve(url, href);

// 결과를 표시
console.log(text + ' : ' + href);
console.log(' => ' + href2 + '\n');
})
})
18 changes: 18 additions & 0 deletions node/jpub-web-crawling-technique/02/02-analyze/05-showimage.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
// 모듈 로드
var client = require('cheerio-httpcli');
var urlType = require('url');

// 다운로드
var url = 'https://ko.wikipedia.org/wiki/' + encodeURIComponent('강아지');
var param = {};

client.fetch(url, param, function(err, $, res) {
if (err) { console.log('error'); return; }

// 링크를 추출하여 표시
$('img').each(function(idx) {
var src = $(this).attr('src');
src = urlType.resolve(url, src);
console.log(src);
})
})
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
// 모듈 로드
var request = require('request');
var fs = require('fs');

// URL 저장
var url = 'http://jpub.tistory.com/';
var savepath = 'test.html';

// 다운로드
request(url).pipe(fs.createWriteStream(savepath));
35 changes: 35 additions & 0 deletions node/jpub-web-crawling-technique/02/02-analyze/07-dl-image.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// 모듈 로드
var client = require('cheerio-httpcli');
var request = require('request');
var fs = require('fs');
var urlType = require('url');

// 저장할 디렉터리가 없으면 생성
var savedir = __dirname + '/img';
if (!fs.existsSync(savedir)) {
fs.mkdirSync(savedir);
}

// URL 지정
var url = 'https://ko.wikipedia.org/wiki/' + encodeURIComponent('강아지');
var param = {};

// HTML 파일 획득
client.fetch(url, param, function(err, $, res) {
if (err) { conosole.log('error'); return; }

// img 링크 추출하여 각 링크에 대해 함수 수행
$('img').each(function(idx) {
var src = $(this).attr('src');

// 상대 경로를 절대 경로로 변환
src = urlType.resolve(url, src);

// 저장 파일 이름 결정
var fname = urlType.parse(src).pathname;
fname = savedir + '/' + fname.replace(/[^a-zA-Z0-9\.]+/g, '_');

// 다운로드
request(src).pipe(fs.createWriteStream(fname));
})
})
76 changes: 76 additions & 0 deletions node/jpub-web-crawling-technique/02/03-getall/01-getall.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
// 링크를 분석해서 다운로드(Node.js)
// --- 모듈 로드 ---
var client = require('cheerio-httpcli');
var request = require('request');
var urlType = require('url');
var fs = require('fs');
var path = require('path');

// --- 공통 설정 ---
// 링크 탐색 단계 지정
var LINK_LEVEL = 3;
// 기준 URL 페이지
var TARGET_URL = 'https://nodejs.org/dist/latest-v6.x/docs/api/';
var list = {};

// 메인 처리
downloadRec(TARGET_URL, 0);

// 지정 URL을 최대 level 단계까지 다운로드
function downloadRec(url, level) {
// 최대 level 확인
if (level >= LINK_LEVEL) return;

// 이미 다운받은 사이트는 무시
if (list[url]) return;
list[url] = true;

// 외부 페이지는 무시
var us = TARGET_URL.split('/');
us.pop();
var base = us.join('/');
if (url.indexOf(base) < 0) return;

// HTML을 취득
client.fetch(url, {}, function(err, $, res) {
// 링크된 페이지를 취득
$('a').each(function(idx) {
// <a> 태그의 링크를 획득
var href = $(this).attr('href');
if (!href) return;

// 상대 경로를 절대 경로로 반환
href = urlType.resolve(url, href);

// '#' 이후를 무시(a.html#aa와 a.html#bb는 같다)
href = href.replace(/\#.+$/, ''); // 말미의 #를 제거
downloadRec(href, level + 1);
});

// 페이지 저장
if (url.substr(url.length-1, 1) == '/') {
url += 'index.html'; // 인덱스 자동 추가
}

var savepath = url.split('/').slice(2).join('/');
checkSaveDir(savepath);
console.log(savepath);
fs.writeFileSync(savepath, $.html());
});
}

// 저장할 디렉터리 존재 유무 확인
function checkSaveDir(fname) {
// 디렉터리 부분만 검출
var dir = path.dirname(fname);

// 디렉터리를 재귀적으로 생성
var dirlist = dir.split('/');
var p = '';
for (var i in dirlist) {
p += dirlist[i] + '/';
if (!fs.existsSync(p)) {
fs.mkdirSync(p);
}
}
}
9 changes: 9 additions & 0 deletions node/jpub-web-crawling-technique/02/03-getall/02-mkdir.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
// 모듈 로드
var fs = require('fs');

// 폴더 생성
console.log('mkdir 실행');
fs.mkdir('test', function() {
console.log('폴더 생성 완료');
});
console.log('mkdir 실횅 완료. 결과 대기');
7 changes: 7 additions & 0 deletions node/jpub-web-crawling-technique/02/03-getall/03-mkdirSync.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
// 모듈 로드
var fs = require('fs');

// 디렉터리를 동기적으로 생성
console.log('mkdir 실행');
fs.mkdirSync('test-sync');
console.log('mkdir 완료');
10 changes: 10 additions & 0 deletions node/jpub-web-crawling-technique/02/03-getall/04-mkdir.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
// 모듈 로드
var fs = require('fs');

// 폴더를 동기적으로 생성
if (!fs.existsSync('test3')) {
fs.mkdirSync('test3');
console.log('test3 생성완료');
} else {
console.log('test3이 이미 있으므로 생성 안함');
}
14 changes: 14 additions & 0 deletions node/jpub-web-crawling-technique/02/04-xmlrss/01-test-xml.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
// 모듈 로드
var parseString = require('xml2js').parseString;

// 테스트용 XML 데이터
var xml = '<fruits shop="AAA">' +
'<item price="140">Banana</item>' +
'<item price="200">Apple</item>' +
'</fruits>';

// XML 전달
parseString(xml, function(err, result) {
// 파싱된 결과에 대한 처리를 여기에 작성
console.log(JSON.stringify(result));
})
25 changes: 25 additions & 0 deletions node/jpub-web-crawling-technique/02/04-xmlrss/02-test-xml2.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
// 모듈 로드
var parseString = require('xml2js').parseString;

// 테스트용 XML 데이터
var xml = '<fruits shop="AAA">' +
'<item price="140">Banana</item>' +
'<item price="200">Apple</item>' +
'</fruits>';

// XML을 전달
parseString(xml, function(err, result) {
// console.log(JSON.stringify(result));

// fruits을 제공하는 가게 이름
var shop = result.fruits.$.shop;
console.log('shop = ' + shop);

// fruits의 이름과 가격을 표시
var items = result.fruits.item;
for (var i in items) {
var item = items[i];
console.log('-- name = ' + item._);
console.log(' price = ' + item.$.price);
}
});
10 changes: 10 additions & 0 deletions node/jpub-web-crawling-technique/02/04-xmlrss/03-test-xml0.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
// 모듈 로드
var parseString = require('xml2js').parseString;

// 테스트용 데이터
var xml = '<item>Banana</item>';

// XML을 전달
parseString(xml, function(err, result) {
console.log(result.item); // 결과: Banana
})
20 changes: 20 additions & 0 deletions node/jpub-web-crawling-technique/02/04-xmlrss/04-test-xml3.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
// 모듈 로드
var parseString = require('xml2js').parseString;

// 테스트용 XML 데이터
var xml =
'<items>' +
'<item><name>Banana</name><price>130</price></item>' +
'<item><name>Apple</name><price>300</price></item>' +
'<item><name>Pear</name><price>250</price></item>' +
'</items>';

// XML 전달
parseString(xml, function(err, result) {
console.log(JSON.stringify(result));

// 각 요소의 표시
console.log('---');
console.log(result.items.item[0].name[0]);
console.log(result.items.item[0].price[0]);
})
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// 모듈 로드
var xml2js = require('xml2js');

// 자바스크립트 객체
var obj = {
item: {name: 'Banana', price: 150}
};

// XML로 변환
var builder = new xml2js.Builder();
var xml = builder.buildObject(obj);
console.log(xml);
Loading