From df43a7fc96558508abc8445838d6183b395bbb93 Mon Sep 17 00:00:00 2001
From: cxa <1598828268@qq.com>
Date: Wed, 3 Apr 2019 16:32:35 +0800
Subject: [PATCH] fix bug
---
crawlab/config.py | 18 +-
crawlab/routes/base.py | 2 +
crawlab/routes/tasks.py | 3 +-
crawlab/tasks/scheduler.py | 1 +
crawlab/utils/log.py | 75 +
crawlab/utils/spider.py | 18 +-
.../juejin_spider 2.js | 82 +
.../5ca468298ffaed82c65f0f90/juejin_spider.js | 82 +
.../juejin_spider 2.js | 82 +
.../5ca46b508ffaed82c65f0fa0/juejin_spider.js | 82 +
docs/Architecture/App 2.md | 2 +
docs/Concept/Deploy 2.md | 6 +
docs/Examples/README 2.md | 2 +
docs/QuickStart/Installation 2.md | 22 +
docs/_book/Architecture/App 2.html | 436 +
docs/_book/Concept/Deploy 2.html | 438 +
docs/_book/Examples/index 2.html | 436 +
docs/_book/QuickStart/Installation 2.html | 447 +
.../fonts/fontawesome/FontAwesome 2.otf | Bin 0 -> 124988 bytes
.../fontsettings 2.js | 240 +
.../gitbook-plugin-highlight/ebook 2.css | 135 +
.../gitbook/gitbook-plugin-lunr/lunr.min 2.js | 7 +
.../gitbook-plugin-search/lunr.min 2.js | 7 +
.../gitbook-plugin-sharing/buttons 2.js | 90 +
.../apple-touch-icon-precomposed-152 2.png | Bin 0 -> 4817 bytes
docs/_book/img/crawlab-architecture 2.png | Bin 0 -> 47842 bytes
docs/img/crawlab-architecture 2.png | Bin 0 -> 47842 bytes
frontend/package-lock.json | 15537 ++++++++++++++++
frontend/src/api/login 2.js | 27 +
frontend/src/api/request 2.js | 46 +
frontend/src/assets/404_images/404 2.png | Bin 0 -> 98071 bytes
frontend/src/components/BackToTop/index 2.vue | 116 +
.../src/components/Breadcrumb/index 2.vue | 86 +
frontend/src/components/Charts/keyboard 2.vue | 156 +
.../src/components/Charts/mixins/resize 2.js | 32 +
.../src/components/Common/DialogView 2.vue | 162 +
frontend/src/components/DndList/index 2.vue | 157 +
.../src/components/DragSelect/index 2.vue | 61 +
frontend/src/components/Dropzone/index 2.vue | 297 +
frontend/src/components/ErrorLog/index 2.vue | 63 +
.../src/components/FileList/FileList 2.vue | 200 +
.../src/components/GithubCorner/index 2.vue | 51 +
frontend/src/components/Hamburger/index 2.vue | 42 +
.../src/components/HeaderSearch/index 2.vue | 187 +
.../src/components/ImageCropper/index 2.vue | 1420 ++
.../ImageCropper/utils/data2blob 2.js | 19 +
.../components/InfoView/NodeInfoView 2.vue | 73 +
.../src/components/JsonEditor/index 2.vue | 72 +
frontend/src/components/Kanban/index 2.vue | 89 +
.../src/components/LangSelect/index 2.vue | 32 +
frontend/src/components/MDinput/index 2.vue | 354 +
.../MarkdownEditor/defaultOptions 2.js | 31 +
.../components/Overview/NodeOverview 2.vue | 55 +
.../src/components/Pagination/index 2.vue | 100 +
frontend/src/components/PanThumb/index 2.vue | 140 +
.../src/components/Screenfull/index 2.vue | 51 +
.../src/components/ScrollPane/index 2.vue | 81 +
.../src/components/Share/dropdownMenu 2.vue | 100 +
.../src/components/SizeSelect/index 2.vue | 55 +
frontend/src/components/Sticky/index 2.vue | 88 +
frontend/src/components/SvgIcon/index 2.vue | 43 +
.../TableView/DeployTableView 2.vue | 73 +
.../components/TextHoverEffect/Mallki 2.vue | 113 +
.../src/components/ThemePicker/index 2.vue | 148 +
.../Tinymce/components/editorImage 2.vue | 103 +
frontend/src/components/TreeTable/eval 2.js | 29 +
.../src/components/Upload/singleImage 2.vue | 132 +
.../src/components/UploadExcel/index 2.vue | 136 +
frontend/src/i18n/en 2.js | 1 +
frontend/src/icons/index 2.js | 9 +
frontend/src/icons/svg/example 2.svg | 1 +
frontend/src/router/index 2.js | 205 +
frontend/src/store/getters 2.js | 9 +
frontend/src/store/modules/app 2.js | 43 +
frontend/src/styles/element-ui 2.scss | 30 +
frontend/src/utils/auth 2.js | 15 +
frontend/src/views/404 2.vue | 228 +
frontend/src/views/dashboard/index 2.vue | 32 +
frontend/src/views/deploy/DeployDetail 2.vue | 15 +
frontend/src/views/form/index 2.vue | 84 +
frontend/src/views/home/Home 2.vue | 160 +
frontend/src/views/layout/Layout 2.vue | 79 +
.../src/views/layout/components/AppMain 2.vue | 29 +
.../layout/components/Sidebar/Item 2.vue | 34 +
.../src/views/layout/mixin/ResizeHandler 2.js | 41 +
frontend/src/views/login/index 2.vue | 209 +
frontend/src/views/nested/menu1/index 2.vue | 7 +
.../views/nested/menu1/menu1-1/index 2.vue | 7 +
.../views/nested/menu1/menu1-2/index 2.vue | 7 +
.../menu1/menu1-2/menu1-2-1/index 2.vue | 5 +
.../menu1/menu1-2/menu1-2-2/index 2.vue | 5 +
.../views/nested/menu1/menu1-3/index 2.vue | 5 +
frontend/src/views/nested/menu2/index 2.vue | 5 +
frontend/src/views/node/NodeDetail 2.vue | 98 +
frontend/src/views/result/ResultDetail 2.vue | 95 +
.../src/views/schedule/ScheduleList 2.vue | 15 +
frontend/src/views/spider/SpiderDetail 2.vue | 99 +
frontend/src/views/table/index 2.vue | 78 +
frontend/src/views/task/TaskDetail 2.vue | 104 +
frontend/src/views/tree/index 2.vue | 77 +
spiders/article/article_spider 2.js | 61 +
spiders/csdn/csdn_spider 2.js | 83 +
spiders/discogs_aio_spider/README.md | 18 +
.../discogs_aio_spider/common/base_crawler.py | 129 +
spiders/discogs_aio_spider/config/__init__.py | 5 +
spiders/discogs_aio_spider/config/config.py | 8 +
spiders/discogs_aio_spider/db/__init__.py | 0
spiders/discogs_aio_spider/db/mongohelper.py | 124 +
.../discogs_aio_spider/decorators/__init__.py | 5 +
.../decorators/decorators.py | 30 +
.../discogs_details_spider.py | 169 +
.../discogs_index_spider.py | 141 +
.../discogs_aio_spider/discogs_seed_spider.py | 115 +
spiders/discogs_aio_spider/logger/__init__.py | 0
spiders/discogs_aio_spider/logger/log.py | 68 +
spiders/discogs_aio_spider/testdic.py | 13 +
spiders/discogs_aio_spider/utils/__init__.py | 0
.../discogs_aio_spider/utils/proxy_helper.py | 1 +
spiders/example_juejin/juejin/pipelines.py | 6 +-
.../juejin/spiders/__init__ 2.py | 4 +
spiders/example_juejin/start.py | 2 +
spiders/juejin_node/juejin_spider 2.js | 82 +
spiders/juejin_node/juejin_spider.js | 2 +-
spiders/segmentfault/segmentfault_spider 2.js | 81 +
124 files changed, 26428 insertions(+), 20 deletions(-)
create mode 100644 crawlab/utils/log.py
create mode 100644 deployfile/5ca468298ffaed82c65f0f90/juejin_spider 2.js
create mode 100644 deployfile/5ca468298ffaed82c65f0f90/juejin_spider.js
create mode 100644 deployfile/5ca46b508ffaed82c65f0fa0/juejin_spider 2.js
create mode 100644 deployfile/5ca46b508ffaed82c65f0fa0/juejin_spider.js
create mode 100644 docs/Architecture/App 2.md
create mode 100644 docs/Concept/Deploy 2.md
create mode 100644 docs/Examples/README 2.md
create mode 100644 docs/QuickStart/Installation 2.md
create mode 100644 docs/_book/Architecture/App 2.html
create mode 100644 docs/_book/Concept/Deploy 2.html
create mode 100644 docs/_book/Examples/index 2.html
create mode 100644 docs/_book/QuickStart/Installation 2.html
create mode 100644 docs/_book/gitbook/fonts/fontawesome/FontAwesome 2.otf
create mode 100644 docs/_book/gitbook/gitbook-plugin-fontsettings/fontsettings 2.js
create mode 100644 docs/_book/gitbook/gitbook-plugin-highlight/ebook 2.css
create mode 100644 docs/_book/gitbook/gitbook-plugin-lunr/lunr.min 2.js
create mode 100644 docs/_book/gitbook/gitbook-plugin-search/lunr.min 2.js
create mode 100644 docs/_book/gitbook/gitbook-plugin-sharing/buttons 2.js
create mode 100644 docs/_book/gitbook/images/apple-touch-icon-precomposed-152 2.png
create mode 100644 docs/_book/img/crawlab-architecture 2.png
create mode 100644 docs/img/crawlab-architecture 2.png
create mode 100644 frontend/package-lock.json
create mode 100644 frontend/src/api/login 2.js
create mode 100644 frontend/src/api/request 2.js
create mode 100644 frontend/src/assets/404_images/404 2.png
create mode 100644 frontend/src/components/BackToTop/index 2.vue
create mode 100644 frontend/src/components/Breadcrumb/index 2.vue
create mode 100644 frontend/src/components/Charts/keyboard 2.vue
create mode 100644 frontend/src/components/Charts/mixins/resize 2.js
create mode 100644 frontend/src/components/Common/DialogView 2.vue
create mode 100644 frontend/src/components/DndList/index 2.vue
create mode 100644 frontend/src/components/DragSelect/index 2.vue
create mode 100644 frontend/src/components/Dropzone/index 2.vue
create mode 100644 frontend/src/components/ErrorLog/index 2.vue
create mode 100644 frontend/src/components/FileList/FileList 2.vue
create mode 100644 frontend/src/components/GithubCorner/index 2.vue
create mode 100644 frontend/src/components/Hamburger/index 2.vue
create mode 100644 frontend/src/components/HeaderSearch/index 2.vue
create mode 100644 frontend/src/components/ImageCropper/index 2.vue
create mode 100755 frontend/src/components/ImageCropper/utils/data2blob 2.js
create mode 100644 frontend/src/components/InfoView/NodeInfoView 2.vue
create mode 100644 frontend/src/components/JsonEditor/index 2.vue
create mode 100644 frontend/src/components/Kanban/index 2.vue
create mode 100644 frontend/src/components/LangSelect/index 2.vue
create mode 100644 frontend/src/components/MDinput/index 2.vue
create mode 100644 frontend/src/components/MarkdownEditor/defaultOptions 2.js
create mode 100644 frontend/src/components/Overview/NodeOverview 2.vue
create mode 100644 frontend/src/components/Pagination/index 2.vue
create mode 100644 frontend/src/components/PanThumb/index 2.vue
create mode 100644 frontend/src/components/Screenfull/index 2.vue
create mode 100644 frontend/src/components/ScrollPane/index 2.vue
create mode 100644 frontend/src/components/Share/dropdownMenu 2.vue
create mode 100644 frontend/src/components/SizeSelect/index 2.vue
create mode 100644 frontend/src/components/Sticky/index 2.vue
create mode 100644 frontend/src/components/SvgIcon/index 2.vue
create mode 100644 frontend/src/components/TableView/DeployTableView 2.vue
create mode 100644 frontend/src/components/TextHoverEffect/Mallki 2.vue
create mode 100644 frontend/src/components/ThemePicker/index 2.vue
create mode 100644 frontend/src/components/Tinymce/components/editorImage 2.vue
create mode 100644 frontend/src/components/TreeTable/eval 2.js
create mode 100644 frontend/src/components/Upload/singleImage 2.vue
create mode 100644 frontend/src/components/UploadExcel/index 2.vue
create mode 100644 frontend/src/i18n/en 2.js
create mode 100644 frontend/src/icons/index 2.js
create mode 100644 frontend/src/icons/svg/example 2.svg
create mode 100644 frontend/src/router/index 2.js
create mode 100644 frontend/src/store/getters 2.js
create mode 100644 frontend/src/store/modules/app 2.js
create mode 100644 frontend/src/styles/element-ui 2.scss
create mode 100644 frontend/src/utils/auth 2.js
create mode 100644 frontend/src/views/404 2.vue
create mode 100644 frontend/src/views/dashboard/index 2.vue
create mode 100644 frontend/src/views/deploy/DeployDetail 2.vue
create mode 100644 frontend/src/views/form/index 2.vue
create mode 100644 frontend/src/views/home/Home 2.vue
create mode 100644 frontend/src/views/layout/Layout 2.vue
create mode 100644 frontend/src/views/layout/components/AppMain 2.vue
create mode 100644 frontend/src/views/layout/components/Sidebar/Item 2.vue
create mode 100644 frontend/src/views/layout/mixin/ResizeHandler 2.js
create mode 100644 frontend/src/views/login/index 2.vue
create mode 100644 frontend/src/views/nested/menu1/index 2.vue
create mode 100644 frontend/src/views/nested/menu1/menu1-1/index 2.vue
create mode 100644 frontend/src/views/nested/menu1/menu1-2/index 2.vue
create mode 100644 frontend/src/views/nested/menu1/menu1-2/menu1-2-1/index 2.vue
create mode 100644 frontend/src/views/nested/menu1/menu1-2/menu1-2-2/index 2.vue
create mode 100644 frontend/src/views/nested/menu1/menu1-3/index 2.vue
create mode 100644 frontend/src/views/nested/menu2/index 2.vue
create mode 100644 frontend/src/views/node/NodeDetail 2.vue
create mode 100644 frontend/src/views/result/ResultDetail 2.vue
create mode 100644 frontend/src/views/schedule/ScheduleList 2.vue
create mode 100644 frontend/src/views/spider/SpiderDetail 2.vue
create mode 100644 frontend/src/views/table/index 2.vue
create mode 100644 frontend/src/views/task/TaskDetail 2.vue
create mode 100644 frontend/src/views/tree/index 2.vue
create mode 100644 spiders/article/article_spider 2.js
create mode 100644 spiders/csdn/csdn_spider 2.js
create mode 100644 spiders/discogs_aio_spider/README.md
create mode 100644 spiders/discogs_aio_spider/common/base_crawler.py
create mode 100644 spiders/discogs_aio_spider/config/__init__.py
create mode 100644 spiders/discogs_aio_spider/config/config.py
create mode 100644 spiders/discogs_aio_spider/db/__init__.py
create mode 100644 spiders/discogs_aio_spider/db/mongohelper.py
create mode 100644 spiders/discogs_aio_spider/decorators/__init__.py
create mode 100644 spiders/discogs_aio_spider/decorators/decorators.py
create mode 100644 spiders/discogs_aio_spider/discogs_details_spider.py
create mode 100644 spiders/discogs_aio_spider/discogs_index_spider.py
create mode 100644 spiders/discogs_aio_spider/discogs_seed_spider.py
create mode 100644 spiders/discogs_aio_spider/logger/__init__.py
create mode 100644 spiders/discogs_aio_spider/logger/log.py
create mode 100644 spiders/discogs_aio_spider/testdic.py
create mode 100644 spiders/discogs_aio_spider/utils/__init__.py
create mode 100644 spiders/discogs_aio_spider/utils/proxy_helper.py
create mode 100644 spiders/example_juejin/juejin/spiders/__init__ 2.py
create mode 100644 spiders/example_juejin/start.py
create mode 100644 spiders/juejin_node/juejin_spider 2.js
create mode 100644 spiders/segmentfault/segmentfault_spider 2.js
diff --git a/crawlab/config.py b/crawlab/config.py
index b14cdaad..4a19dbfb 100644
--- a/crawlab/config.py
+++ b/crawlab/config.py
@@ -1,12 +1,16 @@
# project variables
-PROJECT_SOURCE_FILE_FOLDER = '/Users/yeqing/projects/crawlab/spiders'
-PROJECT_DEPLOY_FILE_FOLDER = '/var/crawlab'
-PROJECT_LOGS_FOLDER = '/var/logs/crawlab'
+# 爬虫源码路径
+PROJECT_SOURCE_FILE_FOLDER = '../spiders'
+
+# 爬虫部署路径
+PROJECT_DEPLOY_FILE_FOLDER = '../deployfile'
+
+PROJECT_LOGS_FOLDER = '../deployfile/logs'
PROJECT_TMP_FOLDER = '/tmp'
# celery variables
-BROKER_URL = 'redis://192.168.99.100:6379/0'
-CELERY_RESULT_BACKEND = 'mongodb://192.168.99.100:27017/'
+BROKER_URL = 'redis://127.0.0.1:6379/0'
+CELERY_RESULT_BACKEND = 'mongodb://127.0.0.1:27017/'
CELERY_MONGODB_BACKEND_SETTINGS = {
'database': 'crawlab_test',
'taskmeta_collection': 'tasks_celery',
@@ -18,11 +22,11 @@ CELERY_ENABLE_UTC = True
FLOWER_API_ENDPOINT = 'http://localhost:5555/api'
# database variables
-MONGO_HOST = '192.168.99.100'
+MONGO_HOST = '127.0.0.1'
MONGO_PORT = 27017
MONGO_DB = 'crawlab_test'
# flask variables
DEBUG = True
FLASK_HOST = '127.0.0.1'
-FLASK_PORT = 8000
+FLASK_PORT = 8000
\ No newline at end of file
diff --git a/crawlab/routes/base.py b/crawlab/routes/base.py
index da2a25df..89ec53d7 100644
--- a/crawlab/routes/base.py
+++ b/crawlab/routes/base.py
@@ -25,6 +25,8 @@ class BaseApi(Resource):
self.parser.add_argument(arg, type=type)
def get(self, id=None, action=None):
+ import pdb
+ pdb.set_trace()
args = self.parser.parse_args()
# action by id
diff --git a/crawlab/routes/tasks.py b/crawlab/routes/tasks.py
index 2a1449c4..7d0a6376 100644
--- a/crawlab/routes/tasks.py
+++ b/crawlab/routes/tasks.py
@@ -8,7 +8,7 @@ from db.manager import db_manager
from routes.base import BaseApi
from utils import jsonify
from utils.spider import get_spider_col_fields
-
+from utils.log import other
class TaskApi(BaseApi):
col_name = 'tasks'
@@ -27,6 +27,7 @@ class TaskApi(BaseApi):
'code': 400,
'error': 'action "%s" invalid' % action
}, 400
+ other.info(f"到这了{action},{id}")
return getattr(self, action)(id)
elif id is not None:
diff --git a/crawlab/tasks/scheduler.py b/crawlab/tasks/scheduler.py
index d4249bf7..31346f8e 100644
--- a/crawlab/tasks/scheduler.py
+++ b/crawlab/tasks/scheduler.py
@@ -20,6 +20,7 @@ class Scheduler(object):
scheduler = BackgroundScheduler(jobstores=jobstores)
def execute_spider(self, id: str):
+
r = requests.get('http://%s:%s/api/spiders/%s/on_crawl' % (
FLASK_HOST,
FLASK_PORT,
diff --git a/crawlab/utils/log.py b/crawlab/utils/log.py
new file mode 100644
index 00000000..4c852d0f
--- /dev/null
+++ b/crawlab/utils/log.py
@@ -0,0 +1,75 @@
+# -*- coding: utf-8 -*-
+# @Time : 2019-01-28 15:37
+# @Author : cxa
+# @File : log.py
+# @Software: PyCharm
+import os
+import logging
+import logging.config as log_conf
+import datetime
+import coloredlogs
+
+log_dir = os.path.dirname(os.path.dirname(__file__)) + '/logs'
+if not os.path.exists(log_dir):
+ os.mkdir(log_dir)
+today = datetime.datetime.now().strftime("%Y%m%d")
+
+log_path = os.path.join(log_dir, f'app_{today}.log')
+
+log_config = {
+ 'version': 1.0,
+ 'formatters': {
+ 'colored_console': {'()': 'coloredlogs.ColoredFormatter',
+ 'format': "%(asctime)s - %(name)s - %(levelname)s - %(message)s", 'datefmt': '%H:%M:%S'},
+ 'detail': {
+ 'format': '%(asctime)s - %(name)s - %(levelname)s - %(message)s',
+ 'datefmt': "%Y-%m-%d %H:%M:%S" # 如果不加这个会显示到毫秒。
+ },
+ 'simple': {
+ 'format': '%(name)s - %(levelname)s - %(message)s',
+ },
+ },
+ 'handlers': {
+ 'console': {
+ 'class': 'logging.StreamHandler', # 日志打印到屏幕显示的类。
+ 'level': 'INFO',
+ 'formatter': 'colored_console'
+ },
+ 'file': {
+ 'class': 'logging.handlers.RotatingFileHandler', # 日志打印到文件的类。
+ 'maxBytes': 1024 * 1024 * 1024, # 单个文件最大内存
+ 'backupCount': 1, # 备份的文件个数
+ 'filename': log_path, # 日志文件名
+ 'level': 'INFO', # 日志等级
+ 'formatter': 'detail', # 调用上面的哪个格式
+ 'encoding': 'utf-8', # 编码
+ },
+ },
+ 'loggers': {
+ 'crawler': {
+ 'handlers': ['console', 'file'], # 只打印屏幕
+ 'level': 'DEBUG', # 只显示错误的log
+ },
+ 'parser': {
+ 'handlers': ['file'],
+ 'level': 'INFO',
+ },
+ 'other': {
+ 'handlers': ['console', 'file'],
+ 'level': 'INFO',
+ },
+ 'storage': {
+ 'handlers': ['console', 'file'],
+ 'level': 'INFO',
+ }
+ }
+}
+
+log_conf.dictConfig(log_config)
+
+crawler = logging.getLogger('crawler')
+storage = logging.getLogger('storage')
+other = logging.getLogger('storage')
+coloredlogs.install(level='DEBUG', logger=crawler)
+coloredlogs.install(level='DEBUG', logger=storage)
+coloredlogs.install(level='DEBUG', logger=other)
diff --git a/crawlab/utils/spider.py b/crawlab/utils/spider.py
index 2ee3dd77..3e7a438f 100644
--- a/crawlab/utils/spider.py
+++ b/crawlab/utils/spider.py
@@ -9,13 +9,17 @@ def get_lang_by_stats(stats: dict) -> LangType:
:param stats: stats is generated by utils.file.get_file_suffix_stats
:return:
"""
- data = stats.items()
- data = sorted(data, key=lambda item: item[1])
- data = list(filter(lambda item: item[0] not in SUFFIX_IGNORE, data))
- top_suffix = data[-1][0]
- if FILE_SUFFIX_LANG_MAPPING.get(top_suffix) is not None:
- return FILE_SUFFIX_LANG_MAPPING.get(top_suffix)
- return LangType.OTHER
+ try:
+ data = stats.items()
+ data = sorted(data, key=lambda item: item[1])
+ data = list(filter(lambda item: item[0] not in SUFFIX_IGNORE, data))
+ top_suffix = data[-1][0]
+ if FILE_SUFFIX_LANG_MAPPING.get(top_suffix) is not None:
+ return FILE_SUFFIX_LANG_MAPPING.get(top_suffix)
+ return LangType.OTHER
+ except IndexError as e:
+ print(e.args,stats)
+
def get_spider_type(path: str) -> SpiderType:
diff --git a/deployfile/5ca468298ffaed82c65f0f90/juejin_spider 2.js b/deployfile/5ca468298ffaed82c65f0f90/juejin_spider 2.js
new file mode 100644
index 00000000..7a02f5a2
--- /dev/null
+++ b/deployfile/5ca468298ffaed82c65f0f90/juejin_spider 2.js
@@ -0,0 +1,82 @@
+const puppeteer = require('puppeteer');
+const MongoClient = require('mongodb').MongoClient;
+
+(async () => {
+ // browser
+ const browser = await (puppeteer.launch({
+ headless: true
+ }));
+
+ // define start url
+ const url = 'https://juejin.im';
+
+ // start a new page
+ const page = await browser.newPage();
+
+ // navigate to url
+ try {
+ await page.goto(url, {waitUntil: 'domcontentloaded'});
+ await page.waitFor(2000);
+ } catch (e) {
+ console.error(e);
+
+ // close browser
+ browser.close();
+
+ // exit code 1 indicating an error happened
+ code = 1;
+ process.emit("exit ");
+ process.reallyExit(code);
+
+ return
+ }
+
+ // scroll down to fetch more data
+ for (let i = 0; i < 100; i++) {
+ console.log('Pressing PageDown...');
+ await page.keyboard.press('PageDown', 200);
+ await page.waitFor(100);
+ }
+
+ // scrape data
+ const results = await page.evaluate(() => {
+ let results = [];
+ document.querySelectorAll('.entry-list > .item').forEach(el => {
+ if (!el.querySelector('.title')) return;
+ results.push({
+ url: 'https://juejin.com' + el.querySelector('.title').getAttribute('href'),
+ title: el.querySelector('.title').innerText
+ });
+ });
+ return results;
+ });
+
+ // open database connection
+ const client = await MongoClient.connect('mongodb://192.168.99.100:27017');
+ let db = await client.db('crawlab_test');
+ const colName = process.env.CRAWLAB_COLLECTION || 'results_juejin';
+ const taskId = process.env.CRAWLAB_TASK_ID;
+ const col = db.collection(colName);
+
+ // save to database
+ for (let i = 0; i < results.length; i++) {
+ // de-duplication
+ const r = await col.findOne({url: results[i]});
+ if (r) continue;
+
+ // assign taskID
+ results[i].task_id = taskId;
+ results[i].source = 'juejin';
+
+ // insert row
+ await col.insertOne(results[i]);
+ }
+
+ console.log(`results.length: ${results.length}`);
+
+ // close database connection
+ client.close();
+
+ // shutdown browser
+ browser.close();
+})();
\ No newline at end of file
diff --git a/deployfile/5ca468298ffaed82c65f0f90/juejin_spider.js b/deployfile/5ca468298ffaed82c65f0f90/juejin_spider.js
new file mode 100644
index 00000000..3cf2bcac
--- /dev/null
+++ b/deployfile/5ca468298ffaed82c65f0f90/juejin_spider.js
@@ -0,0 +1,82 @@
+const puppeteer = require('puppeteer');
+const MongoClient = require('mongodb').MongoClient;
+
+(async () => {
+ // browser
+ const browser = await (puppeteer.launch({
+ headless: true
+ }));
+
+ // define start url
+ const url = 'https://juejin.im';
+
+ // start a new page
+ const page = await browser.newPage();
+
+ // navigate to url
+ try {
+ await page.goto(url, {waitUntil: 'domcontentloaded'});
+ await page.waitFor(2000);
+ } catch (e) {
+ console.error(e);
+
+ // close browser
+ browser.close();
+
+ // exit code 1 indicating an error happened
+ code = 1;
+ process.emit("exit ");
+ process.reallyExit(code);
+
+ return
+ }
+
+ // scroll down to fetch more data
+ for (let i = 0; i < 100; i++) {
+ console.log('Pressing PageDown...');
+ await page.keyboard.press('PageDown', 200);
+ await page.waitFor(100);
+ }
+
+ // scrape data
+ const results = await page.evaluate(() => {
+ let results = [];
+ document.querySelectorAll('.entry-list > .item').forEach(el => {
+ if (!el.querySelector('.title')) return;
+ results.push({
+ url: 'https://juejin.com' + el.querySelector('.title').getAttribute('href'),
+ title: el.querySelector('.title').innerText
+ });
+ });
+ return results;
+ });
+
+ // open database connection
+ const client = await MongoClient.connect('mongodb://127.0.0.1:27017');
+ let db = await client.db('crawlab_test');
+ const colName = process.env.CRAWLAB_COLLECTION || 'results_juejin';
+ const taskId = process.env.CRAWLAB_TASK_ID;
+ const col = db.collection(colName);
+
+ // save to database
+ for (let i = 0; i < results.length; i++) {
+ // de-duplication
+ const r = await col.findOne({url: results[i]});
+ if (r) continue;
+
+ // assign taskID
+ results[i].task_id = taskId;
+ results[i].source = 'juejin';
+
+ // insert row
+ await col.insertOne(results[i]);
+ }
+
+ console.log(`results.length: ${results.length}`);
+
+ // close database connection
+ client.close();
+
+ // shutdown browser
+ browser.close();
+})();
\ No newline at end of file
diff --git a/deployfile/5ca46b508ffaed82c65f0fa0/juejin_spider 2.js b/deployfile/5ca46b508ffaed82c65f0fa0/juejin_spider 2.js
new file mode 100644
index 00000000..7a02f5a2
--- /dev/null
+++ b/deployfile/5ca46b508ffaed82c65f0fa0/juejin_spider 2.js
@@ -0,0 +1,82 @@
+const puppeteer = require('puppeteer');
+const MongoClient = require('mongodb').MongoClient;
+
+(async () => {
+ // browser
+ const browser = await (puppeteer.launch({
+ headless: true
+ }));
+
+ // define start url
+ const url = 'https://juejin.im';
+
+ // start a new page
+ const page = await browser.newPage();
+
+ // navigate to url
+ try {
+ await page.goto(url, {waitUntil: 'domcontentloaded'});
+ await page.waitFor(2000);
+ } catch (e) {
+ console.error(e);
+
+ // close browser
+ browser.close();
+
+ // exit code 1 indicating an error happened
+ code = 1;
+ process.emit("exit ");
+ process.reallyExit(code);
+
+ return
+ }
+
+ // scroll down to fetch more data
+ for (let i = 0; i < 100; i++) {
+ console.log('Pressing PageDown...');
+ await page.keyboard.press('PageDown', 200);
+ await page.waitFor(100);
+ }
+
+ // scrape data
+ const results = await page.evaluate(() => {
+ let results = [];
+ document.querySelectorAll('.entry-list > .item').forEach(el => {
+ if (!el.querySelector('.title')) return;
+ results.push({
+ url: 'https://juejin.com' + el.querySelector('.title').getAttribute('href'),
+ title: el.querySelector('.title').innerText
+ });
+ });
+ return results;
+ });
+
+ // open database connection
+ const client = await MongoClient.connect('mongodb://192.168.99.100:27017');
+ let db = await client.db('crawlab_test');
+ const colName = process.env.CRAWLAB_COLLECTION || 'results_juejin';
+ const taskId = process.env.CRAWLAB_TASK_ID;
+ const col = db.collection(colName);
+
+ // save to database
+ for (let i = 0; i < results.length; i++) {
+ // de-duplication
+ const r = await col.findOne({url: results[i]});
+ if (r) continue;
+
+ // assign taskID
+ results[i].task_id = taskId;
+ results[i].source = 'juejin';
+
+ // insert row
+ await col.insertOne(results[i]);
+ }
+
+ console.log(`results.length: ${results.length}`);
+
+ // close database connection
+ client.close();
+
+ // shutdown browser
+ browser.close();
+})();
\ No newline at end of file
diff --git a/deployfile/5ca46b508ffaed82c65f0fa0/juejin_spider.js b/deployfile/5ca46b508ffaed82c65f0fa0/juejin_spider.js
new file mode 100644
index 00000000..3cf2bcac
--- /dev/null
+++ b/deployfile/5ca46b508ffaed82c65f0fa0/juejin_spider.js
@@ -0,0 +1,82 @@
+const puppeteer = require('puppeteer');
+const MongoClient = require('mongodb').MongoClient;
+
+(async () => {
+ // browser
+ const browser = await (puppeteer.launch({
+ headless: true
+ }));
+
+ // define start url
+ const url = 'https://juejin.im';
+
+ // start a new page
+ const page = await browser.newPage();
+
+ // navigate to url
+ try {
+ await page.goto(url, {waitUntil: 'domcontentloaded'});
+ await page.waitFor(2000);
+ } catch (e) {
+ console.error(e);
+
+ // close browser
+ browser.close();
+
+ // exit code 1 indicating an error happened
+ code = 1;
+ process.emit("exit ");
+ process.reallyExit(code);
+
+ return
+ }
+
+ // scroll down to fetch more data
+ for (let i = 0; i < 100; i++) {
+ console.log('Pressing PageDown...');
+ await page.keyboard.press('PageDown', 200);
+ await page.waitFor(100);
+ }
+
+ // scrape data
+ const results = await page.evaluate(() => {
+ let results = [];
+ document.querySelectorAll('.entry-list > .item').forEach(el => {
+ if (!el.querySelector('.title')) return;
+ results.push({
+ url: 'https://juejin.com' + el.querySelector('.title').getAttribute('href'),
+ title: el.querySelector('.title').innerText
+ });
+ });
+ return results;
+ });
+
+ // open database connection
+ const client = await MongoClient.connect('mongodb://127.0.0.1:27017');
+ let db = await client.db('crawlab_test');
+ const colName = process.env.CRAWLAB_COLLECTION || 'results_juejin';
+ const taskId = process.env.CRAWLAB_TASK_ID;
+ const col = db.collection(colName);
+
+ // save to database
+ for (let i = 0; i < results.length; i++) {
+ // de-duplication
+ const r = await col.findOne({url: results[i]});
+ if (r) continue;
+
+ // assign taskID
+ results[i].task_id = taskId;
+ results[i].source = 'juejin';
+
+ // insert row
+ await col.insertOne(results[i]);
+ }
+
+ console.log(`results.length: ${results.length}`);
+
+ // close database connection
+ client.close();
+
+ // shutdown browser
+ browser.close();
+})();
\ No newline at end of file
diff --git a/docs/Architecture/App 2.md b/docs/Architecture/App 2.md
new file mode 100644
index 00000000..5d5681fd
--- /dev/null
+++ b/docs/Architecture/App 2.md
@@ -0,0 +1,2 @@
+# App
+
diff --git a/docs/Concept/Deploy 2.md b/docs/Concept/Deploy 2.md
new file mode 100644
index 00000000..12f55ebf
--- /dev/null
+++ b/docs/Concept/Deploy 2.md
@@ -0,0 +1,6 @@
+# 部署
+
+所有爬虫在运行前需要被部署当相应当节点中。
+
+部署时,爬虫会被打包到相应的目录中,方便环境隔离,开发环境的爬虫和生产环境的爬虫需要打包部署来实现隔离。
+
diff --git a/docs/Examples/README 2.md b/docs/Examples/README 2.md
new file mode 100644
index 00000000..65afe604
--- /dev/null
+++ b/docs/Examples/README 2.md
@@ -0,0 +1,2 @@
+# Examples
+
diff --git a/docs/QuickStart/Installation 2.md b/docs/QuickStart/Installation 2.md
new file mode 100644
index 00000000..3fce3e1c
--- /dev/null
+++ b/docs/QuickStart/Installation 2.md
@@ -0,0 +1,22 @@
+# 安装
+
+最快安装Crawlab的方式是克隆一份代码到本地
+
+```bash
+git clone https://github.com/tikazyq/crawlab
+```
+
+安装类库
+
+```bash
+# 安装后台类库
+pip install -r requirements.txt
+```
+
+```bash
+# 安装前台类库
+cd frontend
+npm install
+```
+
+
diff --git a/docs/_book/Architecture/App 2.html b/docs/_book/Architecture/App 2.html
new file mode 100644
index 00000000..0123e0e6
--- /dev/null
+++ b/docs/_book/Architecture/App 2.html
@@ -0,0 +1,436 @@
+
+
+
+
+
+
+ App · GitBook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
results matching ""
+
+
+
+
+
+
No results matching ""
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/_book/Concept/Deploy 2.html b/docs/_book/Concept/Deploy 2.html
new file mode 100644
index 00000000..d7d110db
--- /dev/null
+++ b/docs/_book/Concept/Deploy 2.html
@@ -0,0 +1,438 @@
+
+
+
+
+
+
+ 部署 · GitBook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 部署
+所有爬虫在运行前需要被部署当相应当节点中。
+部署时,爬虫会被打包到相应的目录中,方便环境隔离,开发环境的爬虫和生产环境的爬虫需要打包部署来实现隔离。
+
+
+
+
+
+
+
+
+
results matching ""
+
+
+
+
+
+
No results matching ""
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/_book/Examples/index 2.html b/docs/_book/Examples/index 2.html
new file mode 100644
index 00000000..285296a5
--- /dev/null
+++ b/docs/_book/Examples/index 2.html
@@ -0,0 +1,436 @@
+
+
+
+
+
+
+ Examples · GitBook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
results matching ""
+
+
+
+
+
+
No results matching ""
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/_book/QuickStart/Installation 2.html b/docs/_book/QuickStart/Installation 2.html
new file mode 100644
index 00000000..fcbd254f
--- /dev/null
+++ b/docs/_book/QuickStart/Installation 2.html
@@ -0,0 +1,447 @@
+
+
+
+
+
+
+ 安装 · GitBook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 安装
+最快安装Crawlab的方式是克隆一份代码到本地
+git clone https://github.com/tikazyq/crawlab
+
+安装类库
+
+pip install -r requirements.txt
+
+
+cd frontend
+npm install
+
+
+
+
+
+
+
+
+
+
results matching ""
+
+
+
+
+
+
No results matching ""
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/_book/gitbook/fonts/fontawesome/FontAwesome 2.otf b/docs/_book/gitbook/fonts/fontawesome/FontAwesome 2.otf
new file mode 100644
index 0000000000000000000000000000000000000000..d4de13e832d567ff29c5b4e9561b8c370348cc9c
GIT binary patch
literal 124988
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