Skip to content
This repository was archived by the owner on Nov 27, 2024. It is now read-only.

Commit 6b77cfd

Browse files
committed
First init
0 parents  commit 6b77cfd

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

78 files changed

+13240
-0
lines changed

.env

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# Port
2+
PORT_DEV=8080
3+
PORT_PROD=80
4+
PORT_TEST=8080
5+
PORT_BAT=3030
6+
7+
# ElasticSearch URL
8+
ES_URL=
9+
10+
# Puppeteer options
11+
MAX_BROWSER_COUNT=
12+
13+
# Aws configuration
14+
ACCESS_KEY_ID=
15+
SECRET_ACCESS_KEY=
16+
REGION=
17+
QUEUE_URL=w
18+
BUCKET_NAME=
19+
20+
# Naver
21+
NAVER_ID=
22+
NAVER_PW=
23+
24+
# Instagram
25+
INSTA_ID=
26+
INSTA_PW=

.eslintrc

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
"env": {
3+
"es6": true,
4+
"node": true, // process 객체 사용
5+
"browser": true // window, document 객체 사용
6+
},
7+
"extends": ["eslint:recommended", "plugin:prettier/recommended"], // prettier와 연동
8+
"rules": {
9+
"no-path-concat": [
10+
"error" // __dirname 에러 disabled
11+
],
12+
"use-isnan": 0, // NaN 타입검증 에러 disabled
13+
"no-useless-escape": 0 // 정규식 에러 disables
14+
}
15+
}

.gitignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
node_modules/
2+
outputs/
3+
yarn.lock
4+
yarn-error.log
5+
.vscode

.prettierrc

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"singleQuote": true,
3+
"semi": false,
4+
"trailingComma": "all",
5+
"tabWidth": 2,
6+
"printWidth": 80
7+
}

