Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

πŸ‡°πŸ‡· Realtime integrated information analysis service

License

Notifications You must be signed in to change notification settings

endlessdev/rankr

Repository files navigation


λŒ€ν•œλ―Όκ΅­ ν¬ν„Έμ‚¬μ΄νŠΈ 검색어 기반
μ‹€μ‹œκ°„ 톡합정보뢄석 μ„œλΉ„μŠ€


μ‹œμž‘ν•˜κΈ°

μ˜μ‘΄μ„± μ„€μΉ˜

λ³Έ μ„œλΉ„μŠ€λ₯Ό μ‹€ν–‰ν•˜κΈ° μœ„ν•΄μ„  μ˜μ‘΄μ„± μ™ΈλΆ€ λͺ¨λ“ˆλ“€μ„ μ„€μΉ˜ν•΄μ•Όλ§Œ ν•©λ‹ˆλ‹€.
μ•„λž˜μ˜ λͺ…λ Ήμ–΄λ₯Ό 톡해 μ˜μ‘΄μ„± λͺ¨λ“ˆμ„ μ„€μΉ˜ν•΄μ£Όμ„Έμš”.

$ npm install

λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ μ‹€ν–‰

크둀링을 μ‚¬μš©ν•˜μ§€ μ•ŠμœΌλ €λ©΄, 이 사항을 κ±΄λ„ˆλ›°μ–΄λ„ λ©λ‹ˆλ‹€.

크둀링 데이터λ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•΄ 크둀링 λ³Έ μ„œλ²„μ™€ 같은 λ°μ΄ν„°λ² μ΄μŠ€ ν™˜κ²½μ„ ꡬ성해야 ν•©λ‹ˆλ‹€.
μ•„λž˜μ™€ 같이 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μ„ μ‹€ν–‰μ‹œμΌœμ£Όμ„Έμš”.

$ sequelize db:migrate --env [database env]

λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μ„ μ‹€ν–‰ν•˜κΈ° 전에

  1. sequelize-cli와 mysql을 npm을 톡해 μˆ˜λ™μœΌλ‘œ μ„€μΉ˜ν•΄μ£Όμ„Έμš”.
  2. μ‚¬μš©ν•  λ°μ΄ν„°λ² μ΄μŠ€ 정보λ₯Ό .env와 config/config.json νŒŒμΌμ— κΈ°μˆ ν•΄μ£Όμ„Έμš”. (예제 .env.example, .config.example.json νŒŒμΌμ„ μ°Έκ³ ν•΄ μ£Όμ‹œκΈΈ λ°”λžλ‹ˆλ‹€.)

μ„œλΉ„μŠ€ μ‹€ν–‰

TypeScript μ–Έμ–΄λ‘œ μž‘μ„±λœ μ„œλΉ„μŠ€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ ts-nodeλ₯Ό ν†΅ν•˜μ—¬ λ³„λ„μ˜ 트랜슀 컴파일링 없이 μ‹€ν–‰λ©λ‹ˆλ‹€.

$ npm start

ν¬λ‘€λŸ¬μ™€ 같이 μ‹€ν–‰ν•˜κ³  μ‹Άλ‹€λ©΄, μ•„λž˜μ™€ 같이 μ‹€ν–‰ν•΄μ£Όμ„Έμš”.

$ npm run start-with-crawler

Rankr REST API

각 ν¬ν„Έμ‚¬μ΄νŠΈμ˜ 인기검색어λ₯Ό κΈ°λ°˜ν•œ 가곡데이터λ₯Ό REST API ν˜•μ‹μœΌλ‘œ μ œκ³΅λ©λ‹ˆλ‹€.
ν•΄λ‹Ή APIλ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œ μ•„λž˜μ˜ λ³Έ μ„œλ²„μ˜ APIλ₯Ό μ΄μš©ν•΄μ£Όμ„Έμš”.

https://api.rankr.kr/v1

RANK API (prefix : /rank)

각 ν¬ν„Έμ‚¬μ΄νŠΈμ˜ μ‹€μ‹œκ°„ κΈ‰μƒμŠΉ 검색어λ₯Ό 응닡받을 수 μžˆμŠ΅λ‹ˆλ‹€.

GET(/naver) Naver μ‹€μ‹œκ°„ κΈ‰μƒμŠΉ 검색어

λ„€μ΄λ²„μ˜ μ‹€μ‹œκ°„ κΈ‰μƒμŠΉ 검색어λ₯Ό PC μ›ΉνŽ˜μ΄μ§€μ—μ„œ HTMLνŒŒμ‹±μ„ 거쳐 μ‘λ‹΅ν•©λ‹ˆλ‹€.

Example Response

{
"resultCode": 200,
"rankType": "naver",
"requestDate": "2017-06-05T13:04:50.186Z",
"data": [
    {
      "rank": 1,
      "title": "μ œλ³΄μžλ“€"
    },
  ...
  ]
}

ν•΄λ‹Ή ν¬ν„Έμ‚¬μ΄νŠΈμ—μ„œ κΈ‰μƒμŠΉ νŠΈλž˜ν‚Ή μ„œλΉ„μŠ€λ₯Ό μ‹œμž‘ν•˜μ—¬ 변동사항 νŒŒλΌλ―Έν„° (e.g status, value)κ°€ μ œμ™Έλ˜μ—ˆμŠ΅λ‹ˆλ‹€. μ΄μš©ν•˜μ‹€λ•Œ μ°Έκ³ ν•˜μ‹œκΈΈ λ°”λžλ‹ˆλ‹€.

GET(/daum) Daum μ‹€μ‹œκ°„ κΈ‰μƒμŠΉ 검색어

λ‹€μŒμ˜ μ‹€μ‹œκ°„ κΈ‰μƒμŠΉ 검색어λ₯Ό PC μ›ΉνŽ˜μ΄μ§€μ—μ„œ HTMLνŒŒμ‹±μ„ 거쳐 μ‘λ‹΅ν•©λ‹ˆλ‹€.

Example Response

{
"resultCode": 200,
"rankType": "daum",
"requestDate": "2017-06-05T13:04:50.186Z",
"data": [
    {
      "rank": 1,
      "title": "μ œλ³΄μžλ“€",
      "value": "244",
      "status": "up"
    },
  ...
  ]
}

GET(/nate) Nate μ‹€μ‹œκ°„ κΈ‰μƒμŠΉ 검색어

λ„€μ΄νŠΈμ˜ μ‹€μ‹œκ°„ κΈ‰μƒμŠΉ 검색어λ₯Ό PC μ›ΉνŽ˜μ΄μ§€μ—μ„œ HTMLνŒŒμ‹±μ„ 거쳐 μ‘λ‹΅ν•©λ‹ˆλ‹€.

Example Response

{
"resultCode": 200,
"rankType": "nate",
"requestDate": "2017-06-05T13:04:50.186Z",
"data": [
    {
      "rank": 1,
      "title": "μ œλ³΄μžλ“€",
      "value": "244",
      "status": "up"
    },
  ...
  ]
}

ν•΄λ‹Ή ν¬ν„Έμ‚¬μ΄νŠΈλŠ” Daum의 검색엔진과 μ‹€μ‹œκ°„ κΈ‰μƒμŠΉ 검색어λ₯Ό μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— 곧 Deprecate 될 μ˜ˆμ •μž…λ‹ˆλ‹€.

GET(/zum) Zum μ‹€μ‹œκ°„ κΈ‰μƒμŠΉ 검색어

Zum의 μ‹€μ‹œκ°„ κΈ‰μƒμŠΉ 검색어λ₯Ό PC μ›ΉνŽ˜μ΄μ§€μ—μ„œ HTMLνŒŒμ‹±μ„ 거쳐 μ‘λ‹΅ν•©λ‹ˆλ‹€.

Example Response

{
"resultCode": 200,
"rankType": "zum",
"requestDate": "2017-06-05T13:04:50.186Z",
"data": [
    {
      "rank": 1,
      "title": "μ œλ³΄μžλ“€"
    },
  ...
  ]
}