README.md

Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
# Pipeline Crawler
2+
3+
처음에는 단순 커뮤니티, SNS, 포털사이트 크롤 용도로 로컬에서만 사용하도록 제작했습니다. 그러다 추출해야할 데이터의 양이 증가하다보니 ElasticSearch로 데이터를 보내는 데 중점을 두고 클라우드 환경에서도 사용이 가능하도록 튜닝을 해왔습니다.
4+
5+
<br>
6+
7+
---
8+
9+
<br>
10+
11+
## Installation
12+
13+
- 의존성 패키지를 설치합니다.
14+
15+
```sh
16+
// using yarn
17+
yarn
18+
19+
// using npm
20+
npm install
21+
```
22+
23+
- `update.sh`에서 원격저장소 주소를 수정합니다.
24+
25+
```sh
26+
git remote set-url origin <GIT_REPO_URL>
27+
```
28+
29+
- `.env`를 수정합니다.
30+
31+
- 배치잡용 옵션으로 머신의 성능에 따라 최대 브라우저 갯수를 설정이 가능합니다. 단, http 통신으로 요청을 보내서 크롤할 때만 가능합니다. EC2 t2.medium(2core/4gb)에서는 `MAX_BROWSER_COUNT`가 1이 적합했습니다. 그 이상은 memory leak 문제가 생깁니다.
32+
33+
```.env
34+
# Puppeteer options
35+
MAX_BROWSER_COUNT=<NUMBER>
36+
```
37+
38+
- ElasticSearch를 구동시키고 있는 URL을 입력합니다.
39+
40+
```.env
41+
# ElasticSearch URL
42+
ES_URL=
43+
```
44+
45+
- AWS 프로파일 정보와 SQS에서 `fifo`옵션으로 만든 Queue URL, 그리고 S3 버킷명을 입력합니다.
46+
47+
```.env
48+
# Aws configuration
49+
ACCESS_KEY_ID=<ACCESS_KEY_ID>
50+
SECRET_ACCESS_KEY=<SECRET_ACCESS_KEY>
51+
REGION=<REGION>
52+
QUEUE_URL=<QUEUE_URL>
53+
BUCKET_NAME=<BUCKET_NAME>
54+
```
55+
56+
- 커뮤니티 계정을 입력합니다.
57+
58+
```.env
59+
# Naver
60+
NAVER_ID=<NAVER_ID>
61+
NAVER_PW=<NAVER_PW>
62+
63+
# Instagram
64+
INSTA_ID=<INSTA_ID>
65+
INSTA_PW=<INSTA_PW>
66+
```
67+
68+
- `outputs` 디렉토리를 생성합니다.
69+
70+
```sh
71+
$ mkdir outputs
72+
```
73+
74+
<br>
75+
76+
---
77+
78+
<br>
79+
80+
## Scripts
81+
82+
- `npm start` / `yarn start`: 프로덕션 모드로 서버 구동
83+
- `npm run start:dev` / `yarn start:dev`: 개발 모드로 서버 구동
84+
- `npm run start:bat` / `yarn start:bat`: 배치잡 모드로 서버 구동
85+
- `sh update.sh`: 원격저장소에서 가장 최신버전 코드 다운로드 및 설치
86+
- `sh start.sh`: 배치잡용 pm2 재실행 스크립트
87+
88+
<br>
89+
90+
---
91+
92+
<br>
93+
94+
## Usage
95+
96+
#### 프로덕션 모드
97+
98+
개발모드와의 차이점은 `healess`옵션이 켜졌냐 꺼졌냐의 차이만 있습니다. `80`번 포트를 사용합니다.
99+
100+
#### 개발 모드
101+
102+
주로 디버깅 작업을 해야하기 때문에 `healess`옵션을 꺼둔채로 사용합니다. `8080`번 포트를 사용합니다.
103+
104+
#### 배치잡 모드
105+
106+
크롤러를 클러스터화해서 사용하기 적합하도록 튜닝한 모드입니다. [여기]()에서 데이터 파이프라인을 확인하실 수 있습니다.
107+
108+
- 한 행의 데이터를 추출할 때마다 ElasticSearch로 한 줄씩 보내고 있습니다.
109+
- 빠른 서버 재실행과 로그 기록을 위해 pm2를 사용하고 있습니다. `ecosystem.json`을 확인해주세요.
110+
111+
<br>
112+
113+
---
114+
115+
<br>
116+
117+
## Features
118+
119+
- 키워드는 `컴마+공백`을 구분자로 입력합니다.
120+
- 예: `비트코인, 리플, 이더리움`
121+
- 인스타그램 모델에서는 hashtag 검색에 공백이 허용되지 않으므로, 공백은 자동으로 `replace()`처리가 되도록 했습니다.
122+
- 예: `네이버 블로그` => `네이버블로그`
123+
- `Add crawling job` 컴포넌트에서 `Job scheduling`에 추출을 원하는 시간을 입력하면 작업 예약이 가능합니다.
124+
- 배치잡 모드 사용을 위해 웹소켓 통신을 하는 프론트엔드 뿐만 아니라 rest api를 사용합니다.
125+
126+
- `GET /crawl`: 잡을 받을지 말지 결정해서 서버리스 코드에 돌려줍니다.
127+
128+
- 응답코드
129+
130+
- 크롤이 불가능한 경우
131+
132+
```json
133+
{ "success": false }
134+
```
135+
136+
- 크롤이 가능한 경우
137+
```json
138+
{ "success": true }
139+
```
140+
141+
- `POST /crawl`: 잡을 받을 상태가 되었다면 body에 추출할 정보를 실어서 보냅니다. 한 행씩 추출이 끝날 때마다 ElasticSearch에 추출한 정보를 업로드합니다.
142+
143+
- 필수 입력 필드: `keyword`, `startDate`, `endDate`, `site`, `category`, `channel`
144+
- 응답 코드
145+
146+
```json
147+
{ "success": true }
148+
```
149+
150+
<br>
151+
152+
---
153+
154+
<br>
155+
156+
## Output
157+
158+
- csv파일로 아래와 같은 필드명으로 `outputs`디렉토리에 추출후 저장됩니다.
159+
160+
| keyword | category | date | title | username | content | click | link | channel | site |
161+
| ------- | -------- | ---- | ----- | -------- | ------- | ----- | ---- | ------- | ---- |
162+
| KEYWORD | CATEGORY | DATE | TITLE | USERNAME | CONTENT | CLICK | LINK | CHANNEL | SITE |

aws.config.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"accessKeyId": "ACCESS_KEY_ID",
3+
"secretAccessKey": "SECRET_ACCESS_KEY",
4+
"region": "REGION"
5+
}

docs/assets/images/01.jpg

104 KB
Loading

docs/assets/images/02.jpg

141 KB
Loading

docs/assets/images/03.jpg

11.8 KB
Loading

docs/assets/images/04.jpg

147 KB
Loading

ecosystem.json

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
"apps": [
3+
{
4+
"name": "batch",
5+
"script": "src/index.js",
6+
"watch": true,
7+
"ignore_watch": ["outputs", "node_modules"],
8+
"max_memory_restart": "3500M",
9+
"env": {
10+
"NODE_PATH": "src",
11+
"NODE_ENV": "batch"
12+
}
13+
}
14+
]
15+
}

0 commit comments

Comments
 (0)