Analytics API (prefix : /analytics)

각 ν¬ν„Έμ‚¬μ΄νŠΈμ˜ μ‹€μ‹œκ°„ κΈ‰μƒμŠΉ κ²€μƒ‰μ–΄μ˜ 크둀링 데이터에 κΈ°λ°˜ν•œ 뢄석결과λ₯Ό λ°›μ•„λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

GET(/recent) 졜근 1μ‹œκ°„ 평균 톡계

크둀링이 μ§„ν–‰λ˜λŠ” λͺ¨λ“  ν¬ν„Έμ‚¬μ΄νŠΈμ˜ κΈ‰μƒμŠΉ 인기검색어λ₯Ό 기반으둜 졜근 1μ‹œκ°„ μ΄λ‚΄μ˜ ν‚€μ›Œλ“œ 쀑 λˆ„μ  μ§„μž…μˆ˜μ™€ 평균 μˆœμœ„λ₯Ό λ°”νƒ•μœΌλ‘œ μ •λ ¬ν•˜μ—¬ μƒμœ„ 10개의 데이터λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

Example Response

[
 {
    "title": "ν˜„μΆ©μΌ",
    "rank_count": 3911,
    "rank_avg": 7.2646
 },
...
]

GET(/recent) 졜근 24μ‹œκ°„ 평균 톡계

크둀링이 μ§„ν–‰λ˜λŠ” λͺ¨λ“  ν¬ν„Έμ‚¬μ΄νŠΈμ˜ κΈ‰μƒμŠΉ 인기검색어λ₯Ό 기반으둜 졜근 24μ‹œκ°„ μ΄λ‚΄μ˜ ν‚€μ›Œλ“œ 쀑 λˆ„μ  μ§„μž…μˆ˜μ™€ 평균 μˆœμœ„λ₯Ό λ°”νƒ•μœΌλ‘œ μ •λ ¬ν•˜μ—¬ 전체 데이터λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

Example Response

[
 {
    "title": "ν˜„μΆ©μΌ",
    "rank_count": 3911,
    "rank_avg": 7.2646
 },
...
]

GET(/search/:keyword) νŠΉμ • ν‚€μ›Œλ“œ 뢄석

각 ν¬ν„Έμ‚¬μ΄νŠΈμ˜ μ‹€μ‹œκ°„ κΈ‰μƒμŠΉ κ²€μƒ‰μ–΄μ˜ 크둀링 데이터에 κΈ°λ°˜ν•˜μ—¬ νŠΉμ • ν‚€μ›Œλ“œμ˜ 뢄석결과λ₯Ό λ°›μ•„λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

Example Response

{
  "naver": [{
    "createdAt": "2017-06-04T13:23:00.000Z",
    "rank_crawl_idx": 46100,
    "rank": 2,
    "title": "가인"
  },
  ...
  "daum" : [...],
  "zum" : [...]
}

News API (prefix : /news)

GET(/search/:keyword) νŠΉμ • ν‚€μ›Œλ“œλ‘œ κ²€μƒ‰λœ λ‰΄μŠ€ νŒŒμ‹±

넀이버 톡합 λ‰΄μŠ€ RSSλ₯Ό μ΄μš©ν•˜μ—¬ νŠΉμ • ν‚€μ›Œλ“œλ‘œ κ²€μƒ‰λœ λ‰΄μŠ€μ˜ 데이터λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

Example Response

[
  {
    "title": "μ£Όμ§€ν›ˆ, \"μ‚¬λž‘ν•  μ‹œκ°„λ„ μ•„κΉŒμš΄λ° ν™”λ‚Ό μ‹œκ°„μ΄ μ–΄λ””μžˆλƒ\"...λŒ€λ§ˆμ΄ˆ ꢌ유 ν­λ‘œν•΄λ„?",
    "link": "http://www.ujnews.co.kr/news/articleView.html?idxno=267173",
    "description": "사진=방솑캑쳐 μ£Όμ§€ν›ˆ, \"μ‚¬λž‘ν•  μ‹œκ°„λ„ μ•„κΉŒμš΄λ° ν™”λ‚Ό μ‹œκ°„μ΄ μ–΄λ””μžˆλƒ\"...λŒ€λ§ˆμ΄ˆ ꢌ유 ν­λ‘œν•΄λ„ 그럴까 κ°€μˆ˜ 가인이 μ£Όμ§€ν›ˆμ˜ μ§€μΈμ—κ²Œ λŒ€λ§ˆμ΄ˆλ₯Ό ꢌ유 받은 사싀을 ν­λ‘œν•΄ λ…Όλž€μ΄ 된 κ°€μš΄λ° κ³Όκ±° 연인 가인에 λŒ€ν•œ μ£Όμ§€ν›ˆμ˜...",
    "pubDate": "in 9 hours",
    "author": "μšΈμ‚°μ’…ν•©μΌλ³΄",
    "category": "μ„Ήμ…˜μ—†μŒ",
    "thumb": "http://imgnews.naver.net/image/thumb/5354/2017/06/05/27019.jpg"
  },
  ...
]

크둀러

ν¬λ‘€λŸ¬λŠ” λ³Έ μ„œλΉ„μŠ€κ°€ μ§€μ›ν•˜λŠ” 각각의 ν¬ν„Έμ‚¬μ΄νŠΈλ₯Ό 1뢄에 ν•œλ²ˆμ”© μ ‘μ†ν•˜μ—¬ μ‹€μ‹œκ°„ κΈ‰μƒμŠΉ 검색어λ₯Ό μ‚¬μš©μžκ°€ μ§€μ •ν•œ λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯ν•©λ‹ˆλ‹€.

λ°μ΄ν„°λ² μ΄μŠ€

λ°μ΄ν„°λ² μ΄μŠ€μ˜ μ›ν™œν•œ 관리 및 ν™œμš©μ„ μœ„ν•˜μ—¬ Sequelize ORM을 μ‚¬μš©ν•˜μ—¬ κ°œλ°œν•˜λ„λ‘ μž‘μ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
μ•žμœΌλ‘œ λ°μ΄ν„°λ² μ΄μŠ€μ˜ μΆ”κ°€λ‚˜ μˆ˜μ •μ€ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 및 λͺ¨λΈμ„ μˆ˜μ •ν•˜μ—¬ μ‚¬μš©ν•©λ‹ˆλ‹€.

λ°μ΄ν„°λ² μ΄μŠ€ ꡬ쑰

λ°μ΄ν„°λ² μ΄μŠ€ ꡬ쑰

Narin(@narincorp) μ—μ„œ κ³΅μ‹μ μœΌλ‘œ μ§„ν–‰λ˜κ³ μžˆλŠ” μ‹œκ°ν™” μ›ΉνŽ˜μ΄μ§€ 개발 ν”„λ‘œμ νŠΈλ₯Ό ν™•μΈν•΄μ£Όμ„Έμš”.
Vue.js와 TypeScript λ₯Ό μ‚¬μš©ν•˜μ—¬ κ°œλ°œν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

Go to Github Repository

λ§ˆμΌμŠ€ν†€

  • ꡬ글 νŠΈλ Œλ“œ 데이터 가곡
  • μ‹œκ°ν™” μ›Ή νŽ˜μ΄μ§€ (ν˜„μž¬ κ°œλ°œμ€‘)
  • λ‰΄μŠ€ μ½˜ν…μΈ  νŒŒμ‹± 및 크둀링
  • λ‰΄λŸ΄λ„€νŠΈμ›Œν¬ ꡬ좕 및 μ„œλΉ„μŠ€ ν™œμš©
  • κΈ€λ‘œλ²Œ ν™” (쀑ꡭ, 일본)

λΌμ΄μ„ΌμŠ€

λ³Έ ν”„λ‘œμ νŠΈλŠ” MIT λΌμ΄μ„ΌμŠ€λ₯Ό λ”°λ¦…λ‹ˆλ‹€.

Copyright Β© 2017 Narin inc.

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Releases

No releases published

Packages

No packages published