diff --git a/CHANGELOG.md b/CHANGELOG.md index cc910ea9..8d4cfe09 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +# 0.2.4 (unreleased) +- **Documentation**: Better and much more detailed documentation. + + # 0.2.3 (2019-06-12) ### Features / Enhancement - **Docker**: User can run docker image to speed up deployment. diff --git a/gitbook/Installation/Direct.md b/gitbook/Installation/Direct.md new file mode 100644 index 00000000..c0cc3fc4 --- /dev/null +++ b/gitbook/Installation/Direct.md @@ -0,0 +1,88 @@ +## 直接部署 + +直接部署是之前没有Docker时的部署方式,相对于Docker部署来说有些繁琐。但了解如何直接部署可以帮助更深入地理解Docker是如何构建Crawlab镜像的。这里简单介绍一下。 + +### 拉取代码 + +首先是将github上的代码拉取到本地。 + +```bash +git clone https://github.com/tikazyq/crawlab +``` + +### 安装 + +安装前端所需库。 + +```bash +npm install -g yarn pm2 +cd frontend +yarn install +``` + +安装后端所需库。 + +```bash +cd ../crawlab +pip install -r requirements +``` + +### 配置 + +分别配置前端配置文件`./frontend/.env.production`和后端配置文件`./crawlab/config/config.py`。分别需要对部署后API地址以及数据库地址进行配置。 + +### 构建 + +这里的构建是指前端构建,需要执行以下命令。 + +```bash +cd ../frontend +npm run build:prod +``` + +构建完成后,会在`./frontend`目录下创建一个`dist`文件夹,里面是打包好后的静态文件。 + +### Nginx + +安装`nginx`,在`ubuntu 16.04`是以下命令。 + +```bash +sudo apt-get install nginx +``` + +添加`/etc/nginx/conf.d/crawlab.conf`文件,输入以下内容。 + +``` +server { + listen 8080; + server_name dev.crawlab.com; + root /home/yeqing/jenkins_home/workspace/crawlab_develop/frontend/dist; + index index.html; +} +``` + +其中,`root`是静态文件的根目录,这里是`npm`打包好后的静态文件。 + +现在,只需要启动`nginx`服务就完成了启动前端服务。 + +```bash +nginx reload +``` + +### 启动服务 + +这里是指启动后端服务。我们用`pm2`来管理进程。执行以下命令。 + +```bash +pm2 start app.py # API服务 +pm2 start worker.py # Worker +pm2 start flower.py # Flower +``` + +这样,`pm2`会启动3个守护进程来管理这3个服务。我们如果想看后端服务的日志的话,可以执行以下命令。 + +```bash +pm2 logs [app] +``` + +然后在浏览器中输入`http://localhost:8080`就可以看到界面了。 \ No newline at end of file diff --git a/gitbook/Installation/Docker.md b/gitbook/Installation/Docker.md new file mode 100644 index 00000000..fc4c017c --- /dev/null +++ b/gitbook/Installation/Docker.md @@ -0,0 +1,158 @@ +## Docker安装部署 + +这应该是部署应用的最方便也是最节省时间的方式了。在最近的一次版本更新[v0.2.3](https://github.com/tikazyq/crawlab/releases/tag/v0.2.3)中,我们发布了Docker功能,让大家可以利用Docker来轻松部署Crawlab。下面将一步一步介绍如何使用Docker来部署Crawlab。 + +对Docker不了解的开发者,可以参考一下这篇文章([9102 年了,学点 Docker 知识](https://juejin.im/post/5c2c69cee51d450d9707236e))做进一步了解。简单来说,Docker可以利用已存在的镜像帮助构建一些常用的服务和应用,例如Nginx、MongoDB、Redis等等。用Docker运行一个MongoDB服务仅需`docker run -d --name mongo -p 27017:27017 mongo`一行命令。如何安装Docker跟操作系统有关,这里就不展开讲了,需要的同学自行百度一下相关教程。 + +### 下载镜像 + +我们已经在[DockerHub](https://hub.docker.com/r/tikazyq/crawlab)上构建了Crawlab的镜像,开发者只需要将其pull下来使用。在pull 镜像之前,我们需要配置一下镜像源。因为我们在墙内,使用原有的镜像源速度非常感人,因此将使用DockerHub在国内的加速器。创建`/etc/docker/daemon.json`文件,在其中输入如下内容。 + +```json +{ + "registry-mirrors": ["https://registry.docker-cn.com"] +} +``` + +这样的话,pull镜像的速度会比不改变镜像源的速度快很多。 + +执行以下命令将Crawlab的镜像下载下来。镜像大小大概在几百兆,因此下载需要几分钟时间。 + +```bash +docker pull tikazyq/crawlab:latest +``` + +### 更改配置文件 + +拷贝一份后端配置文件`./crawlab/config/config.py`以及前端配置文件`./frontend/.env.production`到某一个地方。例如我的例子,分别为`/home/yeqing/config.py`和`/home/yeqing/.env.production`。 + +更改后端配置文件`config.py`,将MongoDB、Redis的指向IP更改为自己数据的值。注意,容器中对应的宿主机的IP地址不是`localhost`,而是`172.17.0.1`(当然也可以用network来做,只是稍微麻烦一些)。更改前端配置文件`.env.production`,将API地址`VUE_APP_BASE_URL`更改为宿主机所在的IP地址,例如`http://192.168.0.8:8000`,这将是前端调用API会用到的URL。 + +### 运行Docker容器 + +更改好配置文件之后,接下来就是运行容器了。执行以下命令来启动容器。 + +```bash +docker run -d --rm --name crawlab \ + -p 8080:8080 \ + -p 8000:8000 \ + -v /home/yeqing/.env.production:/opt/crawlab/frontend/.env.production \ + -v /home/yeqing/config.py:/opt/crawlab/crawlab/config/config.py \ + tikazyq/crawlab master +``` + +其中,我们映射了8080端口(Nginx前端静态文件)以及8000端口(后端API)到宿主机。另外还将前端配置文件`/home/yeqing/.env.production`和后端配置文件`/home/yeqing/config.py`映射到了容器相应的目录下。传入参数`master`是代表该启动方式为主机启动模式,也就是所有服务(前端、Api、Flower、Worker)都会启动。另外一个模式是`worker`模式,只会启动必要的Api和Worker服务,这个对于分布式部署比较有用。等待大约20-30秒的时间来build前端静态文件,之后就可以打开Crawlab界面地址地址看到界面了。界面地址默认为`http://localhost:8080`。 + +![](https://user-gold-cdn.xitu.io/2019/6/12/16b4c3ed5dcd6cfc?w=2532&h=1300&f=png&s=146531) + +### Docker-Compose + +当然,也可以用`docker-compose`的方式来部署。`docker-compose`是一个集群管理方式,可以利用名为`docker-compose.yml`的`yaml`文件来定义需要启动的容器,可以是单个,也可以(通常)是多个的。Crawlab的`docker-compose.yml`定义如下。 + +```yaml +version: '3.3' +services: + master: + image: tikazyq/crawlab:latest + container_name: crawlab + volumns: + - /home/yeqing/config.py:/opt/crawlab/crawlab/config/config.py # 后端配置文件 + - /home/yeqing/.env.production:/opt/crawlab/frontend/.env.production # 前端配置文件 + ports: + - "8080:8080" # nginx + - "8000:8000" # app + depends_on: + - mongo + - redis + entrypoint: + - /bin/sh + - /opt/crawlab/docker_init.sh + - master + mongo: + image: mongo:latest + restart: always + ports: + - "27017:27017" + redis: + image: redis:latest + restart: always + ports: + - "6379:6379" +``` + +这里先定义了`master`节点,也就是Crawlab的主节点。`master`依赖于`mongo`和`redis`容器,因此在启动之前会同时启动`mongo`和`redis`容器。这样就不需要单独配置`mongo`和`redis`服务了,大大节省了环境配置的时间。 + +安装`docker-compose`也很简单,大家去网上百度一下就可以了。 + +安装完`docker-compose`和定义好`docker-compose.yml`后,只需要运行以下命令就可以启动Crawlab。 + +```bash +docker-compose up +``` + +同样,在浏览器中输入`http://localhost:8080`就可以看到界面。 + +### 多节点模式 + +`docker-compose`的方式很适合多节点部署,在原有的`master`基础上增加几个`worker`节点,达到多节点部署的目的。将`docker-compose.yml`更改为如下内容。 + +```yaml +version: '3.3' +services: + master: + image: tikazyq/crawlab:latest + container_name: crawlab + volumns: + - /home/yeqing/config.master.py:/opt/crawlab/crawlab/config/config.py # 后端配置文件 + - /home/yeqing/.env.production.master:/opt/crawlab/frontend/.env.production # 前端配置文件 + ports: + - "8080:8080" # nginx + - "8000:8000" # app + depends_on: + - mongo + - redis + entrypoint: + - /bin/sh + - /opt/crawlab/docker_init.sh + - master + worker1: + image: tikazyq/crawlab:latest + volumns: + - /home/yeqing/config.worker.py:/opt/crawlab/crawlab/config/config.py # 后端配置文件 + - /home/yeqing/.env.production.worker:/opt/crawlab/frontend/.env.production # 前端配置文件 + ports: + - "8001:8000" # app + depends_on: + - mongo + - redis + entrypoint: + - /bin/sh + - /opt/crawlab/docker_init.sh + - worker + worker2: + image: tikazyq/crawlab:latest + volumns: + - /home/yeqing/config.worker.py:/opt/crawlab/crawlab/config/config.py # 后端配置文件 + - /home/yeqing/.env.production.worker:/opt/crawlab/frontend/.env.production # 前端配置文件 + ports: + - "8002:8000" # app + depends_on: + - mongo + - redis + entrypoint: + - /bin/sh + - /opt/crawlab/docker_init.sh + - worker + mongo: + image: mongo:latest + restart: always + ports: + - "27017:27017" + redis: + image: redis:latest + restart: always + ports: + - "6379:6379" +``` + +这里启动了多增加了两个`worker`节点,以`worker`模式启动。这样,多节点部署,也就是分布式部署就完成了。 \ No newline at end of file diff --git a/gitbook/Installation/Preview.md b/gitbook/Installation/Preview.md new file mode 100644 index 00000000..b37cebd4 --- /dev/null +++ b/gitbook/Installation/Preview.md @@ -0,0 +1,9 @@ +## 预览模式 + +**预览模式**是一种让用户比较快的上手的一种部署模式。跟**直接部署**类似,但不用经过`构建`、`nginx`和`启动服务`的步骤。在启动时只需要执行以下命令就可以了。相较于直接部署来说方便一些。 + +```bash +python manage.py serve +``` + +该模式同样会启动3个后端服务和1个前端服务。前端服务是通过`npm run serve`来进行的,因此是开发者模式。**注意:强烈不建议在生产环境中用预览模式**。预览模式只是让开发者快速体验Crawlab以及调试代码问题的一种方式,而不是用作生产环境部署的。 \ No newline at end of file diff --git a/gitbook/Installation/README.md b/gitbook/Installation/README.md new file mode 100644 index 00000000..1f3bfabe --- /dev/null +++ b/gitbook/Installation/README.md @@ -0,0 +1,4 @@ +本小节将介绍三种安装Docker的方式: +1. [Docker](/Installation/Docker.md) +2. [直接部署](/Installation/Direct.md) +3. [预览模式](/Installation/Preview.md) \ No newline at end of file diff --git a/gitbook/QuickStart/Installation.md b/gitbook/QuickStart/Installation.md deleted file mode 100644 index 3fce3e1c..00000000 --- a/gitbook/QuickStart/Installation.md +++ /dev/null @@ -1,22 +0,0 @@ -# 安装 - -最快安装Crawlab的方式是克隆一份代码到本地 - -```bash -git clone https://github.com/tikazyq/crawlab -``` - -安装类库 - -```bash -# 安装后台类库 -pip install -r requirements.txt -``` - -```bash -# 安装前台类库 -cd frontend -npm install -``` - - diff --git a/gitbook/QuickStart/README.md b/gitbook/QuickStart/README.md deleted file mode 100644 index 6a6ea76f..00000000 --- a/gitbook/QuickStart/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# 快速开始 - -- [安装](Installation.md) -- [运行](Run.md) diff --git a/gitbook/QuickStart/Run.md b/gitbook/QuickStart/Run.md deleted file mode 100644 index bd6b9ba9..00000000 --- a/gitbook/QuickStart/Run.md +++ /dev/null @@ -1,53 +0,0 @@ -# 运行 - -在运行之前需要对Crawlab进行一些配置,配置文件为`config.py`。 - -```python -# project variables -PROJECT_SOURCE_FILE_FOLDER = '/Users/yeqing/projects/crawlab/spiders' # 爬虫源码根目录 -PROJECT_DEPLOY_FILE_FOLDER = '/var/crawlab' # 爬虫部署根目录 -PROJECT_LOGS_FOLDER = '/var/logs/crawlab' # 日志目录 -PROJECT_TMP_FOLDER = '/tmp' # 临时文件目录 - -# celery variables -BROKER_URL = 'redis://192.168.99.100:6379/0' # 中间者URL,连接redis -CELERY_RESULT_BACKEND = 'mongodb://192.168.99.100:27017/' # CELERY后台URL -CELERY_MONGODB_BACKEND_SETTINGS = { - 'database': 'crawlab_test', - 'taskmeta_collection': 'tasks_celery', -} -CELERY_TIMEZONE = 'Asia/Shanghai' -CELERY_ENABLE_UTC = True - -# flower variables -FLOWER_API_ENDPOINT = 'http://localhost:5555/api' # Flower服务地址 - -# database variables -MONGO_HOST = '192.168.99.100' -MONGO_PORT = 27017 -MONGO_DB = 'crawlab_test' - -# flask variables -DEBUG = True -FLASK_HOST = '127.0.0.1' -FLASK_PORT = 8000 -``` - -启动后端API,也就是一个Flask App,可以直接启动,或者用gunicorn代替。 - -```bash -python manage.py app -``` - -启动本地Worker。在其他节点中如果想只是想执行任务的话,只需要启动这一个服务就可以了。 - -```bash -python manage.py worker -``` - -启动前端服务器。 - -```bash -cd frontend -npm run serve -``` diff --git a/gitbook/README.md b/gitbook/README.md index 613decad..6112b7cc 100644 --- a/gitbook/README.md +++ b/gitbook/README.md @@ -1,167 +1,14 @@ # Crawlab 基于Celery的爬虫分布式爬虫管理平台,支持多种编程语言以及多种爬虫框架. -[查看演示 Demo](http://139.129.230.98:8080) +[查看演示 Demo](http://114.67.75.98:8080) -[English Documentation](https://github.com/tikazyq/crawlab/blob/master/README.md) +Crawlab是基于Celery的分布式爬虫管理平台,可以集成任何语言和任何框架。 -## 要求 -- Python3 -- MongoDB -- Redis +项目自今年三月份上线以来受到爬虫爱好者们和开发者们的好评,不少使用者还表示会用Crawlab搭建公司的爬虫平台。经过近3个月的迭代,我们陆续上线了定时任务、数据分析、网站信息、可配置爬虫、自动提取字段、下载结果、上传爬虫等功能,将Crawlab打造得更加实用,更加全面,能够真正帮助用户解决爬虫管理困难的问题。 -## 安装 +Crawlab主要解决的是大量爬虫管理困难的问题,例如需要监控上百个网站的参杂scrapy和selenium的项目不容易做到同时管理,而且命令行管理的成本非常高,还容易出错。Crawlab支持任何语言和任何框架,配合任务调度、任务监控,很容易做到对成规模的爬虫项目进行有效监控管理。 -```bash -# 安装后台类库 -pip install -r requirements.txt -``` +本使用手册会帮助您解决在安装使用Crawlab遇到的任何问题。 -```bash -# 安装前台类库 -cd frontend -npm install -``` - -## 配置 - -请更改配置文件`config.py`,配置API和数据库连接. - -## 快速开始 -```bash -# 启动后端API -python app.py - -# 启动Flower服务 -python ./bin/run_flower.py - -# 启动worker -python ./bin/run_worker.py -``` - -```bash -# 运行前端 -cd frontend -npm run serve -``` - -## 截图 - -#### 首页 -![home](./img/screenshot-home.png) - -#### 爬虫列表 - -![spider-list](./img/screenshot-spiders.png) - -#### 爬虫详情 - 概览 - -![spider-list](./img/screenshot-spider-detail-overview.png) - -#### 任务详情 - 抓取结果 - -![spider-list](./img/screenshot-task-detail-results.png) - -## 架构 - -Crawlab的架构跟Celery非常相似,但是加入了包括前端、爬虫、Flower在内的额外模块,以支持爬虫管理的功能。 - -![crawlab-architecture](./img/crawlab-architecture.png) - -### 节点 - -节点其实就是Celery中的Worker。一个节点运行时会连接到一个任务队列(例如Redis)来接收和运行任务。所有爬虫需要在运行时被部署到节点上,用户在部署前需要定义节点的IP地址和端口。 - -### 爬虫 - -##### 自动发现 - -在`config.py`文件中,修改变量`PROJECT_SOURCE_FILE_FOLDER`作为爬虫项目所在的目录。Crawlab后台程序会自动发现这些爬虫项目并储存到数据库中。是不是很方便? - -##### 部署爬虫 - -所有爬虫需要在抓取前被部署当相应当节点中。在"爬虫详情"页面点击"Deploy"按钮,爬虫将被部署到所有有效到节点中。 - -##### 运行爬虫 - -部署爬虫之后,你可以在"爬虫详情"页面点击"Run"按钮来启动爬虫。一个爬虫任务将被触发,你可以在任务列表页面中看到这个任务。 - -### 任务 - -任务被触发并被节点执行。用户可以在任务详情页面中看到任务到状态、日志和抓取结果。 - -### 后台应用 - -这是一个Flask应用,提供了必要的API来支持常规操作,例如CRUD、爬虫部署以及任务运行。每一个节点需要启动Flask应用来支持爬虫部署。运行`python manage.py app`或`python ./bin/run_app.py`来启动应用。 - -### 中间者 - -中间者跟Celery中定义的一样,作为运行异步任务的队列。 - -### 前端 - -前端其实就是一个基于[Vue-Element-Admin](https://github.com/PanJiaChen/vue-element-admin)的单页应用。其中重用了很多Element-UI的控件来支持相应的展示。 - -## 与其他框架的集成 - -任务是利用python的`subprocess`模块中的`Popen`来实现的。任务ID将以环境变量`CRAWLAB_TASK_ID`的形式存在于爬虫任务运行的进程中,并以此来关联抓取数据。 - -在你的爬虫程序中,你需要将`CRAWLAB_TASK_ID`的值以`task_id`作为可以存入数据库中。这样Crawlab就直到如何将爬虫任务与抓取数据关联起来了。当前,Crawlab只支持MongoDB。 - -### Scrapy - -以下是Crawlab跟Scrapy集成的例子,利用了Crawlab传过来的task_id和collection_name。 - -```python -import os -from pymongo import MongoClient - -MONGO_HOST = '192.168.99.100' -MONGO_PORT = 27017 -MONGO_DB = 'crawlab_test' - -# scrapy example in the pipeline -class JuejinPipeline(object): - mongo = MongoClient(host=MONGO_HOST, port=MONGO_PORT) - db = mongo[MONGO_DB] - col_name = os.environ.get('CRAWLAB_COLLECTION') - if not col_name: - col_name = 'test' - col = db[col_name] - - def process_item(self, item, spider): - item['task_id'] = os.environ.get('CRAWLAB_TASK_ID') - self.col.save(item) - return item -``` - -## 与其他框架比较 - -限制以及有一些爬虫管理框架了,因此为啥还要用Crawlab? - -因为很多现有当平台都依赖于Scrapyd,限制了爬虫的编程语言以及框架,爬虫工程师只能用scrapy和python。当然,scrapy是非常优秀的爬虫框架,但是它不能做一切事情。 - -Crawlab使用起来很方便,也很通用,可以适用于几乎任何主流语言和框架。它还有一个精美的前端界面,让用户可以方便的管理和运行爬虫。 - -|框架 | 类型 | 分布式 | 前端 | 依赖于Scrapyd | -|:---:|:---:|:---:|:---:|:---:| -| [Crawlab](https://github.com/tikazyq/crawlab) | 管理平台 | Y | Y | N -| [Gerapy](https://github.com/Gerapy/Gerapy) | 管理平台 | Y | Y | Y -| [SpiderKeeper](https://github.com/DormyMo/SpiderKeeper) | 管理平台 | Y | Y | Y -| [ScrapydWeb](https://github.com/my8100/scrapydweb) | 管理平台 | Y | Y | Y -| [Scrapyd](https://github.com/scrapy/scrapyd) | 网络服务 | Y | N | N/A - -## TODOs -##### 后端 -- [ ] 文件管理 -- [ ] MySQL数据库支持 -- [ ] 重跑任务 -- [ ] 节点监控 -- [ ] 更多爬虫例子 - -##### 前端 -- [ ] 任务数据统计 -- [ ] 表格过滤 -- [x] 多语言支持 (中文) -- [ ] 登录和用户管理 -- [ ] 全局搜索 +首先,我们来看如何安装Crawlab吧,请查看[安装](/Installation/README.md)。 \ No newline at end of file diff --git a/gitbook/SUMMARY.md b/gitbook/SUMMARY.md index 9cbc8dec..ffecadff 100644 --- a/gitbook/SUMMARY.md +++ b/gitbook/SUMMARY.md @@ -1,18 +1,31 @@ # Summary -* [简介](README.md) -* [快速开始](QuickStart/README.md) - * [安装](QuickStart/Installation.md) - * [运行](QuickStart/Run.md) -* [概念](Concept/README.md) - * [节点](Concept/Node.md) - * [爬虫](Concept/Spider.md) - * [任务](Concept/Task.md) - * [部署](Concept/Deploy.md) +* [Crawlab简介](README.md) +* [安装Crawlab](Installation/README.md) + * [Docker](Installation/Docker.md) + * [直接部署](Installation/Direct.md) + * [预览模式](Installation/Preview.md) +* [使用Crawlab](Usage/README.md) + * [节点](Usage/Node/README.md) + * [查看节点列表](Usage/Node/View.md) + * [修改节点信息](Usage/Node/Edit.md) + * [爬虫](Usage/Spider/README.md) + * [创建爬虫](Usage/Spider/Create.md) + * [自定义爬虫](Usage/Spider/CustomizedSpider.md) + * [可配置爬虫](Usage/Spider/ConfigurableSpider.md) + * [部署爬虫](Usage/Spider/Deploy.md) + * [运行爬虫](Usage/Spider/Run.md) + * [统计数据](Usage/Spider/Analytics.md) + * [任务](Usage/Task/README.md) + * [查看任务](Usage/Task/View.md) + * [删除任务](Usage/Task/Delete.md) + * [下载结果](Usage/Task/DownloadResults.md) + * [定时任务](Usage/Schedule/README.md) + * [网站](Usage/Site/README.md) * [架构](Architecture/README.md) * [Celery](Architecture/Celery.md) * [App](Architecture/App.md) -* [Examples](Examples/README.md) +* [样例](Examples/README.md) * [与Scrapy集成](Examples/README.md) * [与Puppeteer集成](Examples/README.md) diff --git a/gitbook/Usage/Node/Edit.md b/gitbook/Usage/Node/Edit.md new file mode 100644 index 00000000..37e2b533 --- /dev/null +++ b/gitbook/Usage/Node/Edit.md @@ -0,0 +1,9 @@ +## 修改节点信息 + +后面我们需要让爬虫运行在各个节点上,需要让主机与节点进行通信,因此需要知道节点的IP地址和端口。我们需要手动配置一下节点的IP和端口。在`节点列表`中点击`操作`列里的蓝色查看按钮进入到节点详情。节点详情样子如下。 + +![](https://crawlab.oss-cn-hangzhou.aliyuncs.com/gitbook/node-detail.png) + +在右侧分别输入该节点对应的`节点IP`和`节点端口`,然后点击`保存`按钮,保存该节点信息。 + +这样,我们就完成了节点的配置工作。 \ No newline at end of file diff --git a/gitbook/Usage/Node/README.md b/gitbook/Usage/Node/README.md new file mode 100644 index 00000000..f132dcdf --- /dev/null +++ b/gitbook/Usage/Node/README.md @@ -0,0 +1,6 @@ +## 节点 + +节点其实就是Celery中的Worker。一个节点运行时会连接到一个任务队列(例如Redis)来接收和运行任务。所有爬虫需要在运行时被部署到节点上,用户在部署前需要定义节点的IP地址和端口(默认为`localhost:8000`)。 + +1. [查看节点](/Usage/Node/View.md) +2. [修改节点信息](/Usage/Node/Edit.md) diff --git a/gitbook/Usage/Node/View.md b/gitbook/Usage/Node/View.md new file mode 100644 index 00000000..86c150d8 --- /dev/null +++ b/gitbook/Usage/Node/View.md @@ -0,0 +1,5 @@ +## 查看节点列表 + +点击`侧边栏`的`节点`导航至`节点列表`,可以看到已上线的节点。这里的节点其实就是已经运行起来的`celery worker`,他们通过连接到配置好的`broker`(通常是`redis`)来进行与主机的通信。 + +![](https://crawlab.oss-cn-hangzhou.aliyuncs.com/gitbook/node-list.png) diff --git a/gitbook/Usage/README.md b/gitbook/Usage/README.md new file mode 100644 index 00000000..dbfb648f --- /dev/null +++ b/gitbook/Usage/README.md @@ -0,0 +1,6 @@ +本小节将介绍如何使用Crawlab,包括如下内容: + +1. [节点](/Usage/Node/README.md) +2. [爬虫](/Usage/Spider/README.md) +3. [任务](/Usage/Task/README.md) +4. [定时任务](/Usage/Schedule/README.md) \ No newline at end of file diff --git a/gitbook/Usage/Schedule/README.md b/gitbook/Usage/Schedule/README.md new file mode 100644 index 00000000..e69de29b diff --git a/gitbook/Usage/Site/README.md b/gitbook/Usage/Site/README.md new file mode 100644 index 00000000..e69de29b diff --git a/gitbook/Usage/Spider/Analytics.md b/gitbook/Usage/Spider/Analytics.md new file mode 100644 index 00000000..066a3258 --- /dev/null +++ b/gitbook/Usage/Spider/Analytics.md @@ -0,0 +1,7 @@ +## 统计数据 + +在运行了一段时间之后,爬虫会积累一些统计数据,例如`运行成功率`、`任务数`、`运行时长`等指标。Crawlab将这些指标汇总并呈现给开发者。 + +要查看统计数据的话,只需要在`爬虫详情`中,点击`分析`标签,就可以看到爬虫的统计数据了。 + +![](https://crawlab.oss-cn-hangzhou.aliyuncs.com/gitbook/spider-detail-analytics.png) \ No newline at end of file diff --git a/gitbook/Usage/Spider/ConfigurableSpider.md b/gitbook/Usage/Spider/ConfigurableSpider.md new file mode 100644 index 00000000..4e7c5ff2 --- /dev/null +++ b/gitbook/Usage/Spider/ConfigurableSpider.md @@ -0,0 +1,64 @@ +## 可配置爬虫 + +可配置爬虫是版本[v0.2.1](https://github.com/tikazyq/crawlab/releases/tag/v0.2.1)开发的功能。目的是将具有相似网站结构的爬虫项目可配置化,将开发爬虫的过程流程化,大大提高爬虫开发效率。 + +Crawlab的可配置爬虫是基于Scrapy的,因此天生支持并发。而且,可配置爬虫完全支持[自定义爬虫](/Usage/Spider/CustomizedSpider)的一般功能,因此也支持任务调度、任务监控、日志监控、数据分析。 + +### 添加爬虫 + +在`侧边栏`点击`爬虫`导航至`爬虫列表`,点击**添加爬虫**按钮。 + +![爬虫列表](https://user-gold-cdn.xitu.io/2019/5/27/16af74ec408111a7?w=1662&h=702&f=png&s=98898) + +点击**可配置爬虫**。 + +![爬虫列表-添加爬虫](https://user-gold-cdn.xitu.io/2019/5/27/16af74f4c75346da?w=1667&h=703&f=png&s=92067) + +输入完基本信息,点击**添加**。 + +![爬虫列表-爬虫信息](https://user-gold-cdn.xitu.io/2019/5/27/16af751c5d8d984d?w=1666&h=688&f=png&s=90926) + +### 配置爬虫 + +添加完成后,可以看到刚刚添加的可配置爬虫出现了在最下方,点击**查看**进入到**爬虫详情**。 + +![](https://user-gold-cdn.xitu.io/2019/5/27/16af754c6f000698?w=1645&h=739&f=png&s=103908) + +点击**配置**标签进入到配置页面。接下来,我们需要对爬虫规则进行配置。 + +![](https://user-gold-cdn.xitu.io/2019/5/27/16af756d003eae66?w=1659&h=726&f=png&s=92224) + +这里已经有一些配置好的初始输入项。我们简单介绍一下各自的含义。 + +#### 抓取类别 + +这也是爬虫抓取采用的策略,也就是爬虫遍历网页是如何进行的。作为第一个版本,我们有**仅列表**、**仅详情页**、**列表+详情页**。 +- 仅列表页。这也是最简单的形式,爬虫遍历列表上的列表项,将数据抓取下来。 +- 仅详情页。爬虫只抓取详情页。 +- 列表+详情页。爬虫先遍历列表页,将列表项中的详情页地址提取出来并跟进抓取详情页。 + +这里我们选择**列表+详情页**。 + +#### 列表项选择器 & 分页选择器 + +列表项的匹和分页按钮的匹配查询,由CSS或XPath来进行匹配。 + +#### 开始URL + +爬虫最开始遍历的网址。 + +#### 遵守Robots协议 + +这个默认是开启的。如果开启,爬虫将先抓取网站的robots.txt并判断页面是否可抓;否则,不会对此进行验证。用户可以选择将其关闭。请注意,任何无视Robots协议的行为都有法律风险。 + +#### 列表页字段 & 详情页字段 + +这些都是再列表页或详情页中需要提取的字段。字段由CSS选择器或者XPath来匹配提取。可以选择文本或者属性。 + +在检查完目标网页的元素CSS选择器之后,我们输入列表项选择器、开始URL、列表页/详情页等信息。注意勾选url为详情页URL。 + +![](https://user-gold-cdn.xitu.io/2019/5/27/16af7685423c7d57?w=1653&h=873&f=png&s=117230) + +点击保存、预览,查看预览内容。 + +![](https://user-gold-cdn.xitu.io/2019/5/27/16af769811d7bd0c?w=1720&h=663&f=png&s=123762) diff --git a/gitbook/Usage/Spider/Create.md b/gitbook/Usage/Spider/Create.md new file mode 100644 index 00000000..1b934523 --- /dev/null +++ b/gitbook/Usage/Spider/Create.md @@ -0,0 +1,7 @@ +## 创建爬虫 + +Crawlab允许用户创建两种爬虫: +1. [自定义爬虫](/Usage/Spider/CustomizedSpider.md) +2. [可配置爬虫](/Usage/Spider/ConfigurableSpider.md) + +前者可以通过Web界面和创建项目目录的方式来添加,后者由于没有源代码,只能通过Web界面来添加。 diff --git a/gitbook/Usage/Spider/CustomizedSpider.md b/gitbook/Usage/Spider/CustomizedSpider.md new file mode 100644 index 00000000..0115ab80 --- /dev/null +++ b/gitbook/Usage/Spider/CustomizedSpider.md @@ -0,0 +1,31 @@ +## 自定义爬虫 + +自定义爬虫是指用户可以添加的任何语言任何框架的爬虫,高度自定义化。当用户添加好自定义爬虫之后,Crawlab就可以将其集成到爬虫管理的系统中来。 + +自定义爬虫的添加有两种方式: +1. 通过Web界面上传爬虫 +2. 通过创建项目目录 + +### 通过Web界面上传 + +在通过Web界面上传之前,需要将爬虫项目文件打包成`zip`格式。 + +![](https://crawlab.oss-cn-hangzhou.aliyuncs.com/gitbook/spider-list.png) + +然后,在`侧边栏`点击`爬虫`导航至`爬虫列表`,点击`添加爬虫`按钮,选择`自定义爬虫`,点击`上传`按钮,选择刚刚打包好的`zip`文件。上传成功后,`爬虫列表`中会出现新添加的自定义爬虫。这样就算添加好了。 + +这个方式稍微有些繁琐,但是对于无法轻松获取服务器的读写权限时是非常有用的,适合在生产环境上使用。 + +### 通过添加项目目录 + +Crawlab会自动发现`PROJECT_SOURCE_FILE_FOLDER`目录下的所有爬虫目录,并将这些目录生成自定义爬虫并集成到Crawlab中。因此,将爬虫项目目录拷贝到`PROJECT_SOURCE_FILE_FOLDER`目录下,就可以添加一个爬虫了。 + +这种方式非常方便,但是需要获得主机服务器的读写权限,因而比较适合在开发环境上采用。 + +### 配置爬虫 + +在定义爬虫中,我们需要配置一下`执行命令`(运行爬虫时后台执行的`shell`命令)和`结果集`(通过`CRAWLAB_COLLECTION`传递给爬虫程序,爬虫程序存储结果的地方),然后点击`保存`按钮保存爬虫信息。 + +![](https://crawlab.oss-cn-hangzhou.aliyuncs.com/gitbook/spider-detail-overview.png) + +接下来,我们就可以部署、运行自定义爬虫了。 diff --git a/gitbook/Usage/Spider/Deploy.md b/gitbook/Usage/Spider/Deploy.md new file mode 100644 index 00000000..a7f46130 --- /dev/null +++ b/gitbook/Usage/Spider/Deploy.md @@ -0,0 +1,10 @@ +## 部署爬虫 + +这里的爬虫部署是指[自定义爬虫](/Usage/Spider/CustomizedSpider)的部署,因为[可配置爬虫](/Usage/Spider/ConfigurableSpider)已经内嵌到Crawlab中了,所有节点都可以使用,不需要额外部署。简单来说,就是将主机上的爬虫源代码通过`HTTP`的方式打包传输至`worker`节点上,因此节点就可以运行传输过来的爬虫了。 + +部署爬虫很简单,有三种方式: +1. 在`爬虫列表`中点击`部署所有爬虫`,将所有爬虫部署到所有在线节点中; +2. 在`爬虫列表`中点击`操作`列的`部署`按钮,将指定爬虫部署到所有在线节点中; +3. 在`爬虫详情`的`概览`标签中,点击`部署`按钮,将指定爬虫部署到所有在线节点中。 + +部署好之后,我们就可以运行爬虫了。 diff --git a/gitbook/Usage/Spider/README.md b/gitbook/Usage/Spider/README.md new file mode 100644 index 00000000..c346fdd0 --- /dev/null +++ b/gitbook/Usage/Spider/README.md @@ -0,0 +1,9 @@ +## 爬虫 + +爬虫就是我们通常说的网络爬虫了,本小节将介绍如下内容: + +1. [创建爬虫](/Usage/Spider/Create.md) +2. [部署爬虫](/Usage/Spider/Deploy.md) +3. [运行爬虫](/Usage/Spider/Run.md) +4. [可配置爬虫](/Usage/Spider/ConfigurableSpider.md) +5. [统计数据](/Usage/Spider/Analytics.md) \ No newline at end of file diff --git a/gitbook/Usage/Spider/Run.md b/gitbook/Usage/Spider/Run.md new file mode 100644 index 00000000..83ede39f --- /dev/null +++ b/gitbook/Usage/Spider/Run.md @@ -0,0 +1,17 @@ +## 运行爬虫 + +我们有两种运行爬虫的方式: +1. 手动触发 +2. 定时任务触发 + +### 手动触发 + +1. 在`爬虫列表`中`操作`列点击`运行`按钮,或者 +2. 在`爬虫详情`中`概览`标签下点击`运行`按钮,或者 +3. 对于`自定义爬虫`,可以在`配置`标签下点击`运行`按钮 + +然后,Crawlab会提示任务已经派发到队列中去了,然后你可以在`爬虫详情`左侧看到新创建的任务。点击`创建时间`可以导航至`任务详情`。 + +### 定时任务触发 + +`定时任务触发`是比较常用的功能,对于`增量抓取`或对实时性有要求的任务很重要。这在[定时任务](/Usage/Schedule/README.md)中会详细介绍。 \ No newline at end of file diff --git a/gitbook/Usage/Task/README.md b/gitbook/Usage/Task/README.md new file mode 100644 index 00000000..e69de29b diff --git a/gitbook/_book/Architecture/App.html b/gitbook/_book/Architecture/App.html new file mode 100644 index 00000000..1a86914f --- /dev/null +++ b/gitbook/_book/Architecture/App.html @@ -0,0 +1,629 @@ + + + + + + + App · GitBook + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ +
+ +
+ + + + + + + + +
+
+ +
+
+ +
+ +

App

+ + +
+ +
+
+
+ +

results matching ""

+
    + +
    +
    + +

    No results matching ""

    + +
    +
    +
    + +
    +
    + +
    + + + + + + + + + + + + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gitbook/_book/Architecture/Celery.html b/gitbook/_book/Architecture/Celery.html new file mode 100644 index 00000000..011be8f2 --- /dev/null +++ b/gitbook/_book/Architecture/Celery.html @@ -0,0 +1,629 @@ + + + + + + + Celery · GitBook + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + +
    + +
    + +
    + + + + + + + + +
    +
    + +
    +
    + +
    + +

    Celery

    + + +
    + +
    +
    +
    + +

    results matching ""

    +
      + +
      +
      + +

      No results matching ""

      + +
      +
      +
      + +
      +
      + +
      + + + + + + + + + + + + + + +
      + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gitbook/_book/Architecture/index.html b/gitbook/_book/Architecture/index.html new file mode 100644 index 00000000..10220620 --- /dev/null +++ b/gitbook/_book/Architecture/index.html @@ -0,0 +1,629 @@ + + + + + + + 架构 · GitBook + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      +
      + + + + + + + + +
      + +
      + +
      + + + + + + + + +
      +
      + +
      +
      + +
      + +

      架构

      + + +
      + +
      +
      +
      + +

      results matching ""

      +
        + +
        +
        + +

        No results matching ""

        + +
        +
        +
        + +
        +
        + +
        + + + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gitbook/_book/Concept/Deploy.md b/gitbook/_book/Concept/Deploy.md new file mode 100644 index 00000000..12f55ebf --- /dev/null +++ b/gitbook/_book/Concept/Deploy.md @@ -0,0 +1,6 @@ +# 部署 + +所有爬虫在运行前需要被部署当相应当节点中。 + +部署时,爬虫会被打包到相应的目录中,方便环境隔离,开发环境的爬虫和生产环境的爬虫需要打包部署来实现隔离。 + diff --git a/gitbook/_book/Concept/Node.md b/gitbook/_book/Concept/Node.md new file mode 100644 index 00000000..3132f93f --- /dev/null +++ b/gitbook/_book/Concept/Node.md @@ -0,0 +1,3 @@ +# 节点 + +节点其实就是Celery中的Worker。一个节点运行时会连接到一个任务队列(例如Redis)来接收和运行任务。所有爬虫需要在运行时被部署到节点上,用户在部署前需要定义节点的IP地址和端口。 diff --git a/gitbook/_book/Concept/README.md b/gitbook/_book/Concept/README.md new file mode 100644 index 00000000..a36e857f --- /dev/null +++ b/gitbook/_book/Concept/README.md @@ -0,0 +1,2 @@ +# 概念 + diff --git a/gitbook/_book/Concept/Spider.md b/gitbook/_book/Concept/Spider.md new file mode 100644 index 00000000..dd7bebc1 --- /dev/null +++ b/gitbook/_book/Concept/Spider.md @@ -0,0 +1,15 @@ +# 爬虫 + +## 自动发现 + +在`config.py`文件中,修改变量`PROJECT_SOURCE_FILE_FOLDER`作为爬虫项目所在的目录。Crawlab后台程序会自动发现这些爬虫项目并储存到数据库中。是不是很方便? + +## 部署爬虫 + +所有爬虫需要在抓取前被部署当相应当节点中。在"爬虫详情"页面点击"Deploy"按钮,爬虫将被部署到所有有效到节点中。 + +## 运行爬虫 + +部署爬虫之后,你可以在"爬虫详情"页面点击"Run"按钮来启动爬虫。一个爬虫任务将被触发,你可以在任务列表页面中看到这个任务。 + + diff --git a/gitbook/_book/Concept/Task.md b/gitbook/_book/Concept/Task.md new file mode 100644 index 00000000..bd75b96f --- /dev/null +++ b/gitbook/_book/Concept/Task.md @@ -0,0 +1,3 @@ +# 任务 + +任务被触发并被节点执行。用户可以在任务详情页面中看到任务到状态、日志和抓取结果。 diff --git a/gitbook/_book/Examples/index.html b/gitbook/_book/Examples/index.html new file mode 100644 index 00000000..4f3d750c --- /dev/null +++ b/gitbook/_book/Examples/index.html @@ -0,0 +1,629 @@ + + + + + + + 样例 · GitBook + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        + + + + + + + + +
        + +
        + +
        + + + + + + + + +
        +
        + +
        +
        + +
        + +

        Examples

        + + +
        + +
        +
        +
        + +

        results matching ""

        +
          + +
          +
          + +

          No results matching ""

          + +
          +
          +
          + +
          +
          + +
          + + + + + + + + + + + + + + +
          + + +
          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gitbook/_book/Functions/FunctionList.md b/gitbook/_book/Functions/FunctionList.md new file mode 100644 index 00000000..636126fa --- /dev/null +++ b/gitbook/_book/Functions/FunctionList.md @@ -0,0 +1,61 @@ +# 功能列表 + +类别 | 功能名称 | 已统计 | 备注 +--- | --- | --- | --- +全局 | 打开页面 | Y | _trackPageview +全局 | 切换中英文 | Y +全局 | 允许/禁止统计 | Y +节点 | 刷新 | Y +节点 | 查看 | Y +节点 | 删除 | Y +节点详情 | 保存 | Y +节点详情 | 切换节点 | Y +爬虫 | 部署所有爬虫 | Y +爬虫 | 导入爬虫 | Y +爬虫 | 添加爬虫-可配置爬虫 | Y +爬虫 | 添加爬虫-自定义爬虫 | Y +爬虫 | 刷新 | Y +爬虫 | 查看 | Y +爬虫 | 删除 | Y +爬虫 | 部署 | Y +爬虫 | 运行 | Y +爬虫 | 搜索网站 | Y +爬虫详情 | 切换爬虫 | Y +爬虫详情 | 切换标签 | Y +爬虫详情-概览 | 保存 | Y +爬虫详情-概览 | 部署 | Y +爬虫详情-概览 | 运行 | Y +爬虫详情-环境 | 添加 | Y +爬虫详情-环境 | 删除 | Y +爬虫详情-环境 | 保存 | Y +爬虫详情-配置 | 保存 | Y +爬虫详情-配置 | 预览 | Y +爬虫详情-配置 | 提取字段 | Y +爬虫详情-配置 | 运行 | Y +爬虫详情-配置 | 添加字段 | Y +爬虫详情-配置 | 更改字段 | Y +爬虫详情-配置 | 删除字段 | Y +爬虫详情-配置 | 设置详情页URL | Y +任务 | 选择节点 | Y +任务 | 选择爬虫 | Y +任务 | 点击爬虫详情 | Y +任务 | 点击节点详情 | Y +任务 | 搜索 | Y +任务 | 查看 | Y +任务 | 删除 | Y +任务详情 | 切换标签 | Y +任务详情-概览 | 点击爬虫详情 | Y +任务详情-概览 | 点击节点详情 | Y +任务详情-结果 | 下载CSV | Y +定时任务 | 添加 | Y +定时任务 | 修改 | Y +定时任务 | 删除 | Y +定时任务 | 提交 | Y +部署 | 刷新 | Y +网站 | 搜索 | Y +网站 | 选择主类别 | Y +网站 | 选择类别 | Y +网站 | 点击域名 | Y +网站 | 点击爬虫数 | Y +网站 | 点击Robots协议 | N + diff --git a/gitbook/_book/Installation/Direct.html b/gitbook/_book/Installation/Direct.html new file mode 100644 index 00000000..8e0a38cb --- /dev/null +++ b/gitbook/_book/Installation/Direct.html @@ -0,0 +1,677 @@ + + + + + + + 直接部署 · GitBook + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          +
          + + + + + + + + +
          + +
          + +
          + + + + + + + + +
          +
          + +
          +
          + +
          + +

          直接部署

          +

          直接部署是之前没有Docker时的部署方式,相对于Docker部署来说有些繁琐。但了解如何直接部署可以帮助更深入地理解Docker是如何构建Crawlab镜像的。这里简单介绍一下。

          +

          拉取代码

          +

          首先是将github上的代码拉取到本地。

          +
          git clone https://github.com/tikazyq/crawlab
          +
          +

          安装

          +

          安装前端所需库。

          +
          npm install -g yarn pm2
          +cd frontend
          +yarn install
          +
          +

          安装后端所需库。

          +
          cd ../crawlab
          +pip install -r requirements
          +
          +

          配置

          +

          分别配置前端配置文件./frontend/.env.production和后端配置文件./crawlab/config/config.py。分别需要对部署后API地址以及数据库地址进行配置。

          +

          构建

          +

          这里的构建是指前端构建,需要执行以下命令。

          +
          cd ../frontend
          +npm run build:prod
          +
          +

          构建完成后,会在./frontend目录下创建一个dist文件夹,里面是打包好后的静态文件。

          +

          Nginx

          +

          安装nginx,在ubuntu 16.04是以下命令。

          +
          sudo apt-get install nginx
          +
          +

          添加/etc/nginx/conf.d/crawlab.conf文件,输入以下内容。

          +
          server {
          +    listen    8080;
          +    server_name    dev.crawlab.com;
          +    root    /home/yeqing/jenkins_home/workspace/crawlab_develop/frontend/dist;
          +    index    index.html;
          +}
          +

          其中,root是静态文件的根目录,这里是npm打包好后的静态文件。

          +

          现在,只需要启动nginx服务就完成了启动前端服务。

          +
          nginx reload
          +
          +

          启动服务

          +

          这里是指启动后端服务。我们用pm2来管理进程。执行以下命令。

          +
          pm2 start app.py # API服务
          +pm2 start worker.py # Worker
          +pm2 start flower.py # Flower
          +
          +

          这样,pm2会启动3个守护进程来管理这3个服务。我们如果想看后端服务的日志的话,可以执行以下命令。

          +
          pm2 logs [app]
          +
          +

          然后在浏览器中输入http://localhost:8080就可以看到界面了。

          + + +
          + +
          +
          +
          + +

          results matching ""

          +
            + +
            +
            + +

            No results matching ""

            + +
            +
            +
            + +
            +
            + +
            + + + + + + + + + + + + + + +
            + + +
            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gitbook/_book/Installation/Docker.html b/gitbook/_book/Installation/Docker.html new file mode 100644 index 00000000..9df4de24 --- /dev/null +++ b/gitbook/_book/Installation/Docker.html @@ -0,0 +1,752 @@ + + + + + + + Docker · GitBook + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            +
            + + + + + + + + +
            + +
            + +
            + + + + + + + + +
            +
            + +
            +
            + +
            + +

            Docker安装部署

            +

            这应该是部署应用的最方便也是最节省时间的方式了。在最近的一次版本更新v0.2.3中,我们发布了Docker功能,让大家可以利用Docker来轻松部署Crawlab。下面将一步一步介绍如何使用Docker来部署Crawlab。

            +

            对Docker不了解的开发者,可以参考一下这篇文章(9102 年了,学点 Docker 知识)做进一步了解。简单来说,Docker可以利用已存在的镜像帮助构建一些常用的服务和应用,例如Nginx、MongoDB、Redis等等。用Docker运行一个MongoDB服务仅需docker run -d --name mongo -p 27017:27017 mongo一行命令。如何安装Docker跟操作系统有关,这里就不展开讲了,需要的同学自行百度一下相关教程。

            +

            下载镜像

            +

            我们已经在DockerHub上构建了Crawlab的镜像,开发者只需要将其pull下来使用。在pull 镜像之前,我们需要配置一下镜像源。因为我们在墙内,使用原有的镜像源速度非常感人,因此将使用DockerHub在国内的加速器。创建/etc/docker/daemon.json文件,在其中输入如下内容。

            +
            {
            +  "registry-mirrors": ["https://registry.docker-cn.com"]
            +}
            +
            +

            这样的话,pull镜像的速度会比不改变镜像源的速度快很多。

            +

            执行以下命令将Crawlab的镜像下载下来。镜像大小大概在几百兆,因此下载需要几分钟时间。

            +
            docker pull tikazyq/crawlab:latest
            +
            +

            更改配置文件

            +

            拷贝一份后端配置文件./crawlab/config/config.py以及前端配置文件./frontend/.env.production到某一个地方。例如我的例子,分别为/home/yeqing/config.py/home/yeqing/.env.production

            +

            更改后端配置文件config.py,将MongoDB、Redis的指向IP更改为自己数据的值。注意,容器中对应的宿主机的IP地址不是localhost,而是172.17.0.1(当然也可以用network来做,只是稍微麻烦一些)。更改前端配置文件.env.production,将API地址VUE_APP_BASE_URL更改为宿主机所在的IP地址,例如http://192.168.0.8:8000,这将是前端调用API会用到的URL。

            +

            运行Docker容器

            +

            更改好配置文件之后,接下来就是运行容器了。执行以下命令来启动容器。

            +
            docker run -d --rm --name crawlab \
            +    -p 8080:8080 \
            +    -p 8000:8000 \
            +    -v /home/yeqing/.env.production:/opt/crawlab/frontend/.env.production \
            +    -v /home/yeqing/config.py:/opt/crawlab/crawlab/config/config.py \
            +    tikazyq/crawlab master
            +
            +

            其中,我们映射了8080端口(Nginx前端静态文件)以及8000端口(后端API)到宿主机。另外还将前端配置文件/home/yeqing/.env.production和后端配置文件/home/yeqing/config.py映射到了容器相应的目录下。传入参数master是代表该启动方式为主机启动模式,也就是所有服务(前端、Api、Flower、Worker)都会启动。另外一个模式是worker模式,只会启动必要的Api和Worker服务,这个对于分布式部署比较有用。等待大约20-30秒的时间来build前端静态文件,之后就可以打开Crawlab界面地址地址看到界面了。界面地址默认为http://localhost:8080

            +

            +

            Docker-Compose

            +

            当然,也可以用docker-compose的方式来部署。docker-compose是一个集群管理方式,可以利用名为docker-compose.ymlyaml文件来定义需要启动的容器,可以是单个,也可以(通常)是多个的。Crawlab的docker-compose.yml定义如下。

            +
            version: '3.3'
            +services:
            +  master: 
            +    image: tikazyq/crawlab:latest
            +    container_name: crawlab
            +    volumns:
            +      - /home/yeqing/config.py:/opt/crawlab/crawlab/config/config.py # 后端配置文件
            +      - /home/yeqing/.env.production:/opt/crawlab/frontend/.env.production # 前端配置文件
            +    ports:    
            +      - "8080:8080" # nginx
            +      - "8000:8000" # app
            +    depends_on:
            +      - mongo
            +      - redis
            +    entrypoint:
            +      - /bin/sh
            +      - /opt/crawlab/docker_init.sh
            +      - master
            +  mongo:
            +    image: mongo:latest
            +    restart: always
            +    ports:
            +      - "27017:27017"
            +  redis:
            +    image: redis:latest
            +    restart: always
            +    ports:
            +      - "6379:6379"
            +
            +

            这里先定义了master节点,也就是Crawlab的主节点。master依赖于mongoredis容器,因此在启动之前会同时启动mongoredis容器。这样就不需要单独配置mongoredis服务了,大大节省了环境配置的时间。

            +

            安装docker-compose也很简单,大家去网上百度一下就可以了。

            +

            安装完docker-compose和定义好docker-compose.yml后,只需要运行以下命令就可以启动Crawlab。

            +
            docker-compose up
            +
            +

            同样,在浏览器中输入http://localhost:8080就可以看到界面。

            +

            多节点模式

            +

            docker-compose的方式很适合多节点部署,在原有的master基础上增加几个worker节点,达到多节点部署的目的。将docker-compose.yml更改为如下内容。

            +
            version: '3.3'
            +services:
            +  master: 
            +    image: tikazyq/crawlab:latest
            +    container_name: crawlab
            +    volumns:
            +      - /home/yeqing/config.master.py:/opt/crawlab/crawlab/config/config.py # 后端配置文件
            +      - /home/yeqing/.env.production.master:/opt/crawlab/frontend/.env.production # 前端配置文件
            +    ports:    
            +      - "8080:8080" # nginx
            +      - "8000:8000" # app
            +    depends_on:
            +      - mongo
            +      - redis
            +    entrypoint:
            +      - /bin/sh
            +      - /opt/crawlab/docker_init.sh
            +      - master
            +  worker1: 
            +    image: tikazyq/crawlab:latest
            +    volumns:
            +      - /home/yeqing/config.worker.py:/opt/crawlab/crawlab/config/config.py # 后端配置文件
            +      - /home/yeqing/.env.production.worker:/opt/crawlab/frontend/.env.production # 前端配置文件
            +    ports:
            +      - "8001:8000" # app
            +    depends_on:
            +      - mongo
            +      - redis
            +    entrypoint:
            +      - /bin/sh
            +      - /opt/crawlab/docker_init.sh
            +      - worker
            +  worker2: 
            +    image: tikazyq/crawlab:latest
            +    volumns:
            +      - /home/yeqing/config.worker.py:/opt/crawlab/crawlab/config/config.py # 后端配置文件
            +      - /home/yeqing/.env.production.worker:/opt/crawlab/frontend/.env.production # 前端配置文件
            +    ports:
            +      - "8002:8000" # app
            +    depends_on:
            +      - mongo
            +      - redis
            +    entrypoint:
            +      - /bin/sh
            +      - /opt/crawlab/docker_init.sh
            +      - worker
            +  mongo:
            +    image: mongo:latest
            +    restart: always
            +    ports:
            +      - "27017:27017"
            +  redis:
            +    image: redis:latest
            +    restart: always
            +    ports:
            +      - "6379:6379"
            +
            +

            这里启动了多增加了两个worker节点,以worker模式启动。这样,多节点部署,也就是分布式部署就完成了。

            + + +
            + +
            +
            +
            + +

            results matching ""

            +
              + +
              +
              + +

              No results matching ""

              + +
              +
              +
              + +
              +
              + +
              + + + + + + + + + + + + + + +
              + + +
              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gitbook/_book/Installation/Preview.html b/gitbook/_book/Installation/Preview.html new file mode 100644 index 00000000..ca3d4b9d --- /dev/null +++ b/gitbook/_book/Installation/Preview.html @@ -0,0 +1,633 @@ + + + + + + + 预览模式 · GitBook + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              +
              + + + + + + + + +
              + +
              + +
              + + + + + + + + +
              +
              + +
              +
              + +
              + +

              预览模式

              +

              预览模式是一种让用户比较快的上手的一种部署模式。跟直接部署类似,但不用经过构建nginx启动服务的步骤。在启动时只需要执行以下命令就可以了。相较于直接部署来说方便一些。

              +
              python manage.py serve
              +
              +

              该模式同样会启动3个后端服务和1个前端服务。前端服务是通过npm run serve来进行的,因此是开发者模式。注意:强烈不建议在生产环境中用预览模式。预览模式只是让开发者快速体验Crawlab以及调试代码问题的一种方式,而不是用作生产环境部署的。

              + + +
              + +
              +
              +
              + +

              results matching ""

              +
                + +
                +
                + +

                No results matching ""

                + +
                +
                +
                + +
                +
                + +
                + + + + + + + + + + + + + + +
                + + +
                + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gitbook/_book/Installation/index.html b/gitbook/_book/Installation/index.html new file mode 100644 index 00000000..51980417 --- /dev/null +++ b/gitbook/_book/Installation/index.html @@ -0,0 +1,634 @@ + + + + + + + 安装Crawlab · GitBook + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                +
                + + + + + + + + +
                + +
                + +
                + + + + + + + + +
                +
                + +
                +
                + +
                + +

                本小节将介绍三种安装Docker的方式:

                +
                  +
                1. Docker
                2. +
                3. 直接部署
                4. +
                5. 预览模式
                6. +
                + + +
                + +
                +
                +
                + +

                results matching ""

                +
                  + +
                  +
                  + +

                  No results matching ""

                  + +
                  +
                  +
                  + +
                  +
                  + +
                  + + + + + + + + + + + + + + +
                  + + +
                  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gitbook/_book/Usage/Node/Edit.html b/gitbook/_book/Usage/Node/Edit.html new file mode 100644 index 00000000..73b1daac --- /dev/null +++ b/gitbook/_book/Usage/Node/Edit.html @@ -0,0 +1,633 @@ + + + + + + + 修改节点信息 · GitBook + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  +
                  + + + + + + + + +
                  + +
                  + +
                  + + + + + + + + +
                  +
                  + +
                  +
                  + +
                  + +

                  修改节点信息

                  +

                  后面我们需要让爬虫运行在各个节点上,需要让主机与节点进行通信,因此需要知道节点的IP地址和端口。我们需要手动配置一下节点的IP和端口。在节点列表中点击操作列里的蓝色查看按钮进入到节点详情。节点详情样子如下。

                  +

                  +

                  在右侧分别输入该节点对应的节点IP节点端口,然后点击保存按钮,保存该节点信息。

                  +

                  这样,我们就完成了节点的配置工作。

                  + + +
                  + +
                  +
                  +
                  + +

                  results matching ""

                  +
                    + +
                    +
                    + +

                    No results matching ""

                    + +
                    +
                    +
                    + +
                    +
                    + +
                    + + + + + + + + + + + + + + +
                    + + +
                    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gitbook/_book/Usage/Node/View.html b/gitbook/_book/Usage/Node/View.html new file mode 100644 index 00000000..99d98e9d --- /dev/null +++ b/gitbook/_book/Usage/Node/View.html @@ -0,0 +1,631 @@ + + + + + + + 查看节点列表 · GitBook + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    +
                    + + + + + + + + +
                    + +
                    + +
                    + + + + + + + + +
                    +
                    + +
                    +
                    + +
                    + +

                    查看节点列表

                    +

                    点击侧边栏节点导航至节点列表,可以看到已上线的节点。这里的节点其实就是已经运行起来的celery worker,他们通过连接到配置好的broker(通常是redis)来进行与主机的通信。

                    +

                    + + +
                    + +
                    +
                    +
                    + +

                    results matching ""

                    +
                      + +
                      +
                      + +

                      No results matching ""

                      + +
                      +
                      +
                      + +
                      +
                      + +
                      + + + + + + + + + + + + + + +
                      + + +
                      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gitbook/_book/Usage/Node/index.html b/gitbook/_book/Usage/Node/index.html new file mode 100644 index 00000000..763757f6 --- /dev/null +++ b/gitbook/_book/Usage/Node/index.html @@ -0,0 +1,634 @@ + + + + + + + 节点 · GitBook + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      +
                      + + + + + + + + +
                      + +
                      + +
                      + + + + + + + + +
                      +
                      + +
                      +
                      + +
                      + +

                      节点

                      +

                      节点其实就是Celery中的Worker。一个节点运行时会连接到一个任务队列(例如Redis)来接收和运行任务。所有爬虫需要在运行时被部署到节点上,用户在部署前需要定义节点的IP地址和端口(默认为localhost:8000)。

                      +
                        +
                      1. 查看节点
                      2. +
                      3. 修改节点信息
                      4. +
                      + + +
                      + +
                      +
                      +
                      + +

                      results matching ""

                      +
                        + +
                        +
                        + +

                        No results matching ""

                        + +
                        +
                        +
                        + +
                        +
                        + +
                        + + + + + + + + + + + + + + +
                        + + +
                        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gitbook/_book/Usage/Schedule/index.html b/gitbook/_book/Usage/Schedule/index.html new file mode 100644 index 00000000..61765316 --- /dev/null +++ b/gitbook/_book/Usage/Schedule/index.html @@ -0,0 +1,628 @@ + + + + + + + 定时任务 · GitBook + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        +
                        + + + + + + + + +
                        + +
                        + +
                        + + + + + + + + +
                        +
                        + +
                        +
                        + +
                        + + + +
                        + +
                        +
                        +
                        + +

                        results matching ""

                        +
                          + +
                          +
                          + +

                          No results matching ""

                          + +
                          +
                          +
                          + +
                          +
                          + +
                          + + + + + + + + + + + + + + +
                          + + +
                          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gitbook/_book/Usage/Site/index.html b/gitbook/_book/Usage/Site/index.html new file mode 100644 index 00000000..8ef42bf2 --- /dev/null +++ b/gitbook/_book/Usage/Site/index.html @@ -0,0 +1,628 @@ + + + + + + + 网站 · GitBook + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          +
                          + + + + + + + + +
                          + +
                          + +
                          + + + + + + + + +
                          +
                          + +
                          +
                          + +
                          + + + +
                          + +
                          +
                          +
                          + +

                          results matching ""

                          +
                            + +
                            +
                            + +

                            No results matching ""

                            + +
                            +
                            +
                            + +
                            +
                            + +
                            + + + + + + + + + + + + + + +
                            + + +
                            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gitbook/_book/Usage/Spider/Analytics.html b/gitbook/_book/Usage/Spider/Analytics.html new file mode 100644 index 00000000..6b366cbf --- /dev/null +++ b/gitbook/_book/Usage/Spider/Analytics.html @@ -0,0 +1,632 @@ + + + + + + + 统计数据 · GitBook + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            +
                            + + + + + + + + +
                            + +
                            + +
                            + + + + + + + + +
                            +
                            + +
                            +
                            + +
                            + +

                            统计数据

                            +

                            在运行了一段时间之后,爬虫会积累一些统计数据,例如运行成功率任务数运行时长等指标。Crawlab将这些指标汇总并呈现给开发者。

                            +

                            要查看统计数据的话,只需要在爬虫详情中,点击分析标签,就可以看到爬虫的统计数据了。

                            +

                            + + +
                            + +
                            +
                            +
                            + +

                            results matching ""

                            +
                              + +
                              +
                              + +

                              No results matching ""

                              + +
                              +
                              +
                              + +
                              +
                              + +
                              + + + + + + + + + + + + + + +
                              + + +
                              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gitbook/_book/Usage/Spider/ConfigurableSpider.html b/gitbook/_book/Usage/Spider/ConfigurableSpider.html new file mode 100644 index 00000000..f56ae252 --- /dev/null +++ b/gitbook/_book/Usage/Spider/ConfigurableSpider.html @@ -0,0 +1,664 @@ + + + + + + + 可配置爬虫 · GitBook + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              +
                              + + + + + + + + +
                              + +
                              + +
                              + + + + + + + + +
                              +
                              + +
                              +
                              + +
                              + +

                              可配置爬虫

                              +

                              可配置爬虫是版本v0.2.1开发的功能。目的是将具有相似网站结构的爬虫项目可配置化,将开发爬虫的过程流程化,大大提高爬虫开发效率。

                              +

                              Crawlab的可配置爬虫是基于Scrapy的,因此天生支持并发。而且,可配置爬虫完全支持自定义爬虫的一般功能,因此也支持任务调度、任务监控、日志监控、数据分析。

                              +

                              添加爬虫

                              +

                              侧边栏点击爬虫导航至爬虫列表,点击添加爬虫按钮。

                              +

                              爬虫列表

                              +

                              点击可配置爬虫

                              +

                              爬虫列表-添加爬虫

                              +

                              输入完基本信息,点击添加

                              +

                              爬虫列表-爬虫信息

                              +

                              配置爬虫

                              +

                              添加完成后,可以看到刚刚添加的可配置爬虫出现了在最下方,点击查看进入到爬虫详情

                              +

                              +

                              点击配置标签进入到配置页面。接下来,我们需要对爬虫规则进行配置。

                              +

                              +

                              这里已经有一些配置好的初始输入项。我们简单介绍一下各自的含义。

                              +

                              抓取类别

                              +

                              这也是爬虫抓取采用的策略,也就是爬虫遍历网页是如何进行的。作为第一个版本,我们有仅列表仅详情页列表+详情页

                              +
                                +
                              • 仅列表页。这也是最简单的形式,爬虫遍历列表上的列表项,将数据抓取下来。
                              • +
                              • 仅详情页。爬虫只抓取详情页。
                              • +
                              • 列表+详情页。爬虫先遍历列表页,将列表项中的详情页地址提取出来并跟进抓取详情页。
                              • +
                              +

                              这里我们选择列表+详情页

                              +

                              列表项选择器 & 分页选择器

                              +

                              列表项的匹和分页按钮的匹配查询,由CSS或XPath来进行匹配。

                              +

                              开始URL

                              +

                              爬虫最开始遍历的网址。

                              +

                              遵守Robots协议

                              +

                              这个默认是开启的。如果开启,爬虫将先抓取网站的robots.txt并判断页面是否可抓;否则,不会对此进行验证。用户可以选择将其关闭。请注意,任何无视Robots协议的行为都有法律风险。

                              +

                              列表页字段 & 详情页字段

                              +

                              这些都是再列表页或详情页中需要提取的字段。字段由CSS选择器或者XPath来匹配提取。可以选择文本或者属性。

                              +

                              在检查完目标网页的元素CSS选择器之后,我们输入列表项选择器、开始URL、列表页/详情页等信息。注意勾选url为详情页URL。

                              +

                              +

                              点击保存、预览,查看预览内容。

                              +

                              + + +
                              + +
                              +
                              +
                              + +

                              results matching ""

                              +
                                + +
                                +
                                + +

                                No results matching ""

                                + +
                                +
                                +
                                + +
                                +
                                + +
                                + + + + + + + + + + + + + + +
                                + + +
                                + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gitbook/_book/Usage/Spider/Create.html b/gitbook/_book/Usage/Spider/Create.html new file mode 100644 index 00000000..2333f8a3 --- /dev/null +++ b/gitbook/_book/Usage/Spider/Create.html @@ -0,0 +1,635 @@ + + + + + + + 创建爬虫 · GitBook + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                +
                                + + + + + + + + +
                                + +
                                + +
                                + + + + + + + + +
                                +
                                + +
                                +
                                + +
                                + +

                                创建爬虫

                                +

                                Crawlab允许用户创建两种爬虫:

                                +
                                  +
                                1. 自定义爬虫
                                2. +
                                3. 可配置爬虫
                                4. +
                                +

                                前者可以通过Web界面和创建项目目录的方式来添加,后者由于没有源代码,只能通过Web界面来添加。

                                + + +
                                + +
                                +
                                +
                                + +

                                results matching ""

                                +
                                  + +
                                  +
                                  + +

                                  No results matching ""

                                  + +
                                  +
                                  +
                                  + +
                                  +
                                  + +
                                  + + + + + + + + + + + + + + +
                                  + + +
                                  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gitbook/_book/Usage/Spider/CustomizedSpider.html b/gitbook/_book/Usage/Spider/CustomizedSpider.html new file mode 100644 index 00000000..ec63bfce --- /dev/null +++ b/gitbook/_book/Usage/Spider/CustomizedSpider.html @@ -0,0 +1,647 @@ + + + + + + + 自定义爬虫 · GitBook + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  +
                                  + + + + + + + + +
                                  + +
                                  + +
                                  + + + + + + + + +
                                  +
                                  + +
                                  +
                                  + +
                                  + +

                                  自定义爬虫

                                  +

                                  自定义爬虫是指用户可以添加的任何语言任何框架的爬虫,高度自定义化。当用户添加好自定义爬虫之后,Crawlab就可以将其集成到爬虫管理的系统中来。

                                  +

                                  自定义爬虫的添加有两种方式:

                                  +
                                    +
                                  1. 通过Web界面上传爬虫
                                  2. +
                                  3. 通过创建项目目录
                                  4. +
                                  +

                                  通过Web界面上传

                                  +

                                  在通过Web界面上传之前,需要将爬虫项目文件打包成zip格式。

                                  +

                                  +

                                  然后,在侧边栏点击爬虫导航至爬虫列表,点击添加爬虫按钮,选择自定义爬虫,点击上传按钮,选择刚刚打包好的zip文件。上传成功后,爬虫列表中会出现新添加的自定义爬虫。这样就算添加好了。

                                  +

                                  这个方式稍微有些繁琐,但是对于无法轻松获取服务器的读写权限时是非常有用的,适合在生产环境上使用。

                                  +

                                  通过添加项目目录

                                  +

                                  Crawlab会自动发现PROJECT_SOURCE_FILE_FOLDER目录下的所有爬虫目录,并将这些目录生成自定义爬虫并集成到Crawlab中。因此,将爬虫项目目录拷贝到PROJECT_SOURCE_FILE_FOLDER目录下,就可以添加一个爬虫了。

                                  +

                                  这种方式非常方便,但是需要获得主机服务器的读写权限,因而比较适合在开发环境上采用。

                                  +

                                  配置爬虫

                                  +

                                  在定义爬虫中,我们需要配置一下执行命令(运行爬虫时后台执行的shell命令)和结果集(通过CRAWLAB_COLLECTION传递给爬虫程序,爬虫程序存储结果的地方),然后点击保存按钮保存爬虫信息。

                                  +

                                  +

                                  接下来,我们就可以部署、运行自定义爬虫了。

                                  + + +
                                  + +
                                  +
                                  +
                                  + +

                                  results matching ""

                                  +
                                    + +
                                    +
                                    + +

                                    No results matching ""

                                    + +
                                    +
                                    +
                                    + +
                                    +
                                    + +
                                    + + + + + + + + + + + + + + +
                                    + + +
                                    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gitbook/_book/Usage/Spider/Deploy.html b/gitbook/_book/Usage/Spider/Deploy.html new file mode 100644 index 00000000..1e3f0436 --- /dev/null +++ b/gitbook/_book/Usage/Spider/Deploy.html @@ -0,0 +1,637 @@ + + + + + + + 部署爬虫 · GitBook + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    +
                                    + + + + + + + + +
                                    + +
                                    + +
                                    + + + + + + + + +
                                    +
                                    + +
                                    +
                                    + +
                                    + +

                                    部署爬虫

                                    +

                                    这里的爬虫部署是指自定义爬虫的部署,因为可配置爬虫已经内嵌到Crawlab中了,所有节点都可以使用,不需要额外部署。简单来说,就是将主机上的爬虫源代码通过HTTP的方式打包传输至worker节点上,因此节点就可以运行传输过来的爬虫了。

                                    +

                                    部署爬虫很简单,有三种方式:

                                    +
                                      +
                                    1. 爬虫列表中点击部署所有爬虫,将所有爬虫部署到所有在线节点中;
                                    2. +
                                    3. 爬虫列表中点击操作列的部署按钮,将指定爬虫部署到所有在线节点中;
                                    4. +
                                    5. 爬虫详情概览标签中,点击部署按钮,将指定爬虫部署到所有在线节点中。
                                    6. +
                                    +

                                    部署好之后,我们就可以运行爬虫了。

                                    + + +
                                    + +
                                    +
                                    +
                                    + +

                                    results matching ""

                                    +
                                      + +
                                      +
                                      + +

                                      No results matching ""

                                      + +
                                      +
                                      +
                                      + +
                                      +
                                      + +
                                      + + + + + + + + + + + + + + +
                                      + + +
                                      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gitbook/_book/Usage/Spider/Run.html b/gitbook/_book/Usage/Spider/Run.html new file mode 100644 index 00000000..4dec24b2 --- /dev/null +++ b/gitbook/_book/Usage/Spider/Run.html @@ -0,0 +1,643 @@ + + + + + + + 运行爬虫 · GitBook + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      +
                                      + + + + + + + + +
                                      + +
                                      + +
                                      + + + + + + + + +
                                      +
                                      + +
                                      +
                                      + +
                                      + +

                                      运行爬虫

                                      +

                                      我们有两种运行爬虫的方式:

                                      +
                                        +
                                      1. 手动触发
                                      2. +
                                      3. 定时任务触发
                                      4. +
                                      +

                                      手动触发

                                      +
                                        +
                                      1. 爬虫列表操作列点击运行按钮,或者
                                      2. +
                                      3. 爬虫详情概览标签下点击运行按钮,或者
                                      4. +
                                      5. 对于自定义爬虫,可以在配置标签下点击运行按钮
                                      6. +
                                      +

                                      然后,Crawlab会提示任务已经派发到队列中去了,然后你可以在爬虫详情左侧看到新创建的任务。点击创建时间可以导航至任务详情

                                      +

                                      定时任务触发

                                      +

                                      定时任务触发是比较常用的功能,对于增量抓取或对实时性有要求的任务很重要。这在定时任务中会详细介绍。

                                      + + +
                                      + +
                                      +
                                      +
                                      + +

                                      results matching ""

                                      +
                                        + +
                                        +
                                        + +

                                        No results matching ""

                                        + +
                                        +
                                        +
                                        + +
                                        +
                                        + +
                                        + + + + + + + + + + + + + + +
                                        + + +
                                        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gitbook/_book/Usage/Spider/index.html b/gitbook/_book/Usage/Spider/index.html new file mode 100644 index 00000000..0e28ffa7 --- /dev/null +++ b/gitbook/_book/Usage/Spider/index.html @@ -0,0 +1,637 @@ + + + + + + + 爬虫 · GitBook + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                        +
                                        + + + + + + + + +
                                        + +
                                        + +
                                        + + + + + + + + +
                                        +
                                        + +
                                        +
                                        + +
                                        + +

                                        爬虫

                                        +

                                        爬虫就是我们通常说的网络爬虫了,本小节将介绍如下内容:

                                        +
                                          +
                                        1. 创建爬虫
                                        2. +
                                        3. 部署爬虫
                                        4. +
                                        5. 运行爬虫
                                        6. +
                                        7. 可配置爬虫
                                        8. +
                                        9. 统计数据
                                        10. +
                                        + + +
                                        + +
                                        +
                                        +
                                        + +

                                        results matching ""

                                        +
                                          + +
                                          +
                                          + +

                                          No results matching ""

                                          + +
                                          +
                                          +
                                          + +
                                          +
                                          + +
                                          + + + + + + + + + + + + + + +
                                          + + +
                                          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gitbook/_book/Usage/Task/index.html b/gitbook/_book/Usage/Task/index.html new file mode 100644 index 00000000..7073d086 --- /dev/null +++ b/gitbook/_book/Usage/Task/index.html @@ -0,0 +1,628 @@ + + + + + + + 任务 · GitBook + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                          +
                                          + + + + + + + + +
                                          + +
                                          + +
                                          + + + + + + + + +
                                          +
                                          + +
                                          +
                                          + +
                                          + + + +
                                          + +
                                          +
                                          +
                                          + +

                                          results matching ""

                                          +
                                            + +
                                            +
                                            + +

                                            No results matching ""

                                            + +
                                            +
                                            +
                                            + +
                                            +
                                            + +
                                            + + + + + + + + + + + + + + +
                                            + + +
                                            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gitbook/_book/Usage/index.html b/gitbook/_book/Usage/index.html new file mode 100644 index 00000000..e49becec --- /dev/null +++ b/gitbook/_book/Usage/index.html @@ -0,0 +1,635 @@ + + + + + + + 使用Crawlab · GitBook + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                            +
                                            + + + + + + + + +
                                            + +
                                            + +
                                            + + + + + + + + +
                                            +
                                            + +
                                            +
                                            + +
                                            + +

                                            本小节将介绍如何使用Crawlab,包括如下内容:

                                            +
                                              +
                                            1. 节点
                                            2. +
                                            3. 爬虫
                                            4. +
                                            5. 任务
                                            6. +
                                            7. 定时任务
                                            8. +
                                            + + +
                                            + +
                                            +
                                            +
                                            + +

                                            results matching ""

                                            +
                                              + +
                                              +
                                              + +

                                              No results matching ""

                                              + +
                                              +
                                              +
                                              + +
                                              +
                                              + +
                                              + + + + + + + + + + + + + + +
                                              + + +
                                              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gitbook/_book/gitbook/fonts/fontawesome/FontAwesome.otf b/gitbook/_book/gitbook/fonts/fontawesome/FontAwesome.otf new file mode 100644 index 00000000..d4de13e8 Binary files /dev/null and b/gitbook/_book/gitbook/fonts/fontawesome/FontAwesome.otf differ diff --git a/gitbook/_book/gitbook/fonts/fontawesome/fontawesome-webfont.eot b/gitbook/_book/gitbook/fonts/fontawesome/fontawesome-webfont.eot new file mode 100644 index 00000000..c7b00d2b Binary files /dev/null and b/gitbook/_book/gitbook/fonts/fontawesome/fontawesome-webfont.eot differ diff --git a/gitbook/_book/gitbook/fonts/fontawesome/fontawesome-webfont.svg b/gitbook/_book/gitbook/fonts/fontawesome/fontawesome-webfont.svg new file mode 100644 index 00000000..8b66187f --- /dev/null +++ b/gitbook/_book/gitbook/fonts/fontawesome/fontawesome-webfont.svg @@ -0,0 +1,685 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/gitbook/_book/gitbook/fonts/fontawesome/fontawesome-webfont.ttf b/gitbook/_book/gitbook/fonts/fontawesome/fontawesome-webfont.ttf new file mode 100644 index 00000000..f221e50a Binary files /dev/null and b/gitbook/_book/gitbook/fonts/fontawesome/fontawesome-webfont.ttf differ diff --git a/gitbook/_book/gitbook/fonts/fontawesome/fontawesome-webfont.woff b/gitbook/_book/gitbook/fonts/fontawesome/fontawesome-webfont.woff new file mode 100644 index 00000000..6e7483cf Binary files /dev/null and b/gitbook/_book/gitbook/fonts/fontawesome/fontawesome-webfont.woff differ diff --git a/gitbook/_book/gitbook/fonts/fontawesome/fontawesome-webfont.woff2 b/gitbook/_book/gitbook/fonts/fontawesome/fontawesome-webfont.woff2 new file mode 100644 index 00000000..7eb74fd1 Binary files /dev/null and b/gitbook/_book/gitbook/fonts/fontawesome/fontawesome-webfont.woff2 differ diff --git a/gitbook/_book/gitbook/gitbook-plugin-fontsettings/fontsettings.js b/gitbook/_book/gitbook/gitbook-plugin-fontsettings/fontsettings.js new file mode 100644 index 00000000..ff7be714 --- /dev/null +++ b/gitbook/_book/gitbook/gitbook-plugin-fontsettings/fontsettings.js @@ -0,0 +1,240 @@ +require(['gitbook', 'jquery'], function(gitbook, $) { + // Configuration + var MAX_SIZE = 4, + MIN_SIZE = 0, + BUTTON_ID; + + // Current fontsettings state + var fontState; + + // Default themes + var THEMES = [ + { + config: 'white', + text: 'White', + id: 0 + }, + { + config: 'sepia', + text: 'Sepia', + id: 1 + }, + { + config: 'night', + text: 'Night', + id: 2 + } + ]; + + // Default font families + var FAMILIES = [ + { + config: 'serif', + text: 'Serif', + id: 0 + }, + { + config: 'sans', + text: 'Sans', + id: 1 + } + ]; + + // Return configured themes + function getThemes() { + return THEMES; + } + + // Modify configured themes + function setThemes(themes) { + THEMES = themes; + updateButtons(); + } + + // Return configured font families + function getFamilies() { + return FAMILIES; + } + + // Modify configured font families + function setFamilies(families) { + FAMILIES = families; + updateButtons(); + } + + // Save current font settings + function saveFontSettings() { + gitbook.storage.set('fontState', fontState); + update(); + } + + // Increase font size + function enlargeFontSize(e) { + e.preventDefault(); + if (fontState.size >= MAX_SIZE) return; + + fontState.size++; + saveFontSettings(); + } + + // Decrease font size + function reduceFontSize(e) { + e.preventDefault(); + if (fontState.size <= MIN_SIZE) return; + + fontState.size--; + saveFontSettings(); + } + + // Change font family + function changeFontFamily(configName, e) { + if (e && e instanceof Event) { + e.preventDefault(); + } + + var familyId = getFontFamilyId(configName); + fontState.family = familyId; + saveFontSettings(); + } + + // Change type of color theme + function changeColorTheme(configName, e) { + if (e && e instanceof Event) { + e.preventDefault(); + } + + var $book = gitbook.state.$book; + + // Remove currently applied color theme + if (fontState.theme !== 0) + $book.removeClass('color-theme-'+fontState.theme); + + // Set new color theme + var themeId = getThemeId(configName); + fontState.theme = themeId; + if (fontState.theme !== 0) + $book.addClass('color-theme-'+fontState.theme); + + saveFontSettings(); + } + + // Return the correct id for a font-family config key + // Default to first font-family + function getFontFamilyId(configName) { + // Search for plugin configured font family + var configFamily = $.grep(FAMILIES, function(family) { + return family.config == configName; + })[0]; + // Fallback to default font family + return (!!configFamily)? configFamily.id : 0; + } + + // Return the correct id for a theme config key + // Default to first theme + function getThemeId(configName) { + // Search for plugin configured theme + var configTheme = $.grep(THEMES, function(theme) { + return theme.config == configName; + })[0]; + // Fallback to default theme + return (!!configTheme)? configTheme.id : 0; + } + + function update() { + var $book = gitbook.state.$book; + + $('.font-settings .font-family-list li').removeClass('active'); + $('.font-settings .font-family-list li:nth-child('+(fontState.family+1)+')').addClass('active'); + + $book[0].className = $book[0].className.replace(/\bfont-\S+/g, ''); + $book.addClass('font-size-'+fontState.size); + $book.addClass('font-family-'+fontState.family); + + if(fontState.theme !== 0) { + $book[0].className = $book[0].className.replace(/\bcolor-theme-\S+/g, ''); + $book.addClass('color-theme-'+fontState.theme); + } + } + + function init(config) { + // Search for plugin configured font family + var configFamily = getFontFamilyId(config.family), + configTheme = getThemeId(config.theme); + + // Instantiate font state object + fontState = gitbook.storage.get('fontState', { + size: config.size || 2, + family: configFamily, + theme: configTheme + }); + + update(); + } + + function updateButtons() { + // Remove existing fontsettings buttons + if (!!BUTTON_ID) { + gitbook.toolbar.removeButton(BUTTON_ID); + } + + // Create buttons in toolbar + BUTTON_ID = gitbook.toolbar.createButton({ + icon: 'fa fa-font', + label: 'Font Settings', + className: 'font-settings', + dropdown: [ + [ + { + text: 'A', + className: 'font-reduce', + onClick: reduceFontSize + }, + { + text: 'A', + className: 'font-enlarge', + onClick: enlargeFontSize + } + ], + $.map(FAMILIES, function(family) { + family.onClick = function(e) { + return changeFontFamily(family.config, e); + }; + + return family; + }), + $.map(THEMES, function(theme) { + theme.onClick = function(e) { + return changeColorTheme(theme.config, e); + }; + + return theme; + }) + ] + }); + } + + // Init configuration at start + gitbook.events.bind('start', function(e, config) { + var opts = config.fontsettings; + + // Generate buttons at start + updateButtons(); + + // Init current settings + init(opts); + }); + + // Expose API + gitbook.fontsettings = { + enlargeFontSize: enlargeFontSize, + reduceFontSize: reduceFontSize, + setTheme: changeColorTheme, + setFamily: changeFontFamily, + getThemes: getThemes, + setThemes: setThemes, + getFamilies: getFamilies, + setFamilies: setFamilies + }; +}); + + diff --git a/gitbook/_book/gitbook/gitbook-plugin-fontsettings/website.css b/gitbook/_book/gitbook/gitbook-plugin-fontsettings/website.css new file mode 100644 index 00000000..26591fe8 --- /dev/null +++ b/gitbook/_book/gitbook/gitbook-plugin-fontsettings/website.css @@ -0,0 +1,291 @@ +/* + * Theme 1 + */ +.color-theme-1 .dropdown-menu { + background-color: #111111; + border-color: #7e888b; +} +.color-theme-1 .dropdown-menu .dropdown-caret .caret-inner { + border-bottom: 9px solid #111111; +} +.color-theme-1 .dropdown-menu .buttons { + border-color: #7e888b; +} +.color-theme-1 .dropdown-menu .button { + color: #afa790; +} +.color-theme-1 .dropdown-menu .button:hover { + color: #73553c; +} +/* + * Theme 2 + */ +.color-theme-2 .dropdown-menu { + background-color: #2d3143; + border-color: #272a3a; +} +.color-theme-2 .dropdown-menu .dropdown-caret .caret-inner { + border-bottom: 9px solid #2d3143; +} +.color-theme-2 .dropdown-menu .buttons { + border-color: #272a3a; +} +.color-theme-2 .dropdown-menu .button { + color: #62677f; +} +.color-theme-2 .dropdown-menu .button:hover { + color: #f4f4f5; +} +.book .book-header .font-settings .font-enlarge { + line-height: 30px; + font-size: 1.4em; +} +.book .book-header .font-settings .font-reduce { + line-height: 30px; + font-size: 1em; +} +.book.color-theme-1 .book-body { + color: #704214; + background: #f3eacb; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section { + background: #f3eacb; +} +.book.color-theme-2 .book-body { + color: #bdcadb; + background: #1c1f2b; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section { + background: #1c1f2b; +} +.book.font-size-0 .book-body .page-inner section { + font-size: 1.2rem; +} +.book.font-size-1 .book-body .page-inner section { + font-size: 1.4rem; +} +.book.font-size-2 .book-body .page-inner section { + font-size: 1.6rem; +} +.book.font-size-3 .book-body .page-inner section { + font-size: 2.2rem; +} +.book.font-size-4 .book-body .page-inner section { + font-size: 4rem; +} +.book.font-family-0 { + font-family: Georgia, serif; +} +.book.font-family-1 { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal { + color: #704214; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal a { + color: inherit; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h1, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h2, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h3, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h4, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h5, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h6 { + color: inherit; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h1, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h2 { + border-color: inherit; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h6 { + color: inherit; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal hr { + background-color: inherit; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal blockquote { + border-color: inherit; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code { + background: #fdf6e3; + color: #657b83; + border-color: #f8df9c; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal .highlight { + background-color: inherit; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal table th, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal table td { + border-color: #f5d06c; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal table tr { + color: inherit; + background-color: #fdf6e3; + border-color: #444444; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal table tr:nth-child(2n) { + background-color: #fbeecb; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal { + color: #bdcadb; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal a { + color: #3eb1d0; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h1, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h2, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h3, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h4, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h5, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h6 { + color: #fffffa; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h1, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h2 { + border-color: #373b4e; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h6 { + color: #373b4e; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal hr { + background-color: #373b4e; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal blockquote { + border-color: #373b4e; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code { + color: #9dbed8; + background: #2d3143; + border-color: #2d3143; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal .highlight { + background-color: #282a39; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal table th, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal table td { + border-color: #3b3f54; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal table tr { + color: #b6c2d2; + background-color: #2d3143; + border-color: #3b3f54; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal table tr:nth-child(2n) { + background-color: #35394b; +} +.book.color-theme-1 .book-header { + color: #afa790; + background: transparent; +} +.book.color-theme-1 .book-header .btn { + color: #afa790; +} +.book.color-theme-1 .book-header .btn:hover { + color: #73553c; + background: none; +} +.book.color-theme-1 .book-header h1 { + color: #704214; +} +.book.color-theme-2 .book-header { + color: #7e888b; + background: transparent; +} +.book.color-theme-2 .book-header .btn { + color: #3b3f54; +} +.book.color-theme-2 .book-header .btn:hover { + color: #fffff5; + background: none; +} +.book.color-theme-2 .book-header h1 { + color: #bdcadb; +} +.book.color-theme-1 .book-body .navigation { + color: #afa790; +} +.book.color-theme-1 .book-body .navigation:hover { + color: #73553c; +} +.book.color-theme-2 .book-body .navigation { + color: #383f52; +} +.book.color-theme-2 .book-body .navigation:hover { + color: #fffff5; +} +/* + * Theme 1 + */ +.book.color-theme-1 .book-summary { + color: #afa790; + background: #111111; + border-right: 1px solid rgba(0, 0, 0, 0.07); +} +.book.color-theme-1 .book-summary .book-search { + background: transparent; +} +.book.color-theme-1 .book-summary .book-search input, +.book.color-theme-1 .book-summary .book-search input:focus { + border: 1px solid transparent; +} +.book.color-theme-1 .book-summary ul.summary li.divider { + background: #7e888b; + box-shadow: none; +} +.book.color-theme-1 .book-summary ul.summary li i.fa-check { + color: #33cc33; +} +.book.color-theme-1 .book-summary ul.summary li.done > a { + color: #877f6a; +} +.book.color-theme-1 .book-summary ul.summary li a, +.book.color-theme-1 .book-summary ul.summary li span { + color: #877f6a; + background: transparent; + font-weight: normal; +} +.book.color-theme-1 .book-summary ul.summary li.active > a, +.book.color-theme-1 .book-summary ul.summary li a:hover { + color: #704214; + background: transparent; + font-weight: normal; +} +/* + * Theme 2 + */ +.book.color-theme-2 .book-summary { + color: #bcc1d2; + background: #2d3143; + border-right: none; +} +.book.color-theme-2 .book-summary .book-search { + background: transparent; +} +.book.color-theme-2 .book-summary .book-search input, +.book.color-theme-2 .book-summary .book-search input:focus { + border: 1px solid transparent; +} +.book.color-theme-2 .book-summary ul.summary li.divider { + background: #272a3a; + box-shadow: none; +} +.book.color-theme-2 .book-summary ul.summary li i.fa-check { + color: #33cc33; +} +.book.color-theme-2 .book-summary ul.summary li.done > a { + color: #62687f; +} +.book.color-theme-2 .book-summary ul.summary li a, +.book.color-theme-2 .book-summary ul.summary li span { + color: #c1c6d7; + background: transparent; + font-weight: 600; +} +.book.color-theme-2 .book-summary ul.summary li.active > a, +.book.color-theme-2 .book-summary ul.summary li a:hover { + color: #f4f4f5; + background: #252737; + font-weight: 600; +} diff --git a/gitbook/_book/gitbook/gitbook-plugin-highlight/ebook.css b/gitbook/_book/gitbook/gitbook-plugin-highlight/ebook.css new file mode 100644 index 00000000..cecaaab5 --- /dev/null +++ b/gitbook/_book/gitbook/gitbook-plugin-highlight/ebook.css @@ -0,0 +1,135 @@ +pre, +code { + /* http://jmblog.github.io/color-themes-for-highlightjs */ + /* Tomorrow Comment */ + /* Tomorrow Red */ + /* Tomorrow Orange */ + /* Tomorrow Yellow */ + /* Tomorrow Green */ + /* Tomorrow Aqua */ + /* Tomorrow Blue */ + /* Tomorrow Purple */ +} +pre .hljs-comment, +code .hljs-comment, +pre .hljs-title, +code .hljs-title { + color: #8e908c; +} +pre .hljs-variable, +code .hljs-variable, +pre .hljs-attribute, +code .hljs-attribute, +pre .hljs-tag, +code .hljs-tag, +pre .hljs-regexp, +code .hljs-regexp, +pre .hljs-deletion, +code .hljs-deletion, +pre .ruby .hljs-constant, +code .ruby .hljs-constant, +pre .xml .hljs-tag .hljs-title, +code .xml .hljs-tag .hljs-title, +pre .xml .hljs-pi, +code .xml .hljs-pi, +pre .xml .hljs-doctype, +code .xml .hljs-doctype, +pre .html .hljs-doctype, +code .html .hljs-doctype, +pre .css .hljs-id, +code .css .hljs-id, +pre .css .hljs-class, +code .css .hljs-class, +pre .css .hljs-pseudo, +code .css .hljs-pseudo { + color: #c82829; +} +pre .hljs-number, +code .hljs-number, +pre .hljs-preprocessor, +code .hljs-preprocessor, +pre .hljs-pragma, +code .hljs-pragma, +pre .hljs-built_in, +code .hljs-built_in, +pre .hljs-literal, +code .hljs-literal, +pre .hljs-params, +code .hljs-params, +pre .hljs-constant, +code .hljs-constant { + color: #f5871f; +} +pre .ruby .hljs-class .hljs-title, +code .ruby .hljs-class .hljs-title, +pre .css .hljs-rules .hljs-attribute, +code .css .hljs-rules .hljs-attribute { + color: #eab700; +} +pre .hljs-string, +code .hljs-string, +pre .hljs-value, +code .hljs-value, +pre .hljs-inheritance, +code .hljs-inheritance, +pre .hljs-header, +code .hljs-header, +pre .hljs-addition, +code .hljs-addition, +pre .ruby .hljs-symbol, +code .ruby .hljs-symbol, +pre .xml .hljs-cdata, +code .xml .hljs-cdata { + color: #718c00; +} +pre .css .hljs-hexcolor, +code .css .hljs-hexcolor { + color: #3e999f; +} +pre .hljs-function, +code .hljs-function, +pre .python .hljs-decorator, +code .python .hljs-decorator, +pre .python .hljs-title, +code .python .hljs-title, +pre .ruby .hljs-function .hljs-title, +code .ruby .hljs-function .hljs-title, +pre .ruby .hljs-title .hljs-keyword, +code .ruby .hljs-title .hljs-keyword, +pre .perl .hljs-sub, +code .perl .hljs-sub, +pre .javascript .hljs-title, +code .javascript .hljs-title, +pre .coffeescript .hljs-title, +code .coffeescript .hljs-title { + color: #4271ae; +} +pre .hljs-keyword, +code .hljs-keyword, +pre .javascript .hljs-function, +code .javascript .hljs-function { + color: #8959a8; +} +pre .hljs, +code .hljs { + display: block; + background: white; + color: #4d4d4c; + padding: 0.5em; +} +pre .coffeescript .javascript, +code .coffeescript .javascript, +pre .javascript .xml, +code .javascript .xml, +pre .tex .hljs-formula, +code .tex .hljs-formula, +pre .xml .javascript, +code .xml .javascript, +pre .xml .vbscript, +code .xml .vbscript, +pre .xml .css, +code .xml .css, +pre .xml .hljs-cdata, +code .xml .hljs-cdata { + opacity: 0.5; +} diff --git a/gitbook/_book/gitbook/gitbook-plugin-highlight/website.css b/gitbook/_book/gitbook/gitbook-plugin-highlight/website.css new file mode 100644 index 00000000..6674448f --- /dev/null +++ b/gitbook/_book/gitbook/gitbook-plugin-highlight/website.css @@ -0,0 +1,434 @@ +.book .book-body .page-wrapper .page-inner section.normal pre, +.book .book-body .page-wrapper .page-inner section.normal code { + /* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ + /* Tomorrow Comment */ + /* Tomorrow Red */ + /* Tomorrow Orange */ + /* Tomorrow Yellow */ + /* Tomorrow Green */ + /* Tomorrow Aqua */ + /* Tomorrow Blue */ + /* Tomorrow Purple */ +} +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-comment, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-comment, +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-title, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-title { + color: #8e908c; +} +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-variable, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-variable, +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-attribute, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-attribute, +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-tag, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-tag, +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-regexp, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-regexp, +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-deletion, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-deletion, +.book .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-constant, +.book .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-constant, +.book .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-tag .hljs-title, +.book .book-body .page-wrapper .page-inner section.normal code .xml .hljs-tag .hljs-title, +.book .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-pi, +.book .book-body .page-wrapper .page-inner section.normal code .xml .hljs-pi, +.book .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-doctype, +.book .book-body .page-wrapper .page-inner section.normal code .xml .hljs-doctype, +.book .book-body .page-wrapper .page-inner section.normal pre .html .hljs-doctype, +.book .book-body .page-wrapper .page-inner section.normal code .html .hljs-doctype, +.book .book-body .page-wrapper .page-inner section.normal pre .css .hljs-id, +.book .book-body .page-wrapper .page-inner section.normal code .css .hljs-id, +.book .book-body .page-wrapper .page-inner section.normal pre .css .hljs-class, +.book .book-body .page-wrapper .page-inner section.normal code .css .hljs-class, +.book .book-body .page-wrapper .page-inner section.normal pre .css .hljs-pseudo, +.book .book-body .page-wrapper .page-inner section.normal code .css .hljs-pseudo { + color: #c82829; +} +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-number, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-number, +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-preprocessor, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-preprocessor, +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-pragma, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-pragma, +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-built_in, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-built_in, +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-literal, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-literal, +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-params, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-params, +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-constant, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-constant { + color: #f5871f; +} +.book .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-class .hljs-title, +.book .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-class .hljs-title, +.book .book-body .page-wrapper .page-inner section.normal pre .css .hljs-rules .hljs-attribute, +.book .book-body .page-wrapper .page-inner section.normal code .css .hljs-rules .hljs-attribute { + color: #eab700; +} +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-string, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-string, +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-value, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-value, +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-inheritance, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-inheritance, +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-header, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-header, +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-addition, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-addition, +.book .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-symbol, +.book .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-symbol, +.book .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-cdata, +.book .book-body .page-wrapper .page-inner section.normal code .xml .hljs-cdata { + color: #718c00; +} +.book .book-body .page-wrapper .page-inner section.normal pre .css .hljs-hexcolor, +.book .book-body .page-wrapper .page-inner section.normal code .css .hljs-hexcolor { + color: #3e999f; +} +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-function, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-function, +.book .book-body .page-wrapper .page-inner section.normal pre .python .hljs-decorator, +.book .book-body .page-wrapper .page-inner section.normal code .python .hljs-decorator, +.book .book-body .page-wrapper .page-inner section.normal pre .python .hljs-title, +.book .book-body .page-wrapper .page-inner section.normal code .python .hljs-title, +.book .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-function .hljs-title, +.book .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-function .hljs-title, +.book .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-title .hljs-keyword, +.book .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-title .hljs-keyword, +.book .book-body .page-wrapper .page-inner section.normal pre .perl .hljs-sub, +.book .book-body .page-wrapper .page-inner section.normal code .perl .hljs-sub, +.book .book-body .page-wrapper .page-inner section.normal pre .javascript .hljs-title, +.book .book-body .page-wrapper .page-inner section.normal code .javascript .hljs-title, +.book .book-body .page-wrapper .page-inner section.normal pre .coffeescript .hljs-title, +.book .book-body .page-wrapper .page-inner section.normal code .coffeescript .hljs-title { + color: #4271ae; +} +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-keyword, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-keyword, +.book .book-body .page-wrapper .page-inner section.normal pre .javascript .hljs-function, +.book .book-body .page-wrapper .page-inner section.normal code .javascript .hljs-function { + color: #8959a8; +} +.book .book-body .page-wrapper .page-inner section.normal pre .hljs, +.book .book-body .page-wrapper .page-inner section.normal code .hljs { + display: block; + background: white; + color: #4d4d4c; + padding: 0.5em; +} +.book .book-body .page-wrapper .page-inner section.normal pre .coffeescript .javascript, +.book .book-body .page-wrapper .page-inner section.normal code .coffeescript .javascript, +.book .book-body .page-wrapper .page-inner section.normal pre .javascript .xml, +.book .book-body .page-wrapper .page-inner section.normal code .javascript .xml, +.book .book-body .page-wrapper .page-inner section.normal pre .tex .hljs-formula, +.book .book-body .page-wrapper .page-inner section.normal code .tex .hljs-formula, +.book .book-body .page-wrapper .page-inner section.normal pre .xml .javascript, +.book .book-body .page-wrapper .page-inner section.normal code .xml .javascript, +.book .book-body .page-wrapper .page-inner section.normal pre .xml .vbscript, +.book .book-body .page-wrapper .page-inner section.normal code .xml .vbscript, +.book .book-body .page-wrapper .page-inner section.normal pre .xml .css, +.book .book-body .page-wrapper .page-inner section.normal code .xml .css, +.book .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-cdata, +.book .book-body .page-wrapper .page-inner section.normal code .xml .hljs-cdata { + opacity: 0.5; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code { + /* + +Orginal Style from ethanschoonover.com/solarized (c) Jeremy Hull + +*/ + /* Solarized Green */ + /* Solarized Cyan */ + /* Solarized Blue */ + /* Solarized Yellow */ + /* Solarized Orange */ + /* Solarized Red */ + /* Solarized Violet */ +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs { + display: block; + padding: 0.5em; + background: #fdf6e3; + color: #657b83; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-comment, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-comment, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-template_comment, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-template_comment, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .diff .hljs-header, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .diff .hljs-header, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-doctype, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-doctype, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-pi, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-pi, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .lisp .hljs-string, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .lisp .hljs-string, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-javadoc, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-javadoc { + color: #93a1a1; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-keyword, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-keyword, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-winutils, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-winutils, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .method, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .method, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-addition, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-addition, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-tag, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .css .hljs-tag, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-request, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-request, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-status, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-status, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .nginx .hljs-title, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .nginx .hljs-title { + color: #859900; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-number, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-number, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-command, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-command, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-string, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-string, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-tag .hljs-value, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-tag .hljs-value, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-rules .hljs-value, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-rules .hljs-value, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-phpdoc, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-phpdoc, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .tex .hljs-formula, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .tex .hljs-formula, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-regexp, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-regexp, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-hexcolor, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-hexcolor, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-link_url, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-link_url { + color: #2aa198; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-title, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-title, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-localvars, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-localvars, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-chunk, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-chunk, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-decorator, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-decorator, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-built_in, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-built_in, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-identifier, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-identifier, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .vhdl .hljs-literal, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .vhdl .hljs-literal, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-id, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-id, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-function, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .css .hljs-function { + color: #268bd2; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-attribute, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-attribute, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-variable, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-variable, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .lisp .hljs-body, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .lisp .hljs-body, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .smalltalk .hljs-number, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .smalltalk .hljs-number, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-constant, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-constant, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-class .hljs-title, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-class .hljs-title, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-parent, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-parent, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .haskell .hljs-type, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .haskell .hljs-type, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-link_reference, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-link_reference { + color: #b58900; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-preprocessor, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-preprocessor, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-preprocessor .hljs-keyword, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-preprocessor .hljs-keyword, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-pragma, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-pragma, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-shebang, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-shebang, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-symbol, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-symbol, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-symbol .hljs-string, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-symbol .hljs-string, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .diff .hljs-change, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .diff .hljs-change, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-special, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-special, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-attr_selector, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-attr_selector, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-subst, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-subst, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-cdata, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-cdata, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .clojure .hljs-title, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .clojure .hljs-title, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-pseudo, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .css .hljs-pseudo, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-header, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-header { + color: #cb4b16; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-deletion, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-deletion, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-important, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-important { + color: #dc322f; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-link_label, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-link_label { + color: #6c71c4; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .tex .hljs-formula, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .tex .hljs-formula { + background: #eee8d5; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code { + /* Tomorrow Night Bright Theme */ + /* Original theme - https://github.com/chriskempson/tomorrow-theme */ + /* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ + /* Tomorrow Comment */ + /* Tomorrow Red */ + /* Tomorrow Orange */ + /* Tomorrow Yellow */ + /* Tomorrow Green */ + /* Tomorrow Aqua */ + /* Tomorrow Blue */ + /* Tomorrow Purple */ +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-comment, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-comment, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-title, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-title { + color: #969896; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-variable, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-variable, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-attribute, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-attribute, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-tag, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-tag, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-regexp, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-regexp, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-deletion, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-deletion, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-constant, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-constant, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-tag .hljs-title, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .hljs-tag .hljs-title, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-pi, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .hljs-pi, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-doctype, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .hljs-doctype, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .html .hljs-doctype, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .html .hljs-doctype, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-id, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .css .hljs-id, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-class, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .css .hljs-class, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-pseudo, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .css .hljs-pseudo { + color: #d54e53; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-number, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-number, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-preprocessor, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-preprocessor, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-pragma, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-pragma, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-built_in, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-built_in, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-literal, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-literal, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-params, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-params, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-constant, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-constant { + color: #e78c45; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-class .hljs-title, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-class .hljs-title, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-rules .hljs-attribute, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .css .hljs-rules .hljs-attribute { + color: #e7c547; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-string, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-string, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-value, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-value, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-inheritance, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-inheritance, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-header, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-header, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-addition, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-addition, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-symbol, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-symbol, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-cdata, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .hljs-cdata { + color: #b9ca4a; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-hexcolor, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .css .hljs-hexcolor { + color: #70c0b1; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-function, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-function, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .python .hljs-decorator, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .python .hljs-decorator, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .python .hljs-title, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .python .hljs-title, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-function .hljs-title, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-function .hljs-title, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-title .hljs-keyword, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-title .hljs-keyword, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .perl .hljs-sub, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .perl .hljs-sub, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .javascript .hljs-title, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .javascript .hljs-title, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .coffeescript .hljs-title, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .coffeescript .hljs-title { + color: #7aa6da; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-keyword, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-keyword, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .javascript .hljs-function, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .javascript .hljs-function { + color: #c397d8; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs { + display: block; + background: black; + color: #eaeaea; + padding: 0.5em; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .coffeescript .javascript, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .coffeescript .javascript, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .javascript .xml, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .javascript .xml, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .tex .hljs-formula, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .tex .hljs-formula, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .javascript, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .javascript, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .vbscript, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .vbscript, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .css, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .css, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-cdata, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .hljs-cdata { + opacity: 0.5; +} diff --git a/gitbook/_book/gitbook/gitbook-plugin-lunr/lunr.min.js b/gitbook/_book/gitbook/gitbook-plugin-lunr/lunr.min.js new file mode 100644 index 00000000..6aa6bc7d --- /dev/null +++ b/gitbook/_book/gitbook/gitbook-plugin-lunr/lunr.min.js @@ -0,0 +1,7 @@ +/** + * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 0.5.12 + * Copyright (C) 2015 Oliver Nightingale + * MIT Licensed + * @license + */ +!function(){var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.5.12",t.utils={},t.utils.warn=function(t){return function(e){t.console&&console.warn&&console.warn(e)}}(this),t.EventEmitter=function(){this.events={}},t.EventEmitter.prototype.addListener=function(){var t=Array.prototype.slice.call(arguments),e=t.pop(),n=t;if("function"!=typeof e)throw new TypeError("last argument must be a function");n.forEach(function(t){this.hasHandler(t)||(this.events[t]=[]),this.events[t].push(e)},this)},t.EventEmitter.prototype.removeListener=function(t,e){if(this.hasHandler(t)){var n=this.events[t].indexOf(e);this.events[t].splice(n,1),this.events[t].length||delete this.events[t]}},t.EventEmitter.prototype.emit=function(t){if(this.hasHandler(t)){var e=Array.prototype.slice.call(arguments,1);this.events[t].forEach(function(t){t.apply(void 0,e)})}},t.EventEmitter.prototype.hasHandler=function(t){return t in this.events},t.tokenizer=function(t){return arguments.length&&null!=t&&void 0!=t?Array.isArray(t)?t.map(function(t){return t.toLowerCase()}):t.toString().trim().toLowerCase().split(/[\s\-]+/):[]},t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions={},t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(e){var i=t.Pipeline.registeredFunctions[e];if(!i)throw new Error("Cannot load un-registered function: "+e);n.add(i)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){t.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._stack.indexOf(e);if(-1==i)throw new Error("Cannot find existingFn");i+=1,this._stack.splice(i,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._stack.indexOf(e);if(-1==i)throw new Error("Cannot find existingFn");this._stack.splice(i,0,n)},t.Pipeline.prototype.remove=function(t){var e=this._stack.indexOf(t);-1!=e&&this._stack.splice(e,1)},t.Pipeline.prototype.run=function(t){for(var e=[],n=t.length,i=this._stack.length,o=0;n>o;o++){for(var r=t[o],s=0;i>s&&(r=this._stack[s](r,o,t),void 0!==r);s++);void 0!==r&&e.push(r)}return e},t.Pipeline.prototype.reset=function(){this._stack=[]},t.Pipeline.prototype.toJSON=function(){return this._stack.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Vector=function(){this._magnitude=null,this.list=void 0,this.length=0},t.Vector.Node=function(t,e,n){this.idx=t,this.val=e,this.next=n},t.Vector.prototype.insert=function(e,n){this._magnitude=void 0;var i=this.list;if(!i)return this.list=new t.Vector.Node(e,n,i),this.length++;if(en.idx?n=n.next:(i+=e.val*n.val,e=e.next,n=n.next);return i},t.Vector.prototype.similarity=function(t){return this.dot(t)/(this.magnitude()*t.magnitude())},t.SortedSet=function(){this.length=0,this.elements=[]},t.SortedSet.load=function(t){var e=new this;return e.elements=t,e.length=t.length,e},t.SortedSet.prototype.add=function(){var t,e;for(t=0;t1;){if(r===t)return o;t>r&&(e=o),r>t&&(n=o),i=n-e,o=e+Math.floor(i/2),r=this.elements[o]}return r===t?o:-1},t.SortedSet.prototype.locationFor=function(t){for(var e=0,n=this.elements.length,i=n-e,o=e+Math.floor(i/2),r=this.elements[o];i>1;)t>r&&(e=o),r>t&&(n=o),i=n-e,o=e+Math.floor(i/2),r=this.elements[o];return r>t?o:t>r?o+1:void 0},t.SortedSet.prototype.intersect=function(e){for(var n=new t.SortedSet,i=0,o=0,r=this.length,s=e.length,a=this.elements,h=e.elements;;){if(i>r-1||o>s-1)break;a[i]!==h[o]?a[i]h[o]&&o++:(n.add(a[i]),i++,o++)}return n},t.SortedSet.prototype.clone=function(){var e=new t.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},t.SortedSet.prototype.union=function(t){var e,n,i;return this.length>=t.length?(e=this,n=t):(e=t,n=this),i=e.clone(),i.add.apply(i,n.toArray()),i},t.SortedSet.prototype.toJSON=function(){return this.toArray()},t.Index=function(){this._fields=[],this._ref="id",this.pipeline=new t.Pipeline,this.documentStore=new t.Store,this.tokenStore=new t.TokenStore,this.corpusTokens=new t.SortedSet,this.eventEmitter=new t.EventEmitter,this._idfCache={},this.on("add","remove","update",function(){this._idfCache={}}.bind(this))},t.Index.prototype.on=function(){var t=Array.prototype.slice.call(arguments);return this.eventEmitter.addListener.apply(this.eventEmitter,t)},t.Index.prototype.off=function(t,e){return this.eventEmitter.removeListener(t,e)},t.Index.load=function(e){e.version!==t.version&&t.utils.warn("version mismatch: current "+t.version+" importing "+e.version);var n=new this;return n._fields=e.fields,n._ref=e.ref,n.documentStore=t.Store.load(e.documentStore),n.tokenStore=t.TokenStore.load(e.tokenStore),n.corpusTokens=t.SortedSet.load(e.corpusTokens),n.pipeline=t.Pipeline.load(e.pipeline),n},t.Index.prototype.field=function(t,e){var e=e||{},n={name:t,boost:e.boost||1};return this._fields.push(n),this},t.Index.prototype.ref=function(t){return this._ref=t,this},t.Index.prototype.add=function(e,n){var i={},o=new t.SortedSet,r=e[this._ref],n=void 0===n?!0:n;this._fields.forEach(function(n){var r=this.pipeline.run(t.tokenizer(e[n.name]));i[n.name]=r,t.SortedSet.prototype.add.apply(o,r)},this),this.documentStore.set(r,o),t.SortedSet.prototype.add.apply(this.corpusTokens,o.toArray());for(var s=0;s0&&(i=1+Math.log(this.documentStore.length/n)),this._idfCache[e]=i},t.Index.prototype.search=function(e){var n=this.pipeline.run(t.tokenizer(e)),i=new t.Vector,o=[],r=this._fields.reduce(function(t,e){return t+e.boost},0),s=n.some(function(t){return this.tokenStore.has(t)},this);if(!s)return[];n.forEach(function(e,n,s){var a=1/s.length*this._fields.length*r,h=this,l=this.tokenStore.expand(e).reduce(function(n,o){var r=h.corpusTokens.indexOf(o),s=h.idf(o),l=1,u=new t.SortedSet;if(o!==e){var c=Math.max(3,o.length-e.length);l=1/Math.log(c)}return r>-1&&i.insert(r,a*s*l),Object.keys(h.tokenStore.get(o)).forEach(function(t){u.add(t)}),n.union(u)},new t.SortedSet);o.push(l)},this);var a=o.reduce(function(t,e){return t.intersect(e)});return a.map(function(t){return{ref:t,score:i.similarity(this.documentVector(t))}},this).sort(function(t,e){return e.score-t.score})},t.Index.prototype.documentVector=function(e){for(var n=this.documentStore.get(e),i=n.length,o=new t.Vector,r=0;i>r;r++){var s=n.elements[r],a=this.tokenStore.get(s)[e].tf,h=this.idf(s);o.insert(this.corpusTokens.indexOf(s),a*h)}return o},t.Index.prototype.toJSON=function(){return{version:t.version,fields:this._fields,ref:this._ref,documentStore:this.documentStore.toJSON(),tokenStore:this.tokenStore.toJSON(),corpusTokens:this.corpusTokens.toJSON(),pipeline:this.pipeline.toJSON()}},t.Index.prototype.use=function(t){var e=Array.prototype.slice.call(arguments,1);e.unshift(this),t.apply(this,e)},t.Store=function(){this.store={},this.length=0},t.Store.load=function(e){var n=new this;return n.length=e.length,n.store=Object.keys(e.store).reduce(function(n,i){return n[i]=t.SortedSet.load(e.store[i]),n},{}),n},t.Store.prototype.set=function(t,e){this.has(t)||this.length++,this.store[t]=e},t.Store.prototype.get=function(t){return this.store[t]},t.Store.prototype.has=function(t){return t in this.store},t.Store.prototype.remove=function(t){this.has(t)&&(delete this.store[t],this.length--)},t.Store.prototype.toJSON=function(){return{store:this.store,length:this.length}},t.stemmer=function(){var t={ational:"ate",tional:"tion",enci:"ence",anci:"ance",izer:"ize",bli:"ble",alli:"al",entli:"ent",eli:"e",ousli:"ous",ization:"ize",ation:"ate",ator:"ate",alism:"al",iveness:"ive",fulness:"ful",ousness:"ous",aliti:"al",iviti:"ive",biliti:"ble",logi:"log"},e={icate:"ic",ative:"",alize:"al",iciti:"ic",ical:"ic",ful:"",ness:""},n="[^aeiou]",i="[aeiouy]",o=n+"[^aeiouy]*",r=i+"[aeiou]*",s="^("+o+")?"+r+o,a="^("+o+")?"+r+o+"("+r+")?$",h="^("+o+")?"+r+o+r+o,l="^("+o+")?"+i,u=new RegExp(s),c=new RegExp(h),f=new RegExp(a),d=new RegExp(l),p=/^(.+?)(ss|i)es$/,m=/^(.+?)([^s])s$/,v=/^(.+?)eed$/,y=/^(.+?)(ed|ing)$/,g=/.$/,S=/(at|bl|iz)$/,w=new RegExp("([^aeiouylsz])\\1$"),x=new RegExp("^"+o+i+"[^aeiouwxy]$"),k=/^(.+?[^aeiou])y$/,b=/^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/,E=/^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/,_=/^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/,F=/^(.+?)(s|t)(ion)$/,O=/^(.+?)e$/,P=/ll$/,N=new RegExp("^"+o+i+"[^aeiouwxy]$"),T=function(n){var i,o,r,s,a,h,l;if(n.length<3)return n;if(r=n.substr(0,1),"y"==r&&(n=r.toUpperCase()+n.substr(1)),s=p,a=m,s.test(n)?n=n.replace(s,"$1$2"):a.test(n)&&(n=n.replace(a,"$1$2")),s=v,a=y,s.test(n)){var T=s.exec(n);s=u,s.test(T[1])&&(s=g,n=n.replace(s,""))}else if(a.test(n)){var T=a.exec(n);i=T[1],a=d,a.test(i)&&(n=i,a=S,h=w,l=x,a.test(n)?n+="e":h.test(n)?(s=g,n=n.replace(s,"")):l.test(n)&&(n+="e"))}if(s=k,s.test(n)){var T=s.exec(n);i=T[1],n=i+"i"}if(s=b,s.test(n)){var T=s.exec(n);i=T[1],o=T[2],s=u,s.test(i)&&(n=i+t[o])}if(s=E,s.test(n)){var T=s.exec(n);i=T[1],o=T[2],s=u,s.test(i)&&(n=i+e[o])}if(s=_,a=F,s.test(n)){var T=s.exec(n);i=T[1],s=c,s.test(i)&&(n=i)}else if(a.test(n)){var T=a.exec(n);i=T[1]+T[2],a=c,a.test(i)&&(n=i)}if(s=O,s.test(n)){var T=s.exec(n);i=T[1],s=c,a=f,h=N,(s.test(i)||a.test(i)&&!h.test(i))&&(n=i)}return s=P,a=c,s.test(n)&&a.test(n)&&(s=g,n=n.replace(s,"")),"y"==r&&(n=r.toLowerCase()+n.substr(1)),n};return T}(),t.Pipeline.registerFunction(t.stemmer,"stemmer"),t.stopWordFilter=function(e){return e&&t.stopWordFilter.stopWords[e]!==e?e:void 0},t.stopWordFilter.stopWords={a:"a",able:"able",about:"about",across:"across",after:"after",all:"all",almost:"almost",also:"also",am:"am",among:"among",an:"an",and:"and",any:"any",are:"are",as:"as",at:"at",be:"be",because:"because",been:"been",but:"but",by:"by",can:"can",cannot:"cannot",could:"could",dear:"dear",did:"did","do":"do",does:"does",either:"either","else":"else",ever:"ever",every:"every","for":"for",from:"from",get:"get",got:"got",had:"had",has:"has",have:"have",he:"he",her:"her",hers:"hers",him:"him",his:"his",how:"how",however:"however",i:"i","if":"if","in":"in",into:"into",is:"is",it:"it",its:"its",just:"just",least:"least",let:"let",like:"like",likely:"likely",may:"may",me:"me",might:"might",most:"most",must:"must",my:"my",neither:"neither",no:"no",nor:"nor",not:"not",of:"of",off:"off",often:"often",on:"on",only:"only",or:"or",other:"other",our:"our",own:"own",rather:"rather",said:"said",say:"say",says:"says",she:"she",should:"should",since:"since",so:"so",some:"some",than:"than",that:"that",the:"the",their:"their",them:"them",then:"then",there:"there",these:"these",they:"they","this":"this",tis:"tis",to:"to",too:"too",twas:"twas",us:"us",wants:"wants",was:"was",we:"we",were:"were",what:"what",when:"when",where:"where",which:"which","while":"while",who:"who",whom:"whom",why:"why",will:"will","with":"with",would:"would",yet:"yet",you:"you",your:"your"},t.Pipeline.registerFunction(t.stopWordFilter,"stopWordFilter"),t.trimmer=function(t){var e=t.replace(/^\W+/,"").replace(/\W+$/,"");return""===e?void 0:e},t.Pipeline.registerFunction(t.trimmer,"trimmer"),t.TokenStore=function(){this.root={docs:{}},this.length=0},t.TokenStore.load=function(t){var e=new this;return e.root=t.root,e.length=t.length,e},t.TokenStore.prototype.add=function(t,e,n){var n=n||this.root,i=t[0],o=t.slice(1);return i in n||(n[i]={docs:{}}),0===o.length?(n[i].docs[e.ref]=e,void(this.length+=1)):this.add(o,e,n[i])},t.TokenStore.prototype.has=function(t){if(!t)return!1;for(var e=this.root,n=0;no;o++){for(var r=t[o],s=0;i>s&&(r=this._stack[s](r,o,t),void 0!==r);s++);void 0!==r&&e.push(r)}return e},t.Pipeline.prototype.reset=function(){this._stack=[]},t.Pipeline.prototype.toJSON=function(){return this._stack.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Vector=function(){this._magnitude=null,this.list=void 0,this.length=0},t.Vector.Node=function(t,e,n){this.idx=t,this.val=e,this.next=n},t.Vector.prototype.insert=function(e,n){this._magnitude=void 0;var i=this.list;if(!i)return this.list=new t.Vector.Node(e,n,i),this.length++;if(en.idx?n=n.next:(i+=e.val*n.val,e=e.next,n=n.next);return i},t.Vector.prototype.similarity=function(t){return this.dot(t)/(this.magnitude()*t.magnitude())},t.SortedSet=function(){this.length=0,this.elements=[]},t.SortedSet.load=function(t){var e=new this;return e.elements=t,e.length=t.length,e},t.SortedSet.prototype.add=function(){var t,e;for(t=0;t1;){if(r===t)return o;t>r&&(e=o),r>t&&(n=o),i=n-e,o=e+Math.floor(i/2),r=this.elements[o]}return r===t?o:-1},t.SortedSet.prototype.locationFor=function(t){for(var e=0,n=this.elements.length,i=n-e,o=e+Math.floor(i/2),r=this.elements[o];i>1;)t>r&&(e=o),r>t&&(n=o),i=n-e,o=e+Math.floor(i/2),r=this.elements[o];return r>t?o:t>r?o+1:void 0},t.SortedSet.prototype.intersect=function(e){for(var n=new t.SortedSet,i=0,o=0,r=this.length,s=e.length,a=this.elements,h=e.elements;;){if(i>r-1||o>s-1)break;a[i]!==h[o]?a[i]h[o]&&o++:(n.add(a[i]),i++,o++)}return n},t.SortedSet.prototype.clone=function(){var e=new t.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},t.SortedSet.prototype.union=function(t){var e,n,i;return this.length>=t.length?(e=this,n=t):(e=t,n=this),i=e.clone(),i.add.apply(i,n.toArray()),i},t.SortedSet.prototype.toJSON=function(){return this.toArray()},t.Index=function(){this._fields=[],this._ref="id",this.pipeline=new t.Pipeline,this.documentStore=new t.Store,this.tokenStore=new t.TokenStore,this.corpusTokens=new t.SortedSet,this.eventEmitter=new t.EventEmitter,this._idfCache={},this.on("add","remove","update",function(){this._idfCache={}}.bind(this))},t.Index.prototype.on=function(){var t=Array.prototype.slice.call(arguments);return this.eventEmitter.addListener.apply(this.eventEmitter,t)},t.Index.prototype.off=function(t,e){return this.eventEmitter.removeListener(t,e)},t.Index.load=function(e){e.version!==t.version&&t.utils.warn("version mismatch: current "+t.version+" importing "+e.version);var n=new this;return n._fields=e.fields,n._ref=e.ref,n.documentStore=t.Store.load(e.documentStore),n.tokenStore=t.TokenStore.load(e.tokenStore),n.corpusTokens=t.SortedSet.load(e.corpusTokens),n.pipeline=t.Pipeline.load(e.pipeline),n},t.Index.prototype.field=function(t,e){var e=e||{},n={name:t,boost:e.boost||1};return this._fields.push(n),this},t.Index.prototype.ref=function(t){return this._ref=t,this},t.Index.prototype.add=function(e,n){var i={},o=new t.SortedSet,r=e[this._ref],n=void 0===n?!0:n;this._fields.forEach(function(n){var r=this.pipeline.run(t.tokenizer(e[n.name]));i[n.name]=r,t.SortedSet.prototype.add.apply(o,r)},this),this.documentStore.set(r,o),t.SortedSet.prototype.add.apply(this.corpusTokens,o.toArray());for(var s=0;s0&&(i=1+Math.log(this.documentStore.length/n)),this._idfCache[e]=i},t.Index.prototype.search=function(e){var n=this.pipeline.run(t.tokenizer(e)),i=new t.Vector,o=[],r=this._fields.reduce(function(t,e){return t+e.boost},0),s=n.some(function(t){return this.tokenStore.has(t)},this);if(!s)return[];n.forEach(function(e,n,s){var a=1/s.length*this._fields.length*r,h=this,l=this.tokenStore.expand(e).reduce(function(n,o){var r=h.corpusTokens.indexOf(o),s=h.idf(o),l=1,u=new t.SortedSet;if(o!==e){var c=Math.max(3,o.length-e.length);l=1/Math.log(c)}return r>-1&&i.insert(r,a*s*l),Object.keys(h.tokenStore.get(o)).forEach(function(t){u.add(t)}),n.union(u)},new t.SortedSet);o.push(l)},this);var a=o.reduce(function(t,e){return t.intersect(e)});return a.map(function(t){return{ref:t,score:i.similarity(this.documentVector(t))}},this).sort(function(t,e){return e.score-t.score})},t.Index.prototype.documentVector=function(e){for(var n=this.documentStore.get(e),i=n.length,o=new t.Vector,r=0;i>r;r++){var s=n.elements[r],a=this.tokenStore.get(s)[e].tf,h=this.idf(s);o.insert(this.corpusTokens.indexOf(s),a*h)}return o},t.Index.prototype.toJSON=function(){return{version:t.version,fields:this._fields,ref:this._ref,documentStore:this.documentStore.toJSON(),tokenStore:this.tokenStore.toJSON(),corpusTokens:this.corpusTokens.toJSON(),pipeline:this.pipeline.toJSON()}},t.Index.prototype.use=function(t){var e=Array.prototype.slice.call(arguments,1);e.unshift(this),t.apply(this,e)},t.Store=function(){this.store={},this.length=0},t.Store.load=function(e){var n=new this;return n.length=e.length,n.store=Object.keys(e.store).reduce(function(n,i){return n[i]=t.SortedSet.load(e.store[i]),n},{}),n},t.Store.prototype.set=function(t,e){this.has(t)||this.length++,this.store[t]=e},t.Store.prototype.get=function(t){return this.store[t]},t.Store.prototype.has=function(t){return t in this.store},t.Store.prototype.remove=function(t){this.has(t)&&(delete this.store[t],this.length--)},t.Store.prototype.toJSON=function(){return{store:this.store,length:this.length}},t.stemmer=function(){var t={ational:"ate",tional:"tion",enci:"ence",anci:"ance",izer:"ize",bli:"ble",alli:"al",entli:"ent",eli:"e",ousli:"ous",ization:"ize",ation:"ate",ator:"ate",alism:"al",iveness:"ive",fulness:"ful",ousness:"ous",aliti:"al",iviti:"ive",biliti:"ble",logi:"log"},e={icate:"ic",ative:"",alize:"al",iciti:"ic",ical:"ic",ful:"",ness:""},n="[^aeiou]",i="[aeiouy]",o=n+"[^aeiouy]*",r=i+"[aeiou]*",s="^("+o+")?"+r+o,a="^("+o+")?"+r+o+"("+r+")?$",h="^("+o+")?"+r+o+r+o,l="^("+o+")?"+i,u=new RegExp(s),c=new RegExp(h),f=new RegExp(a),d=new RegExp(l),p=/^(.+?)(ss|i)es$/,m=/^(.+?)([^s])s$/,v=/^(.+?)eed$/,y=/^(.+?)(ed|ing)$/,g=/.$/,S=/(at|bl|iz)$/,w=new RegExp("([^aeiouylsz])\\1$"),x=new RegExp("^"+o+i+"[^aeiouwxy]$"),k=/^(.+?[^aeiou])y$/,b=/^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/,E=/^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/,_=/^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/,F=/^(.+?)(s|t)(ion)$/,O=/^(.+?)e$/,P=/ll$/,N=new RegExp("^"+o+i+"[^aeiouwxy]$"),T=function(n){var i,o,r,s,a,h,l;if(n.length<3)return n;if(r=n.substr(0,1),"y"==r&&(n=r.toUpperCase()+n.substr(1)),s=p,a=m,s.test(n)?n=n.replace(s,"$1$2"):a.test(n)&&(n=n.replace(a,"$1$2")),s=v,a=y,s.test(n)){var T=s.exec(n);s=u,s.test(T[1])&&(s=g,n=n.replace(s,""))}else if(a.test(n)){var T=a.exec(n);i=T[1],a=d,a.test(i)&&(n=i,a=S,h=w,l=x,a.test(n)?n+="e":h.test(n)?(s=g,n=n.replace(s,"")):l.test(n)&&(n+="e"))}if(s=k,s.test(n)){var T=s.exec(n);i=T[1],n=i+"i"}if(s=b,s.test(n)){var T=s.exec(n);i=T[1],o=T[2],s=u,s.test(i)&&(n=i+t[o])}if(s=E,s.test(n)){var T=s.exec(n);i=T[1],o=T[2],s=u,s.test(i)&&(n=i+e[o])}if(s=_,a=F,s.test(n)){var T=s.exec(n);i=T[1],s=c,s.test(i)&&(n=i)}else if(a.test(n)){var T=a.exec(n);i=T[1]+T[2],a=c,a.test(i)&&(n=i)}if(s=O,s.test(n)){var T=s.exec(n);i=T[1],s=c,a=f,h=N,(s.test(i)||a.test(i)&&!h.test(i))&&(n=i)}return s=P,a=c,s.test(n)&&a.test(n)&&(s=g,n=n.replace(s,"")),"y"==r&&(n=r.toLowerCase()+n.substr(1)),n};return T}(),t.Pipeline.registerFunction(t.stemmer,"stemmer"),t.stopWordFilter=function(e){return e&&t.stopWordFilter.stopWords[e]!==e?e:void 0},t.stopWordFilter.stopWords={a:"a",able:"able",about:"about",across:"across",after:"after",all:"all",almost:"almost",also:"also",am:"am",among:"among",an:"an",and:"and",any:"any",are:"are",as:"as",at:"at",be:"be",because:"because",been:"been",but:"but",by:"by",can:"can",cannot:"cannot",could:"could",dear:"dear",did:"did","do":"do",does:"does",either:"either","else":"else",ever:"ever",every:"every","for":"for",from:"from",get:"get",got:"got",had:"had",has:"has",have:"have",he:"he",her:"her",hers:"hers",him:"him",his:"his",how:"how",however:"however",i:"i","if":"if","in":"in",into:"into",is:"is",it:"it",its:"its",just:"just",least:"least",let:"let",like:"like",likely:"likely",may:"may",me:"me",might:"might",most:"most",must:"must",my:"my",neither:"neither",no:"no",nor:"nor",not:"not",of:"of",off:"off",often:"often",on:"on",only:"only",or:"or",other:"other",our:"our",own:"own",rather:"rather",said:"said",say:"say",says:"says",she:"she",should:"should",since:"since",so:"so",some:"some",than:"than",that:"that",the:"the",their:"their",them:"them",then:"then",there:"there",these:"these",they:"they","this":"this",tis:"tis",to:"to",too:"too",twas:"twas",us:"us",wants:"wants",was:"was",we:"we",were:"were",what:"what",when:"when",where:"where",which:"which","while":"while",who:"who",whom:"whom",why:"why",will:"will","with":"with",would:"would",yet:"yet",you:"you",your:"your"},t.Pipeline.registerFunction(t.stopWordFilter,"stopWordFilter"),t.trimmer=function(t){var e=t.replace(/^\W+/,"").replace(/\W+$/,"");return""===e?void 0:e},t.Pipeline.registerFunction(t.trimmer,"trimmer"),t.TokenStore=function(){this.root={docs:{}},this.length=0},t.TokenStore.load=function(t){var e=new this;return e.root=t.root,e.length=t.length,e},t.TokenStore.prototype.add=function(t,e,n){var n=n||this.root,i=t[0],o=t.slice(1);return i in n||(n[i]={docs:{}}),0===o.length?(n[i].docs[e.ref]=e,void(this.length+=1)):this.add(o,e,n[i])},t.TokenStore.prototype.has=function(t){if(!t)return!1;for(var e=this.root,n=0;n element for each result + res.results.forEach(function(res) { + var $li = $('
                                            • ', { + 'class': 'search-results-item' + }); + + var $title = $('

                                              '); + + var $link = $('', { + 'href': gitbook.state.basePath + '/' + res.url, + 'text': res.title + }); + + var content = res.body.trim(); + if (content.length > MAX_DESCRIPTION_SIZE) { + content = content.slice(0, MAX_DESCRIPTION_SIZE).trim()+'...'; + } + var $content = $('

                                              ').html(content); + + $link.appendTo($title); + $title.appendTo($li); + $content.appendTo($li); + $li.appendTo($searchList); + }); + } + + function launchSearch(q) { + // Add class for loading + $body.addClass('with-search'); + $body.addClass('search-loading'); + + // Launch search query + throttle(gitbook.search.query(q, 0, MAX_RESULTS) + .then(function(results) { + displayResults(results); + }) + .always(function() { + $body.removeClass('search-loading'); + }), 1000); + } + + function closeSearch() { + $body.removeClass('with-search'); + $bookSearchResults.removeClass('open'); + } + + function launchSearchFromQueryString() { + var q = getParameterByName('q'); + if (q && q.length > 0) { + // Update search input + $searchInput.val(q); + + // Launch search + launchSearch(q); + } + } + + function bindSearch() { + // Bind DOM + $searchInput = $('#book-search-input input'); + $bookSearchResults = $('#book-search-results'); + $searchList = $bookSearchResults.find('.search-results-list'); + $searchTitle = $bookSearchResults.find('.search-results-title'); + $searchResultsCount = $searchTitle.find('.search-results-count'); + $searchQuery = $searchTitle.find('.search-query'); + + // Launch query based on input content + function handleUpdate() { + var q = $searchInput.val(); + + if (q.length == 0) { + closeSearch(); + } + else { + launchSearch(q); + } + } + + // Detect true content change in search input + // Workaround for IE < 9 + var propertyChangeUnbound = false; + $searchInput.on('propertychange', function(e) { + if (e.originalEvent.propertyName == 'value') { + handleUpdate(); + } + }); + + // HTML5 (IE9 & others) + $searchInput.on('input', function(e) { + // Unbind propertychange event for IE9+ + if (!propertyChangeUnbound) { + $(this).unbind('propertychange'); + propertyChangeUnbound = true; + } + + handleUpdate(); + }); + + // Push to history on blur + $searchInput.on('blur', function(e) { + // Update history state + if (usePushState) { + var uri = updateQueryString('q', $(this).val()); + history.pushState({ path: uri }, null, uri); + } + }); + } + + gitbook.events.on('page.change', function() { + bindSearch(); + closeSearch(); + + // Launch search based on query parameter + if (gitbook.search.isInitialized()) { + launchSearchFromQueryString(); + } + }); + + gitbook.events.on('search.ready', function() { + bindSearch(); + + // Launch search from query param at start + launchSearchFromQueryString(); + }); + + function getParameterByName(name) { + var url = window.location.href; + name = name.replace(/[\[\]]/g, '\\$&'); + var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)', 'i'), + results = regex.exec(url); + if (!results) return null; + if (!results[2]) return ''; + return decodeURIComponent(results[2].replace(/\+/g, ' ')); + } + + function updateQueryString(key, value) { + value = encodeURIComponent(value); + + var url = window.location.href; + var re = new RegExp('([?&])' + key + '=.*?(&|#|$)(.*)', 'gi'), + hash; + + if (re.test(url)) { + if (typeof value !== 'undefined' && value !== null) + return url.replace(re, '$1' + key + '=' + value + '$2$3'); + else { + hash = url.split('#'); + url = hash[0].replace(re, '$1$3').replace(/(&|\?)$/, ''); + if (typeof hash[1] !== 'undefined' && hash[1] !== null) + url += '#' + hash[1]; + return url; + } + } + else { + if (typeof value !== 'undefined' && value !== null) { + var separator = url.indexOf('?') !== -1 ? '&' : '?'; + hash = url.split('#'); + url = hash[0] + separator + key + '=' + value; + if (typeof hash[1] !== 'undefined' && hash[1] !== null) + url += '#' + hash[1]; + return url; + } + else + return url; + } + } +}); diff --git a/gitbook/_book/gitbook/gitbook-plugin-sharing/buttons.js b/gitbook/_book/gitbook/gitbook-plugin-sharing/buttons.js new file mode 100644 index 00000000..709a4e4c --- /dev/null +++ b/gitbook/_book/gitbook/gitbook-plugin-sharing/buttons.js @@ -0,0 +1,90 @@ +require(['gitbook', 'jquery'], function(gitbook, $) { + var SITES = { + 'facebook': { + 'label': 'Facebook', + 'icon': 'fa fa-facebook', + 'onClick': function(e) { + e.preventDefault(); + window.open('http://www.facebook.com/sharer/sharer.php?s=100&p[url]='+encodeURIComponent(location.href)); + } + }, + 'twitter': { + 'label': 'Twitter', + 'icon': 'fa fa-twitter', + 'onClick': function(e) { + e.preventDefault(); + window.open('http://twitter.com/home?status='+encodeURIComponent(document.title+' '+location.href)); + } + }, + 'google': { + 'label': 'Google+', + 'icon': 'fa fa-google-plus', + 'onClick': function(e) { + e.preventDefault(); + window.open('https://plus.google.com/share?url='+encodeURIComponent(location.href)); + } + }, + 'weibo': { + 'label': 'Weibo', + 'icon': 'fa fa-weibo', + 'onClick': function(e) { + e.preventDefault(); + window.open('http://service.weibo.com/share/share.php?content=utf-8&url='+encodeURIComponent(location.href)+'&title='+encodeURIComponent(document.title)); + } + }, + 'instapaper': { + 'label': 'Instapaper', + 'icon': 'fa fa-instapaper', + 'onClick': function(e) { + e.preventDefault(); + window.open('http://www.instapaper.com/text?u='+encodeURIComponent(location.href)); + } + }, + 'vk': { + 'label': 'VK', + 'icon': 'fa fa-vk', + 'onClick': function(e) { + e.preventDefault(); + window.open('http://vkontakte.ru/share.php?url='+encodeURIComponent(location.href)); + } + } + }; + + + + gitbook.events.bind('start', function(e, config) { + var opts = config.sharing; + + // Create dropdown menu + var menu = $.map(opts.all, function(id) { + var site = SITES[id]; + + return { + text: site.label, + onClick: site.onClick + }; + }); + + // Create main button with dropdown + if (menu.length > 0) { + gitbook.toolbar.createButton({ + icon: 'fa fa-share-alt', + label: 'Share', + position: 'right', + dropdown: [menu] + }); + } + + // Direct actions to share + $.each(SITES, function(sideId, site) { + if (!opts[sideId]) return; + + gitbook.toolbar.createButton({ + icon: site.icon, + label: site.text, + position: 'right', + onClick: site.onClick + }); + }); + }); +}); diff --git a/gitbook/_book/gitbook/gitbook.js b/gitbook/_book/gitbook/gitbook.js new file mode 100644 index 00000000..13077b45 --- /dev/null +++ b/gitbook/_book/gitbook/gitbook.js @@ -0,0 +1,4 @@ +!function e(t,n,r){function o(s,a){if(!n[s]){if(!t[s]){var u="function"==typeof require&&require;if(!a&&u)return u(s,!0);if(i)return i(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var l=n[s]={exports:{}};t[s][0].call(l.exports,function(e){var n=t[s][1][e];return o(n?n:e)},l,l.exports,e,t,n,r)}return n[s].exports}for(var i="function"==typeof require&&require,s=0;s0&&t-1 in e)}function o(e,t,n){return de.isFunction(t)?de.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?de.grep(e,function(e){return e===t!==n}):"string"!=typeof t?de.grep(e,function(e){return se.call(t,e)>-1!==n}):je.test(t)?de.filter(t,e,n):(t=de.filter(t,e),de.grep(e,function(e){return se.call(t,e)>-1!==n&&1===e.nodeType}))}function i(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}function s(e){var t={};return de.each(e.match(qe)||[],function(e,n){t[n]=!0}),t}function a(e){return e}function u(e){throw e}function c(e,t,n){var r;try{e&&de.isFunction(r=e.promise)?r.call(e).done(t).fail(n):e&&de.isFunction(r=e.then)?r.call(e,t,n):t.call(void 0,e)}catch(e){n.call(void 0,e)}}function l(){te.removeEventListener("DOMContentLoaded",l),e.removeEventListener("load",l),de.ready()}function f(){this.expando=de.expando+f.uid++}function p(e){return"true"===e||"false"!==e&&("null"===e?null:e===+e+""?+e:Ie.test(e)?JSON.parse(e):e)}function h(e,t,n){var r;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(Pe,"-$&").toLowerCase(),n=e.getAttribute(r),"string"==typeof n){try{n=p(n)}catch(e){}Re.set(e,t,n)}else n=void 0;return n}function d(e,t,n,r){var o,i=1,s=20,a=r?function(){return r.cur()}:function(){return de.css(e,t,"")},u=a(),c=n&&n[3]||(de.cssNumber[t]?"":"px"),l=(de.cssNumber[t]||"px"!==c&&+u)&&$e.exec(de.css(e,t));if(l&&l[3]!==c){c=c||l[3],n=n||[],l=+u||1;do i=i||".5",l/=i,de.style(e,t,l+c);while(i!==(i=a()/u)&&1!==i&&--s)}return n&&(l=+l||+u||0,o=n[1]?l+(n[1]+1)*n[2]:+n[2],r&&(r.unit=c,r.start=l,r.end=o)),o}function g(e){var t,n=e.ownerDocument,r=e.nodeName,o=Ue[r];return o?o:(t=n.body.appendChild(n.createElement(r)),o=de.css(t,"display"),t.parentNode.removeChild(t),"none"===o&&(o="block"),Ue[r]=o,o)}function m(e,t){for(var n,r,o=[],i=0,s=e.length;i-1)o&&o.push(i);else if(c=de.contains(i.ownerDocument,i),s=v(f.appendChild(i),"script"),c&&y(s),n)for(l=0;i=s[l++];)Ve.test(i.type||"")&&n.push(i);return f}function b(){return!0}function w(){return!1}function T(){try{return te.activeElement}catch(e){}}function C(e,t,n,r,o,i){var s,a;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(a in t)C(e,a,n,r,t[a],i);return e}if(null==r&&null==o?(o=n,r=n=void 0):null==o&&("string"==typeof n?(o=r,r=void 0):(o=r,r=n,n=void 0)),o===!1)o=w;else if(!o)return e;return 1===i&&(s=o,o=function(e){return de().off(e),s.apply(this,arguments)},o.guid=s.guid||(s.guid=de.guid++)),e.each(function(){de.event.add(this,t,o,r,n)})}function j(e,t){return de.nodeName(e,"table")&&de.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e:e}function k(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function E(e){var t=rt.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function S(e,t){var n,r,o,i,s,a,u,c;if(1===t.nodeType){if(Fe.hasData(e)&&(i=Fe.access(e),s=Fe.set(t,i),c=i.events)){delete s.handle,s.events={};for(o in c)for(n=0,r=c[o].length;n1&&"string"==typeof d&&!pe.checkClone&&nt.test(d))return e.each(function(n){var i=e.eq(n);g&&(t[0]=d.call(this,n,i.html())),A(i,t,r,o)});if(p&&(i=x(t,e[0].ownerDocument,!1,e,o),s=i.firstChild,1===i.childNodes.length&&(i=s),s||o)){for(a=de.map(v(i,"script"),k),u=a.length;f=0&&nC.cacheLength&&delete e[t.shift()],e[n+" "]=r}var t=[];return e}function r(e){return e[$]=!0,e}function o(e){var t=L.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function i(e,t){for(var n=e.split("|"),r=n.length;r--;)C.attrHandle[n[r]]=t}function s(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function a(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function u(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function c(e){return function(t){return"form"in t?t.parentNode&&t.disabled===!1?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&je(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function l(e){return r(function(t){return t=+t,r(function(n,r){for(var o,i=e([],n.length,t),s=i.length;s--;)n[o=i[s]]&&(n[o]=!(r[o]=n[o]))})})}function f(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function p(){}function h(e){for(var t=0,n=e.length,r="";t1?function(t,n,r){for(var o=e.length;o--;)if(!e[o](t,n,r))return!1;return!0}:e[0]}function m(e,n,r){for(var o=0,i=n.length;o-1&&(r[c]=!(s[c]=f))}}else x=v(x===s?x.splice(d,x.length):x),i?i(null,s,x,u):K.apply(s,x)})}function x(e){for(var t,n,r,o=e.length,i=C.relative[e[0].type],s=i||C.relative[" "],a=i?1:0,u=d(function(e){return e===t},s,!0),c=d(function(e){return ee(t,e)>-1},s,!0),l=[function(e,n,r){var o=!i&&(r||n!==A)||((t=n).nodeType?u(e,n,r):c(e,n,r));return t=null,o}];a1&&g(l),a>1&&h(e.slice(0,a-1).concat({value:" "===e[a-2].type?"*":""})).replace(ae,"$1"),n,a0,i=e.length>0,s=function(r,s,a,u,c){var l,f,p,h=0,d="0",g=r&&[],m=[],y=A,x=r||i&&C.find.TAG("*",c),b=B+=null==y?1:Math.random()||.1,w=x.length;for(c&&(A=s===L||s||c);d!==w&&null!=(l=x[d]);d++){if(i&&l){for(f=0,s||l.ownerDocument===L||(O(l),a=!F);p=e[f++];)if(p(l,s||L,a)){u.push(l);break}c&&(B=b)}o&&((l=!p&&l)&&h--,r&&g.push(l))}if(h+=d,o&&d!==h){for(f=0;p=n[f++];)p(g,m,s,a);if(r){if(h>0)for(;d--;)g[d]||m[d]||(m[d]=Q.call(u));m=v(m)}K.apply(u,m),c&&!r&&m.length>0&&h+n.length>1&&t.uniqueSort(u)}return c&&(B=b,A=y),g};return o?r(s):s}var w,T,C,j,k,E,S,N,A,q,D,O,L,H,F,R,I,P,M,$="sizzle"+1*new Date,W=e.document,B=0,_=0,U=n(),z=n(),X=n(),V=function(e,t){return e===t&&(D=!0),0},G={}.hasOwnProperty,Y=[],Q=Y.pop,J=Y.push,K=Y.push,Z=Y.slice,ee=function(e,t){for(var n=0,r=e.length;n+~]|"+ne+")"+ne+"*"),le=new RegExp("="+ne+"*([^\\]'\"]*?)"+ne+"*\\]","g"),fe=new RegExp(ie),pe=new RegExp("^"+re+"$"),he={ID:new RegExp("^#("+re+")"),CLASS:new RegExp("^\\.("+re+")"),TAG:new RegExp("^("+re+"|[*])"),ATTR:new RegExp("^"+oe),PSEUDO:new RegExp("^"+ie),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ne+"*(even|odd|(([+-]|)(\\d*)n|)"+ne+"*(?:([+-]|)"+ne+"*(\\d+)|))"+ne+"*\\)|)","i"),bool:new RegExp("^(?:"+te+")$","i"),needsContext:new RegExp("^"+ne+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ne+"*((?:-\\d)?\\d*)"+ne+"*\\)|)(?=[^-]|$)","i")},de=/^(?:input|select|textarea|button)$/i,ge=/^h\d$/i,me=/^[^{]+\{\s*\[native \w/,ve=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ye=/[+~]/,xe=new RegExp("\\\\([\\da-f]{1,6}"+ne+"?|("+ne+")|.)","ig"),be=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},we=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,Te=function(e,t){return t?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},Ce=function(){O()},je=d(function(e){return e.disabled===!0&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{K.apply(Y=Z.call(W.childNodes),W.childNodes),Y[W.childNodes.length].nodeType}catch(e){K={apply:Y.length?function(e,t){J.apply(e,Z.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}T=t.support={},k=t.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},O=t.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:W;return r!==L&&9===r.nodeType&&r.documentElement?(L=r,H=L.documentElement,F=!k(L),W!==L&&(n=L.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",Ce,!1):n.attachEvent&&n.attachEvent("onunload",Ce)),T.attributes=o(function(e){return e.className="i",!e.getAttribute("className")}),T.getElementsByTagName=o(function(e){return e.appendChild(L.createComment("")),!e.getElementsByTagName("*").length}),T.getElementsByClassName=me.test(L.getElementsByClassName),T.getById=o(function(e){return H.appendChild(e).id=$,!L.getElementsByName||!L.getElementsByName($).length}),T.getById?(C.filter.ID=function(e){var t=e.replace(xe,be);return function(e){return e.getAttribute("id")===t}},C.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&F){var n=t.getElementById(e);return n?[n]:[]}}):(C.filter.ID=function(e){var t=e.replace(xe,be);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},C.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&F){var n,r,o,i=t.getElementById(e);if(i){if(n=i.getAttributeNode("id"),n&&n.value===e)return[i];for(o=t.getElementsByName(e),r=0;i=o[r++];)if(n=i.getAttributeNode("id"),n&&n.value===e)return[i]}return[]}}),C.find.TAG=T.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):T.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],o=0,i=t.getElementsByTagName(e);if("*"===e){for(;n=i[o++];)1===n.nodeType&&r.push(n);return r}return i},C.find.CLASS=T.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&F)return t.getElementsByClassName(e)},I=[],R=[],(T.qsa=me.test(L.querySelectorAll))&&(o(function(e){H.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&R.push("[*^$]="+ne+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||R.push("\\["+ne+"*(?:value|"+te+")"),e.querySelectorAll("[id~="+$+"-]").length||R.push("~="),e.querySelectorAll(":checked").length||R.push(":checked"),e.querySelectorAll("a#"+$+"+*").length||R.push(".#.+[+~]")}),o(function(e){e.innerHTML="";var t=L.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&R.push("name"+ne+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&R.push(":enabled",":disabled"),H.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&R.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),R.push(",.*:")})),(T.matchesSelector=me.test(P=H.matches||H.webkitMatchesSelector||H.mozMatchesSelector||H.oMatchesSelector||H.msMatchesSelector))&&o(function(e){T.disconnectedMatch=P.call(e,"*"),P.call(e,"[s!='']:x"),I.push("!=",ie)}),R=R.length&&new RegExp(R.join("|")),I=I.length&&new RegExp(I.join("|")),t=me.test(H.compareDocumentPosition),M=t||me.test(H.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},V=t?function(e,t){if(e===t)return D=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n?n:(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,1&n||!T.sortDetached&&t.compareDocumentPosition(e)===n?e===L||e.ownerDocument===W&&M(W,e)?-1:t===L||t.ownerDocument===W&&M(W,t)?1:q?ee(q,e)-ee(q,t):0:4&n?-1:1)}:function(e,t){if(e===t)return D=!0,0;var n,r=0,o=e.parentNode,i=t.parentNode,a=[e],u=[t];if(!o||!i)return e===L?-1:t===L?1:o?-1:i?1:q?ee(q,e)-ee(q,t):0;if(o===i)return s(e,t);for(n=e;n=n.parentNode;)a.unshift(n);for(n=t;n=n.parentNode;)u.unshift(n);for(;a[r]===u[r];)r++;return r?s(a[r],u[r]):a[r]===W?-1:u[r]===W?1:0},L):L},t.matches=function(e,n){return t(e,null,null,n)},t.matchesSelector=function(e,n){if((e.ownerDocument||e)!==L&&O(e),n=n.replace(le,"='$1']"),T.matchesSelector&&F&&!X[n+" "]&&(!I||!I.test(n))&&(!R||!R.test(n)))try{var r=P.call(e,n);if(r||T.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return t(n,L,null,[e]).length>0},t.contains=function(e,t){return(e.ownerDocument||e)!==L&&O(e),M(e,t)},t.attr=function(e,t){(e.ownerDocument||e)!==L&&O(e);var n=C.attrHandle[t.toLowerCase()],r=n&&G.call(C.attrHandle,t.toLowerCase())?n(e,t,!F):void 0;return void 0!==r?r:T.attributes||!F?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},t.escape=function(e){return(e+"").replace(we,Te)},t.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},t.uniqueSort=function(e){var t,n=[],r=0,o=0;if(D=!T.detectDuplicates,q=!T.sortStable&&e.slice(0),e.sort(V),D){for(;t=e[o++];)t===e[o]&&(r=n.push(o));for(;r--;)e.splice(n[r],1)}return q=null,e},j=t.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=j(e)}else if(3===o||4===o)return e.nodeValue}else for(;t=e[r++];)n+=j(t);return n},C=t.selectors={cacheLength:50,createPseudo:r,match:he,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(xe,be),e[3]=(e[3]||e[4]||e[5]||"").replace(xe,be),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||t.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&t.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return he.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&fe.test(n)&&(t=E(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(xe,be).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=U[e+" "];return t||(t=new RegExp("(^|"+ne+")"+e+"("+ne+"|$)"))&&U(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,n,r){return function(o){var i=t.attr(o,e);return null==i?"!="===n:!n||(i+="","="===n?i===r:"!="===n?i!==r:"^="===n?r&&0===i.indexOf(r):"*="===n?r&&i.indexOf(r)>-1:"$="===n?r&&i.slice(-r.length)===r:"~="===n?(" "+i.replace(se," ")+" ").indexOf(r)>-1:"|="===n&&(i===r||i.slice(0,r.length+1)===r+"-"))}},CHILD:function(e,t,n,r,o){var i="nth"!==e.slice(0,3),s="last"!==e.slice(-4),a="of-type"===t;return 1===r&&0===o?function(e){return!!e.parentNode}:function(t,n,u){var c,l,f,p,h,d,g=i!==s?"nextSibling":"previousSibling",m=t.parentNode,v=a&&t.nodeName.toLowerCase(),y=!u&&!a,x=!1;if(m){if(i){for(;g;){for(p=t;p=p[g];)if(a?p.nodeName.toLowerCase()===v:1===p.nodeType)return!1;d=g="only"===e&&!d&&"nextSibling"}return!0}if(d=[s?m.firstChild:m.lastChild],s&&y){for(p=m,f=p[$]||(p[$]={}),l=f[p.uniqueID]||(f[p.uniqueID]={}),c=l[e]||[],h=c[0]===B&&c[1],x=h&&c[2],p=h&&m.childNodes[h];p=++h&&p&&p[g]||(x=h=0)||d.pop();)if(1===p.nodeType&&++x&&p===t){l[e]=[B,h,x];break}}else if(y&&(p=t,f=p[$]||(p[$]={}),l=f[p.uniqueID]||(f[p.uniqueID]={}),c=l[e]||[],h=c[0]===B&&c[1],x=h),x===!1)for(;(p=++h&&p&&p[g]||(x=h=0)||d.pop())&&((a?p.nodeName.toLowerCase()!==v:1!==p.nodeType)||!++x||(y&&(f=p[$]||(p[$]={}),l=f[p.uniqueID]||(f[p.uniqueID]={}),l[e]=[B,x]),p!==t)););return x-=o,x===r||x%r===0&&x/r>=0}}},PSEUDO:function(e,n){var o,i=C.pseudos[e]||C.setFilters[e.toLowerCase()]||t.error("unsupported pseudo: "+e);return i[$]?i(n):i.length>1?(o=[e,e,"",n],C.setFilters.hasOwnProperty(e.toLowerCase())?r(function(e,t){for(var r,o=i(e,n),s=o.length;s--;)r=ee(e,o[s]),e[r]=!(t[r]=o[s])}):function(e){return i(e,0,o)}):i}},pseudos:{not:r(function(e){var t=[],n=[],o=S(e.replace(ae,"$1"));return o[$]?r(function(e,t,n,r){for(var i,s=o(e,null,r,[]),a=e.length;a--;)(i=s[a])&&(e[a]=!(t[a]=i))}):function(e,r,i){return t[0]=e,o(t,null,i,n),t[0]=null,!n.pop()}}),has:r(function(e){return function(n){ +return t(e,n).length>0}}),contains:r(function(e){return e=e.replace(xe,be),function(t){return(t.textContent||t.innerText||j(t)).indexOf(e)>-1}}),lang:r(function(e){return pe.test(e||"")||t.error("unsupported lang: "+e),e=e.replace(xe,be).toLowerCase(),function(t){var n;do if(n=F?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===H},focus:function(e){return e===L.activeElement&&(!L.hasFocus||L.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:c(!1),disabled:c(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!C.pseudos.empty(e)},header:function(e){return ge.test(e.nodeName)},input:function(e){return de.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:l(function(){return[0]}),last:l(function(e,t){return[t-1]}),eq:l(function(e,t,n){return[n<0?n+t:n]}),even:l(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:l(function(e,t,n){for(var r=n<0?n+t:n;++r2&&"ID"===(s=i[0]).type&&9===t.nodeType&&F&&C.relative[i[1].type]){if(t=(C.find.ID(s.matches[0].replace(xe,be),t)||[])[0],!t)return n;c&&(t=t.parentNode),e=e.slice(i.shift().value.length)}for(o=he.needsContext.test(e)?0:i.length;o--&&(s=i[o],!C.relative[a=s.type]);)if((u=C.find[a])&&(r=u(s.matches[0].replace(xe,be),ye.test(i[0].type)&&f(t.parentNode)||t))){if(i.splice(o,1),e=r.length&&h(i),!e)return K.apply(n,r),n;break}}return(c||S(e,l))(r,t,!F,n,!t||ye.test(e)&&f(t.parentNode)||t),n},T.sortStable=$.split("").sort(V).join("")===$,T.detectDuplicates=!!D,O(),T.sortDetached=o(function(e){return 1&e.compareDocumentPosition(L.createElement("fieldset"))}),o(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||i("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),T.attributes&&o(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||i("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),o(function(e){return null==e.getAttribute("disabled")})||i(te,function(e,t,n){var r;if(!n)return e[t]===!0?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),t}(e);de.find=xe,de.expr=xe.selectors,de.expr[":"]=de.expr.pseudos,de.uniqueSort=de.unique=xe.uniqueSort,de.text=xe.getText,de.isXMLDoc=xe.isXML,de.contains=xe.contains,de.escapeSelector=xe.escape;var be=function(e,t,n){for(var r=[],o=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(o&&de(e).is(n))break;r.push(e)}return r},we=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},Te=de.expr.match.needsContext,Ce=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,je=/^.[^:#\[\.,]*$/;de.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?de.find.matchesSelector(r,e)?[r]:[]:de.find.matches(e,de.grep(t,function(e){return 1===e.nodeType}))},de.fn.extend({find:function(e){var t,n,r=this.length,o=this;if("string"!=typeof e)return this.pushStack(de(e).filter(function(){for(t=0;t1?de.uniqueSort(n):n},filter:function(e){return this.pushStack(o(this,e||[],!1))},not:function(e){return this.pushStack(o(this,e||[],!0))},is:function(e){return!!o(this,"string"==typeof e&&Te.test(e)?de(e):e||[],!1).length}});var ke,Ee=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,Se=de.fn.init=function(e,t,n){var r,o;if(!e)return this;if(n=n||ke,"string"==typeof e){if(r="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:Ee.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof de?t[0]:t,de.merge(this,de.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:te,!0)),Ce.test(r[1])&&de.isPlainObject(t))for(r in t)de.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return o=te.getElementById(r[2]),o&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):de.isFunction(e)?void 0!==n.ready?n.ready(e):e(de):de.makeArray(e,this)};Se.prototype=de.fn,ke=de(te);var Ne=/^(?:parents|prev(?:Until|All))/,Ae={children:!0,contents:!0,next:!0,prev:!0};de.fn.extend({has:function(e){var t=de(e,this),n=t.length;return this.filter(function(){for(var e=0;e-1:1===n.nodeType&&de.find.matchesSelector(n,e))){i.push(n);break}return this.pushStack(i.length>1?de.uniqueSort(i):i)},index:function(e){return e?"string"==typeof e?se.call(de(e),this[0]):se.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(de.uniqueSort(de.merge(this.get(),de(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),de.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return be(e,"parentNode")},parentsUntil:function(e,t,n){return be(e,"parentNode",n)},next:function(e){return i(e,"nextSibling")},prev:function(e){return i(e,"previousSibling")},nextAll:function(e){return be(e,"nextSibling")},prevAll:function(e){return be(e,"previousSibling")},nextUntil:function(e,t,n){return be(e,"nextSibling",n)},prevUntil:function(e,t,n){return be(e,"previousSibling",n)},siblings:function(e){return we((e.parentNode||{}).firstChild,e)},children:function(e){return we(e.firstChild)},contents:function(e){return e.contentDocument||de.merge([],e.childNodes)}},function(e,t){de.fn[e]=function(n,r){var o=de.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(o=de.filter(r,o)),this.length>1&&(Ae[e]||de.uniqueSort(o),Ne.test(e)&&o.reverse()),this.pushStack(o)}});var qe=/[^\x20\t\r\n\f]+/g;de.Callbacks=function(e){e="string"==typeof e?s(e):de.extend({},e);var t,n,r,o,i=[],a=[],u=-1,c=function(){for(o=e.once,r=t=!0;a.length;u=-1)for(n=a.shift();++u-1;)i.splice(n,1),n<=u&&u--}),this},has:function(e){return e?de.inArray(e,i)>-1:i.length>0},empty:function(){return i&&(i=[]),this},disable:function(){return o=a=[],i=n="",this},disabled:function(){return!i},lock:function(){return o=a=[],n||t||(i=n=""),this},locked:function(){return!!o},fireWith:function(e,n){return o||(n=n||[],n=[e,n.slice?n.slice():n],a.push(n),t||c()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l},de.extend({Deferred:function(t){var n=[["notify","progress",de.Callbacks("memory"),de.Callbacks("memory"),2],["resolve","done",de.Callbacks("once memory"),de.Callbacks("once memory"),0,"resolved"],["reject","fail",de.Callbacks("once memory"),de.Callbacks("once memory"),1,"rejected"]],r="pending",o={state:function(){return r},always:function(){return i.done(arguments).fail(arguments),this},catch:function(e){return o.then(null,e)},pipe:function(){var e=arguments;return de.Deferred(function(t){de.each(n,function(n,r){var o=de.isFunction(e[r[4]])&&e[r[4]];i[r[1]](function(){var e=o&&o.apply(this,arguments);e&&de.isFunction(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+"With"](this,o?[e]:arguments)})}),e=null}).promise()},then:function(t,r,o){function i(t,n,r,o){return function(){var c=this,l=arguments,f=function(){var e,f;if(!(t=s&&(r!==u&&(c=void 0,l=[e]),n.rejectWith(c,l))}};t?p():(de.Deferred.getStackHook&&(p.stackTrace=de.Deferred.getStackHook()),e.setTimeout(p))}}var s=0;return de.Deferred(function(e){n[0][3].add(i(0,e,de.isFunction(o)?o:a,e.notifyWith)),n[1][3].add(i(0,e,de.isFunction(t)?t:a)),n[2][3].add(i(0,e,de.isFunction(r)?r:u))}).promise()},promise:function(e){return null!=e?de.extend(e,o):o}},i={};return de.each(n,function(e,t){var s=t[2],a=t[5];o[t[1]]=s.add,a&&s.add(function(){r=a},n[3-e][2].disable,n[0][2].lock),s.add(t[3].fire),i[t[0]]=function(){return i[t[0]+"With"](this===i?void 0:this,arguments),this},i[t[0]+"With"]=s.fireWith}),o.promise(i),t&&t.call(i,i),i},when:function(e){var t=arguments.length,n=t,r=Array(n),o=re.call(arguments),i=de.Deferred(),s=function(e){return function(n){r[e]=this,o[e]=arguments.length>1?re.call(arguments):n,--t||i.resolveWith(r,o)}};if(t<=1&&(c(e,i.done(s(n)).resolve,i.reject),"pending"===i.state()||de.isFunction(o[n]&&o[n].then)))return i.then();for(;n--;)c(o[n],s(n),i.reject);return i.promise()}});var De=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;de.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&De.test(t.name)&&e.console.warn("jQuery.Deferred exception: "+t.message,t.stack,n)},de.readyException=function(t){e.setTimeout(function(){throw t})};var Oe=de.Deferred();de.fn.ready=function(e){return Oe.then(e).catch(function(e){de.readyException(e)}),this},de.extend({isReady:!1,readyWait:1,holdReady:function(e){e?de.readyWait++:de.ready(!0)},ready:function(e){(e===!0?--de.readyWait:de.isReady)||(de.isReady=!0,e!==!0&&--de.readyWait>0||Oe.resolveWith(te,[de]))}}),de.ready.then=Oe.then,"complete"===te.readyState||"loading"!==te.readyState&&!te.documentElement.doScroll?e.setTimeout(de.ready):(te.addEventListener("DOMContentLoaded",l),e.addEventListener("load",l));var Le=function(e,t,n,r,o,i,s){var a=0,u=e.length,c=null==n;if("object"===de.type(n)){o=!0;for(a in n)Le(e,t,a,n[a],!0,i,s)}else if(void 0!==r&&(o=!0,de.isFunction(r)||(s=!0),c&&(s?(t.call(e,r),t=null):(c=t,t=function(e,t,n){return c.call(de(e),n)})),t))for(;a1,null,!0)},removeData:function(e){return this.each(function(){Re.remove(this,e)})}}),de.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Fe.get(e,t),n&&(!r||de.isArray(n)?r=Fe.access(e,t,de.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=de.queue(e,t),r=n.length,o=n.shift(),i=de._queueHooks(e,t),s=function(){de.dequeue(e,t)};"inprogress"===o&&(o=n.shift(),r--),o&&("fx"===t&&n.unshift("inprogress"),delete i.stop,o.call(e,s,i)),!r&&i&&i.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Fe.get(e,n)||Fe.access(e,n,{empty:de.Callbacks("once memory").add(function(){Fe.remove(e,[t+"queue",n])})})}}),de.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]+)/i,Ve=/^$|\/(?:java|ecma)script/i,Ge={option:[1,""],thead:[1,"","
                                              "],col:[2,"","
                                              "],tr:[2,"","
                                              "],td:[3,"","
                                              "],_default:[0,"",""]};Ge.optgroup=Ge.option,Ge.tbody=Ge.tfoot=Ge.colgroup=Ge.caption=Ge.thead,Ge.th=Ge.td;var Ye=/<|&#?\w+;/;!function(){var e=te.createDocumentFragment(),t=e.appendChild(te.createElement("div")),n=te.createElement("input");n.setAttribute("type","radio"),n.setAttribute("checked","checked"),n.setAttribute("name","t"),t.appendChild(n),pe.checkClone=t.cloneNode(!0).cloneNode(!0).lastChild.checked,t.innerHTML="",pe.noCloneChecked=!!t.cloneNode(!0).lastChild.defaultValue}();var Qe=te.documentElement,Je=/^key/,Ke=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ze=/^([^.]*)(?:\.(.+)|)/;de.event={global:{},add:function(e,t,n,r,o){var i,s,a,u,c,l,f,p,h,d,g,m=Fe.get(e);if(m)for(n.handler&&(i=n,n=i.handler,o=i.selector),o&&de.find.matchesSelector(Qe,o),n.guid||(n.guid=de.guid++),(u=m.events)||(u=m.events={}),(s=m.handle)||(s=m.handle=function(t){return"undefined"!=typeof de&&de.event.triggered!==t.type?de.event.dispatch.apply(e,arguments):void 0}),t=(t||"").match(qe)||[""],c=t.length;c--;)a=Ze.exec(t[c])||[],h=g=a[1],d=(a[2]||"").split(".").sort(),h&&(f=de.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=de.event.special[h]||{},l=de.extend({type:h,origType:g,data:r,handler:n,guid:n.guid,selector:o,needsContext:o&&de.expr.match.needsContext.test(o),namespace:d.join(".")},i),(p=u[h])||(p=u[h]=[],p.delegateCount=0,f.setup&&f.setup.call(e,r,d,s)!==!1||e.addEventListener&&e.addEventListener(h,s)),f.add&&(f.add.call(e,l),l.handler.guid||(l.handler.guid=n.guid)),o?p.splice(p.delegateCount++,0,l):p.push(l),de.event.global[h]=!0)},remove:function(e,t,n,r,o){var i,s,a,u,c,l,f,p,h,d,g,m=Fe.hasData(e)&&Fe.get(e);if(m&&(u=m.events)){for(t=(t||"").match(qe)||[""],c=t.length;c--;)if(a=Ze.exec(t[c])||[],h=g=a[1],d=(a[2]||"").split(".").sort(),h){for(f=de.event.special[h]||{},h=(r?f.delegateType:f.bindType)||h,p=u[h]||[],a=a[2]&&new RegExp("(^|\\.)"+d.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=i=p.length;i--;)l=p[i],!o&&g!==l.origType||n&&n.guid!==l.guid||a&&!a.test(l.namespace)||r&&r!==l.selector&&("**"!==r||!l.selector)||(p.splice(i,1),l.selector&&p.delegateCount--,f.remove&&f.remove.call(e,l));s&&!p.length&&(f.teardown&&f.teardown.call(e,d,m.handle)!==!1||de.removeEvent(e,h,m.handle),delete u[h])}else for(h in u)de.event.remove(e,h+t[c],n,r,!0);de.isEmptyObject(u)&&Fe.remove(e,"handle events")}},dispatch:function(e){var t,n,r,o,i,s,a=de.event.fix(e),u=new Array(arguments.length),c=(Fe.get(this,"events")||{})[a.type]||[],l=de.event.special[a.type]||{};for(u[0]=a,t=1;t=1))for(;c!==this;c=c.parentNode||this)if(1===c.nodeType&&("click"!==e.type||c.disabled!==!0)){for(i=[],s={},n=0;n-1:de.find(o,this,null,[c]).length),s[o]&&i.push(r);i.length&&a.push({elem:c,handlers:i})}return c=this,u\x20\t\r\n\f]*)[^>]*)\/>/gi,tt=/\s*$/g;de.extend({htmlPrefilter:function(e){return e.replace(et,"<$1>")},clone:function(e,t,n){var r,o,i,s,a=e.cloneNode(!0),u=de.contains(e.ownerDocument,e);if(!(pe.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||de.isXMLDoc(e)))for(s=v(a),i=v(e),r=0,o=i.length;r0&&y(s,!u&&v(e,"script")),a},cleanData:function(e){for(var t,n,r,o=de.event.special,i=0;void 0!==(n=e[i]);i++)if(He(n)){if(t=n[Fe.expando]){if(t.events)for(r in t.events)o[r]?de.event.remove(n,r):de.removeEvent(n,r,t.handle);n[Fe.expando]=void 0}n[Re.expando]&&(n[Re.expando]=void 0)}}}),de.fn.extend({detach:function(e){return q(this,e,!0)},remove:function(e){return q(this,e)},text:function(e){return Le(this,function(e){return void 0===e?de.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return A(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=j(this,e);t.appendChild(e)}})},prepend:function(){return A(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=j(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return A(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return A(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(de.cleanData(v(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return de.clone(this,e,t)})},html:function(e){return Le(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!tt.test(e)&&!Ge[(Xe.exec(e)||["",""])[1].toLowerCase()]){e=de.htmlPrefilter(e);try{for(;n1)}}),de.Tween=I,I.prototype={constructor:I,init:function(e,t,n,r,o,i){this.elem=e,this.prop=n,this.easing=o||de.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=i||(de.cssNumber[n]?"":"px")},cur:function(){var e=I.propHooks[this.prop];return e&&e.get?e.get(this):I.propHooks._default.get(this)},run:function(e){var t,n=I.propHooks[this.prop];return this.options.duration?this.pos=t=de.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):I.propHooks._default.set(this),this}},I.prototype.init.prototype=I.prototype,I.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=de.css(e.elem,e.prop,""),t&&"auto"!==t?t:0)},set:function(e){de.fx.step[e.prop]?de.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[de.cssProps[e.prop]]&&!de.cssHooks[e.prop]?e.elem[e.prop]=e.now:de.style(e.elem,e.prop,e.now+e.unit)}}},I.propHooks.scrollTop=I.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},de.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},de.fx=I.prototype.init,de.fx.step={};var ht,dt,gt=/^(?:toggle|show|hide)$/,mt=/queueHooks$/;de.Animation=de.extend(U,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return d(n.elem,e,$e.exec(t),n),n}]},tweener:function(e,t){de.isFunction(e)?(t=e,e=["*"]):e=e.match(qe);for(var n,r=0,o=e.length;r1)},removeAttr:function(e){return this.each(function(){de.removeAttr(this,e)})}}),de.extend({attr:function(e,t,n){var r,o,i=e.nodeType;if(3!==i&&8!==i&&2!==i)return"undefined"==typeof e.getAttribute?de.prop(e,t,n):(1===i&&de.isXMLDoc(e)||(o=de.attrHooks[t.toLowerCase()]||(de.expr.match.bool.test(t)?vt:void 0)),void 0!==n?null===n?void de.removeAttr(e,t):o&&"set"in o&&void 0!==(r=o.set(e,n,t))?r:(e.setAttribute(t,n+""),n):o&&"get"in o&&null!==(r=o.get(e,t))?r:(r=de.find.attr(e,t),null==r?void 0:r))},attrHooks:{type:{set:function(e,t){if(!pe.radioValue&&"radio"===t&&de.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,o=t&&t.match(qe);if(o&&1===e.nodeType)for(;n=o[r++];)e.removeAttribute(n)}}),vt={set:function(e,t,n){return t===!1?de.removeAttr(e,n):e.setAttribute(n,n),n}},de.each(de.expr.match.bool.source.match(/\w+/g),function(e,t){var n=yt[t]||de.find.attr;yt[t]=function(e,t,r){var o,i,s=t.toLowerCase();return r||(i=yt[s],yt[s]=o,o=null!=n(e,t,r)?s:null,yt[s]=i),o}});var xt=/^(?:input|select|textarea|button)$/i,bt=/^(?:a|area)$/i;de.fn.extend({prop:function(e,t){return Le(this,de.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[de.propFix[e]||e]})}}),de.extend({prop:function(e,t,n){var r,o,i=e.nodeType;if(3!==i&&8!==i&&2!==i)return 1===i&&de.isXMLDoc(e)||(t=de.propFix[t]||t,o=de.propHooks[t]),void 0!==n?o&&"set"in o&&void 0!==(r=o.set(e,n,t))?r:e[t]=n:o&&"get"in o&&null!==(r=o.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=de.find.attr(e,"tabindex");return t?parseInt(t,10):xt.test(e.nodeName)||bt.test(e.nodeName)&&e.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),pe.optSelected||(de.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),de.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){de.propFix[this.toLowerCase()]=this}),de.fn.extend({addClass:function(e){var t,n,r,o,i,s,a,u=0;if(de.isFunction(e))return this.each(function(t){de(this).addClass(e.call(this,t,X(this)))});if("string"==typeof e&&e)for(t=e.match(qe)||[];n=this[u++];)if(o=X(n),r=1===n.nodeType&&" "+z(o)+" "){for(s=0;i=t[s++];)r.indexOf(" "+i+" ")<0&&(r+=i+" ");a=z(r),o!==a&&n.setAttribute("class",a)}return this},removeClass:function(e){var t,n,r,o,i,s,a,u=0;if(de.isFunction(e))return this.each(function(t){de(this).removeClass(e.call(this,t,X(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof e&&e)for(t=e.match(qe)||[];n=this[u++];)if(o=X(n),r=1===n.nodeType&&" "+z(o)+" "){for(s=0;i=t[s++];)for(;r.indexOf(" "+i+" ")>-1;)r=r.replace(" "+i+" "," ");a=z(r),o!==a&&n.setAttribute("class",a)}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):de.isFunction(e)?this.each(function(n){de(this).toggleClass(e.call(this,n,X(this),t),t)}):this.each(function(){var t,r,o,i;if("string"===n)for(r=0,o=de(this),i=e.match(qe)||[];t=i[r++];)o.hasClass(t)?o.removeClass(t):o.addClass(t);else void 0!==e&&"boolean"!==n||(t=X(this),t&&Fe.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||e===!1?"":Fe.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;for(t=" "+e+" ";n=this[r++];)if(1===n.nodeType&&(" "+z(X(n))+" ").indexOf(t)>-1)return!0;return!1}});var wt=/\r/g;de.fn.extend({val:function(e){var t,n,r,o=this[0];{if(arguments.length)return r=de.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=r?e.call(this,n,de(this).val()):e,null==o?o="":"number"==typeof o?o+="":de.isArray(o)&&(o=de.map(o,function(e){return null==e?"":e+""})),t=de.valHooks[this.type]||de.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&void 0!==t.set(this,o,"value")||(this.value=o))});if(o)return t=de.valHooks[o.type]||de.valHooks[o.nodeName.toLowerCase()],t&&"get"in t&&void 0!==(n=t.get(o,"value"))?n:(n=o.value,"string"==typeof n?n.replace(wt,""):null==n?"":n)}}}),de.extend({valHooks:{option:{get:function(e){var t=de.find.attr(e,"value");return null!=t?t:z(de.text(e))}},select:{get:function(e){var t,n,r,o=e.options,i=e.selectedIndex,s="select-one"===e.type,a=s?null:[],u=s?i+1:o.length;for(r=i<0?u:s?i:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),i}}}}),de.each(["radio","checkbox"],function(){de.valHooks[this]={set:function(e,t){if(de.isArray(t))return e.checked=de.inArray(de(e).val(),t)>-1}},pe.checkOn||(de.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Tt=/^(?:focusinfocus|focusoutblur)$/;de.extend(de.event,{trigger:function(t,n,r,o){var i,s,a,u,c,l,f,p=[r||te],h=ce.call(t,"type")?t.type:t,d=ce.call(t,"namespace")?t.namespace.split("."):[];if(s=a=r=r||te,3!==r.nodeType&&8!==r.nodeType&&!Tt.test(h+de.event.triggered)&&(h.indexOf(".")>-1&&(d=h.split("."),h=d.shift(),d.sort()),c=h.indexOf(":")<0&&"on"+h,t=t[de.expando]?t:new de.Event(h,"object"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=d.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+d.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=r),n=null==n?[t]:de.makeArray(n,[t]),f=de.event.special[h]||{},o||!f.trigger||f.trigger.apply(r,n)!==!1)){if(!o&&!f.noBubble&&!de.isWindow(r)){for(u=f.delegateType||h,Tt.test(u+h)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(r.ownerDocument||te)&&p.push(a.defaultView||a.parentWindow||e)}for(i=0;(s=p[i++])&&!t.isPropagationStopped();)t.type=i>1?u:f.bindType||h,l=(Fe.get(s,"events")||{})[t.type]&&Fe.get(s,"handle"),l&&l.apply(s,n),l=c&&s[c],l&&l.apply&&He(s)&&(t.result=l.apply(s,n),t.result===!1&&t.preventDefault());return t.type=h,o||t.isDefaultPrevented()||f._default&&f._default.apply(p.pop(),n)!==!1||!He(r)||c&&de.isFunction(r[h])&&!de.isWindow(r)&&(a=r[c],a&&(r[c]=null),de.event.triggered=h,r[h](),de.event.triggered=void 0,a&&(r[c]=a)),t.result}},simulate:function(e,t,n){var r=de.extend(new de.Event,n,{type:e,isSimulated:!0});de.event.trigger(r,null,t)}}),de.fn.extend({trigger:function(e,t){return this.each(function(){de.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return de.event.trigger(e,t,n,!0)}}),de.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,t){de.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),de.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),pe.focusin="onfocusin"in e,pe.focusin||de.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){de.event.simulate(t,e.target,de.event.fix(e))};de.event.special[t]={setup:function(){var r=this.ownerDocument||this,o=Fe.access(r,t);o||r.addEventListener(e,n,!0),Fe.access(r,t,(o||0)+1)},teardown:function(){var r=this.ownerDocument||this,o=Fe.access(r,t)-1;o?Fe.access(r,t,o):(r.removeEventListener(e,n,!0),Fe.remove(r,t))}}});var Ct=e.location,jt=de.now(),kt=/\?/;de.parseXML=function(t){var n;if(!t||"string"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,"text/xml")}catch(e){n=void 0}return n&&!n.getElementsByTagName("parsererror").length||de.error("Invalid XML: "+t),n};var Et=/\[\]$/,St=/\r?\n/g,Nt=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;de.param=function(e,t){var n,r=[],o=function(e,t){var n=de.isFunction(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(de.isArray(e)||e.jquery&&!de.isPlainObject(e))de.each(e,function(){o(this.name,this.value)});else for(n in e)V(n,e[n],t,o);return r.join("&")},de.fn.extend({serialize:function(){return de.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=de.prop(this,"elements");return e?de.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!de(this).is(":disabled")&&At.test(this.nodeName)&&!Nt.test(e)&&(this.checked||!ze.test(e))}).map(function(e,t){var n=de(this).val();return null==n?null:de.isArray(n)?de.map(n,function(e){return{name:t.name,value:e.replace(St,"\r\n")}}):{name:t.name,value:n.replace(St,"\r\n")}}).get()}});var qt=/%20/g,Dt=/#.*$/,Ot=/([?&])_=[^&]*/,Lt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Ht=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Ft=/^(?:GET|HEAD)$/,Rt=/^\/\//,It={},Pt={},Mt="*/".concat("*"),$t=te.createElement("a");$t.href=Ct.href,de.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ct.href,type:"GET",isLocal:Ht.test(Ct.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Mt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":de.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Q(Q(e,de.ajaxSettings),t):Q(de.ajaxSettings,e)},ajaxPrefilter:G(It),ajaxTransport:G(Pt),ajax:function(t,n){function r(t,n,r,a){var c,p,h,b,w,T=n;l||(l=!0,u&&e.clearTimeout(u),o=void 0,s=a||"",C.readyState=t>0?4:0,c=t>=200&&t<300||304===t,r&&(b=J(d,C,r)),b=K(d,b,C,c),c?(d.ifModified&&(w=C.getResponseHeader("Last-Modified"),w&&(de.lastModified[i]=w),w=C.getResponseHeader("etag"),w&&(de.etag[i]=w)),204===t||"HEAD"===d.type?T="nocontent":304===t?T="notmodified":(T=b.state,p=b.data,h=b.error,c=!h)):(h=T,!t&&T||(T="error",t<0&&(t=0))),C.status=t,C.statusText=(n||T)+"",c?v.resolveWith(g,[p,T,C]):v.rejectWith(g,[C,T,h]),C.statusCode(x),x=void 0,f&&m.trigger(c?"ajaxSuccess":"ajaxError",[C,d,c?p:h]),y.fireWith(g,[C,T]),f&&(m.trigger("ajaxComplete",[C,d]),--de.active||de.event.trigger("ajaxStop")))}"object"==typeof t&&(n=t,t=void 0),n=n||{};var o,i,s,a,u,c,l,f,p,h,d=de.ajaxSetup({},n),g=d.context||d,m=d.context&&(g.nodeType||g.jquery)?de(g):de.event,v=de.Deferred(),y=de.Callbacks("once memory"),x=d.statusCode||{},b={},w={},T="canceled",C={readyState:0,getResponseHeader:function(e){var t;if(l){if(!a)for(a={};t=Lt.exec(s);)a[t[1].toLowerCase()]=t[2];t=a[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return l?s:null},setRequestHeader:function(e,t){return null==l&&(e=w[e.toLowerCase()]=w[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==l&&(d.mimeType=e),this},statusCode:function(e){var t;if(e)if(l)C.always(e[C.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||T;return o&&o.abort(t),r(0,t),this}};if(v.promise(C),d.url=((t||d.url||Ct.href)+"").replace(Rt,Ct.protocol+"//"),d.type=n.method||n.type||d.method||d.type,d.dataTypes=(d.dataType||"*").toLowerCase().match(qe)||[""],null==d.crossDomain){c=te.createElement("a");try{c.href=d.url,c.href=c.href,d.crossDomain=$t.protocol+"//"+$t.host!=c.protocol+"//"+c.host}catch(e){d.crossDomain=!0}}if(d.data&&d.processData&&"string"!=typeof d.data&&(d.data=de.param(d.data,d.traditional)),Y(It,d,n,C),l)return C;f=de.event&&d.global,f&&0===de.active++&&de.event.trigger("ajaxStart"),d.type=d.type.toUpperCase(),d.hasContent=!Ft.test(d.type),i=d.url.replace(Dt,""),d.hasContent?d.data&&d.processData&&0===(d.contentType||"").indexOf("application/x-www-form-urlencoded")&&(d.data=d.data.replace(qt,"+")):(h=d.url.slice(i.length),d.data&&(i+=(kt.test(i)?"&":"?")+d.data,delete d.data),d.cache===!1&&(i=i.replace(Ot,"$1"),h=(kt.test(i)?"&":"?")+"_="+jt++ +h),d.url=i+h),d.ifModified&&(de.lastModified[i]&&C.setRequestHeader("If-Modified-Since",de.lastModified[i]),de.etag[i]&&C.setRequestHeader("If-None-Match",de.etag[i])),(d.data&&d.hasContent&&d.contentType!==!1||n.contentType)&&C.setRequestHeader("Content-Type",d.contentType),C.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+("*"!==d.dataTypes[0]?", "+Mt+"; q=0.01":""):d.accepts["*"]);for(p in d.headers)C.setRequestHeader(p,d.headers[p]);if(d.beforeSend&&(d.beforeSend.call(g,C,d)===!1||l))return C.abort();if(T="abort",y.add(d.complete),C.done(d.success),C.fail(d.error),o=Y(Pt,d,n,C)){if(C.readyState=1,f&&m.trigger("ajaxSend",[C,d]),l)return C;d.async&&d.timeout>0&&(u=e.setTimeout(function(){C.abort("timeout")},d.timeout));try{l=!1,o.send(b,r)}catch(e){if(l)throw e;r(-1,e)}}else r(-1,"No Transport");return C},getJSON:function(e,t,n){return de.get(e,t,n,"json")},getScript:function(e,t){return de.get(e,void 0,t,"script")}}),de.each(["get","post"],function(e,t){de[t]=function(e,n,r,o){return de.isFunction(n)&&(o=o||r,r=n,n=void 0),de.ajax(de.extend({url:e,type:t,dataType:o,data:n,success:r},de.isPlainObject(e)&&e))}}),de._evalUrl=function(e){return de.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,throws:!0})},de.fn.extend({wrapAll:function(e){var t;return this[0]&&(de.isFunction(e)&&(e=e.call(this[0])),t=de(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstElementChild;)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return de.isFunction(e)?this.each(function(t){de(this).wrapInner(e.call(this,t))}):this.each(function(){var t=de(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=de.isFunction(e);return this.each(function(n){de(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){de(this).replaceWith(this.childNodes)}),this}}),de.expr.pseudos.hidden=function(e){return!de.expr.pseudos.visible(e)},de.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},de.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var Wt={0:200,1223:204},Bt=de.ajaxSettings.xhr();pe.cors=!!Bt&&"withCredentials"in Bt,pe.ajax=Bt=!!Bt,de.ajaxTransport(function(t){var n,r;if(pe.cors||Bt&&!t.crossDomain)return{send:function(o,i){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest");for(s in o)a.setRequestHeader(s,o[s]);n=function(e){return function(){n&&(n=r=a.onload=a.onerror=a.onabort=a.onreadystatechange=null,"abort"===e?a.abort():"error"===e?"number"!=typeof a.status?i(0,"error"):i(a.status,a.statusText):i(Wt[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=n(),r=a.onerror=n("error"),void 0!==a.onabort?a.onabort=r:a.onreadystatechange=function(){4===a.readyState&&e.setTimeout(function(){n&&r()})},n=n("abort");try{a.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),de.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),de.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return de.globalEval(e),e}}}),de.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),de.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(r,o){t=de(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gitbook/_book/search_index.json b/gitbook/_book/search_index.json new file mode 100644 index 00000000..14b6b582 --- /dev/null +++ b/gitbook/_book/search_index.json @@ -0,0 +1 @@ +{"index":{"version":"0.5.12","fields":[{"name":"title","boost":10},{"name":"keywords","boost":15},{"name":"body","boost":1}],"ref":"url","documentStore":{"store":{"./":["crawlab","crawlab主要解决的是大量爬虫管理困难的问题,例如需要监控上百个网站的参杂scrapy和selenium的项目不容易做到同时管理,而且命令行管理的成本非常高,还容易出错。crawlab支持任何语言和任何框架,配合任务调度、任务监控,很容易做到对成规模的爬虫项目进行有效监控管理。","crawlab是基于celery的分布式爬虫管理平台,可以集成任何语言和任何框架。","crawlab简介","demo","基于celery的爬虫分布式爬虫管理平台,支持多种编程语言以及多种爬虫框架.","本使用手册会帮助您解决在安装使用crawlab遇到的任何问题。","查看演示","项目自今年三月份上线以来受到爬虫爱好者们和开发者们的好评,不少使用者还表示会用crawlab搭建公司的爬虫平台。经过近3个月的迭代,我们陆续上线了定时任务、数据分析、网站信息、可配置爬虫、自动提取字段、下载结果、上传爬虫等功能,将crawlab打造得更加实用,更加全面,能够真正帮助用户解决爬虫管理困难的问题。","首先,我们来看如何安装crawlab吧,请查看安装。"],"Installation/":["docker","安装crawlab","本小节将介绍三种安装docker的方式:","直接部署","预览模式"],"Installation/Docker.html":["\"27017:27017\"","\"6379:6379\"","\"8000:8000\"","\"8001:8000\"","\"8002:8000\"","\"8080:8080\"","\"registri","#","'3.3'","/bin/sh","/home/yeqing/.env.production.master:/opt/crawlab/frontend/.env.product","/home/yeqing/.env.production.worker:/opt/crawlab/frontend/.env.product","/home/yeqing/.env.production:/opt/crawlab/frontend/.env.product","/home/yeqing/config.master.py:/opt/crawlab/crawlab/config/config.pi","/home/yeqing/config.py:/opt/crawlab/crawlab/config/config.pi","/home/yeqing/config.worker.py:/opt/crawlab/crawlab/config/config.pi","/opt/crawlab/docker_init.sh","27017:27017","30秒的时间来build前端静态文件,之后就可以打开crawlab界面地址地址看到界面了。界面地址默认为http://localhost:8080。","8000:8000","8080:8080","[\"https://registry.dock","\\","alway","app","cn.com\"]","compos","compose.yml后,只需要运行以下命令就可以启动crawlab。","compose.yml定义如下。","compose.yml更改为如下内容。","compose.yml的yaml文件来定义需要启动的容器,可以是单个,也可以(通常)是多个的。crawlab的dock","compose也很简单,大家去网上百度一下就可以了。","compose和定义好dock","compose是一个集群管理方式,可以利用名为dock","compose的方式很适合多节点部署,在原有的master基础上增加几个worker节点,达到多节点部署的目的。将dock","compose的方式来部署。dock","container_name:","crawlab","d","depends_on:","docker","docker安装部署","entrypoint:","image:","master","master:","mirrors\":","mongo","mongo:","mongo:latest","mongo一行命令。如何安装docker跟操作系统有关,这里就不展开讲了,需要的同学自行百度一下相关教程。","name","nginx","p","ports:","pull","redi","redis:","redis:latest","restart:","rm","run","services:","tikazyq/crawlab","tikazyq/crawlab:latest","up","v","version:","volumns:","worker","worker1:","worker2:","{","}","下载镜像","其中,我们映射了8080端口(nginx前端静态文件)以及8000端口(后端api)到宿主机。另外还将前端配置文件/home/yeqing/.env.production和后端配置文件/home/yeqing/config.py映射到了容器相应的目录下。传入参数master是代表该启动方式为主机启动模式,也就是所有服务(前端、api、flower、worker)都会启动。另外一个模式是worker模式,只会启动必要的api和worker服务,这个对于分布式部署比较有用。等待大约20","前端配置文件","同样,在浏览器中输入http://localhost:8080就可以看到界面。","后端配置文件","多节点模式","安装docker","安装完docker","对docker不了解的开发者,可以参考一下这篇文章(9102","年了,学点","当然,也可以用docker","我们已经在dockerhub上构建了crawlab的镜像,开发者只需要将其pull下来使用。在pul","执行以下命令将crawlab的镜像下载下来。镜像大小大概在几百兆,因此下载需要几分钟时间。","拷贝一份后端配置文件./crawlab/config/config.py以及前端配置文件./frontend/.env.production到某一个地方。例如我的例子,分别为/home/yeqing/config.py和/home/yeqing/.env.production。","更改后端配置文件config.py,将mongodb、redis的指向ip更改为自己数据的值。注意,容器中对应的宿主机的ip地址不是localhost,而是172.17.0.1(当然也可以用network来做,只是稍微麻烦一些)。更改前端配置文件.env.production,将api地址vue_app_base_url更改为宿主机所在的ip地址,例如http://192.168.0.8:8000,这将是前端调用api会用到的url。","更改好配置文件之后,接下来就是运行容器了。执行以下命令来启动容器。","更改配置文件","知识)做进一步了解。简单来说,docker可以利用已存在的镜像帮助构建一些常用的服务和应用,例如nginx、mongodb、redis等等。用docker运行一个mongodb服务仅需dock","运行docker容器","这应该是部署应用的最方便也是最节省时间的方式了。在最近的一次版本更新v0.2.3中,我们发布了docker功能,让大家可以利用docker来轻松部署crawlab。下面将一步一步介绍如何使用docker来部署crawlab。","这样的话,pull镜像的速度会比不改变镜像源的速度快很多。","这里先定义了master节点,也就是crawlab的主节点。master依赖于mongo和redis容器,因此在启动之前会同时启动mongo和redis容器。这样就不需要单独配置mongo和redis服务了,大大节省了环境配置的时间。","这里启动了多增加了两个worker节点,以worker模式启动。这样,多节点部署,也就是分布式部署就完成了。","镜像之前,我们需要配置一下镜像源。因为我们在墙内,使用原有的镜像源速度非常感人,因此将使用dockerhub在国内的加速器。创建/etc/docker/daemon.json文件,在其中输入如下内容。"],"Installation/Direct.html":["#","../crawlab","../frontend","/home/yeqing/jenkins_home/workspace/crawlab_develop/frontend/dist;","16.04是以下命令。","8080;","[app]","api服务","app.pi","apt","build:prod","cd","clone","dev.crawlab.com;","flower","flower.pi","frontend","g","git","https://github.com/tikazyq/crawlab","index","index.html;","instal","listen","log","nginx","npm","pip","pm2","r","reload","requir","root","run","server","server_nam","start","sudo","worker","worker.pi","yarn","{","}","其中,root是静态文件的根目录,这里是npm打包好后的静态文件。","分别配置前端配置文件./frontend/.env.production和后端配置文件./crawlab/config/config.py。分别需要对部署后api地址以及数据库地址进行配置。","启动服务","安装","安装nginx,在ubuntu","安装前端所需库。","安装后端所需库。","拉取代码","构建","构建完成后,会在./frontend目录下创建一个dist文件夹,里面是打包好后的静态文件。","添加/etc/nginx/conf.d/crawlab.conf文件,输入以下内容。","然后在浏览器中输入http://localhost:8080就可以看到界面了。","现在,只需要启动nginx服务就完成了启动前端服务。","直接部署","直接部署是之前没有docker时的部署方式,相对于docker部署来说有些繁琐。但了解如何直接部署可以帮助更深入地理解docker是如何构建crawlab镜像的。这里简单介绍一下。","这样,pm2会启动3个守护进程来管理这3个服务。我们如果想看后端服务的日志的话,可以执行以下命令。","这里是指启动后端服务。我们用pm2来管理进程。执行以下命令。","这里的构建是指前端构建,需要执行以下命令。","配置","首先是将github上的代码拉取到本地。"],"Installation/Preview.html":["manage.pi","python","run","serv","serve来进行的,因此是开发者模式。注意:强烈不建议在生产环境中用预览模式。预览模式只是让开发者快速体验crawlab以及调试代码问题的一种方式,而不是用作生产环境部署的。","该模式同样会启动3个后端服务和1个前端服务。前端服务是通过npm","预览模式","预览模式是一种让用户比较快的上手的一种部署模式。跟直接部署类似,但不用经过构建、nginx和启动服务的步骤。在启动时只需要执行以下命令就可以了。相较于直接部署来说方便一些。"],"Usage/":["任务","使用crawlab","定时任务","本小节将介绍如何使用crawlab,包括如下内容:","爬虫","节点"],"Usage/Node/":["修改节点信息","查看节点","节点","节点其实就是celery中的worker。一个节点运行时会连接到一个任务队列(例如redis)来接收和运行任务。所有爬虫需要在运行时被部署到节点上,用户在部署前需要定义节点的ip地址和端口(默认为localhost:8000)。"],"Usage/Node/View.html":["worker,他们通过连接到配置好的broker(通常是redis)来进行与主机的通信。","查看节点列表","点击侧边栏的节点导航至节点列表,可以看到已上线的节点。这里的节点其实就是已经运行起来的celeri"],"Usage/Node/Edit.html":["修改节点信息","后面我们需要让爬虫运行在各个节点上,需要让主机与节点进行通信,因此需要知道节点的ip地址和端口。我们需要手动配置一下节点的ip和端口。在节点列表中点击操作列里的蓝色查看按钮进入到节点详情。节点详情样子如下。","在右侧分别输入该节点对应的节点ip和节点端口,然后点击保存按钮,保存该节点信息。","这样,我们就完成了节点的配置工作。"],"Usage/Spider/":["创建爬虫","可配置爬虫","爬虫","爬虫就是我们通常说的网络爬虫了,本小节将介绍如下内容:","统计数据","运行爬虫","部署爬虫"],"Usage/Spider/Create.html":["crawlab允许用户创建两种爬虫:","创建爬虫","前者可以通过web界面和创建项目目录的方式来添加,后者由于没有源代码,只能通过web界面来添加。","可配置爬虫","自定义爬虫"],"Usage/Spider/CustomizedSpider.html":["crawlab会自动发现project_source_file_folder目录下的所有爬虫目录,并将这些目录生成自定义爬虫并集成到crawlab中。因此,将爬虫项目目录拷贝到project_source_file_folder目录下,就可以添加一个爬虫了。","在定义爬虫中,我们需要配置一下执行命令(运行爬虫时后台执行的shell命令)和结果集(通过crawlab_collection传递给爬虫程序,爬虫程序存储结果的地方),然后点击保存按钮保存爬虫信息。","在通过web界面上传之前,需要将爬虫项目文件打包成zip格式。","接下来,我们就可以部署、运行自定义爬虫了。","然后,在侧边栏点击爬虫导航至爬虫列表,点击添加爬虫按钮,选择自定义爬虫,点击上传按钮,选择刚刚打包好的zip文件。上传成功后,爬虫列表中会出现新添加的自定义爬虫。这样就算添加好了。","自定义爬虫","自定义爬虫是指用户可以添加的任何语言任何框架的爬虫,高度自定义化。当用户添加好自定义爬虫之后,crawlab就可以将其集成到爬虫管理的系统中来。","自定义爬虫的添加有两种方式:","这个方式稍微有些繁琐,但是对于无法轻松获取服务器的读写权限时是非常有用的,适合在生产环境上使用。","这种方式非常方便,但是需要获得主机服务器的读写权限,因而比较适合在开发环境上采用。","通过web界面上传","通过web界面上传爬虫","通过创建项目目录","通过添加项目目录","配置爬虫"],"Usage/Spider/ConfigurableSpider.html":["&","crawlab的可配置爬虫是基于scrapy的,因此天生支持并发。而且,可配置爬虫完全支持自定义爬虫的一般功能,因此也支持任务调度、任务监控、日志监控、数据分析。","仅列表页。这也是最简单的形式,爬虫遍历列表上的列表项,将数据抓取下来。","仅详情页。爬虫只抓取详情页。","分页选择器","列表+详情页。爬虫先遍历列表页,将列表项中的详情页地址提取出来并跟进抓取详情页。","列表页字段","列表项的匹和分页按钮的匹配查询,由css或xpath来进行匹配。","列表项选择器","可配置爬虫","可配置爬虫是版本v0.2.1开发的功能。目的是将具有相似网站结构的爬虫项目可配置化,将开发爬虫的过程流程化,大大提高爬虫开发效率。","在侧边栏点击爬虫导航至爬虫列表,点击添加爬虫按钮。","在检查完目标网页的元素css选择器之后,我们输入列表项选择器、开始url、列表页/详情页等信息。注意勾选url为详情页url。","开始url","抓取类别","添加完成后,可以看到刚刚添加的可配置爬虫出现了在最下方,点击查看进入到爬虫详情。","添加爬虫","点击保存、预览,查看预览内容。","点击可配置爬虫。","点击配置标签进入到配置页面。接下来,我们需要对爬虫规则进行配置。","爬虫最开始遍历的网址。","详情页字段","输入完基本信息,点击添加。","这个默认是开启的。如果开启,爬虫将先抓取网站的robots.txt并判断页面是否可抓;否则,不会对此进行验证。用户可以选择将其关闭。请注意,任何无视robots协议的行为都有法律风险。","这也是爬虫抓取采用的策略,也就是爬虫遍历网页是如何进行的。作为第一个版本,我们有仅列表、仅详情页、列表+详情页。","这些都是再列表页或详情页中需要提取的字段。字段由css选择器或者xpath来匹配提取。可以选择文本或者属性。","这里已经有一些配置好的初始输入项。我们简单介绍一下各自的含义。","这里我们选择列表+详情页。","遵守robots协议","配置爬虫"],"Usage/Spider/Deploy.html":["在爬虫列表中点击操作列的部署按钮,将指定爬虫部署到所有在线节点中;","在爬虫列表中点击部署所有爬虫,将所有爬虫部署到所有在线节点中;","在爬虫详情的概览标签中,点击部署按钮,将指定爬虫部署到所有在线节点中。","这里的爬虫部署是指自定义爬虫的部署,因为可配置爬虫已经内嵌到crawlab中了,所有节点都可以使用,不需要额外部署。简单来说,就是将主机上的爬虫源代码通过http的方式打包传输至worker节点上,因此节点就可以运行传输过来的爬虫了。","部署好之后,我们就可以运行爬虫了。","部署爬虫","部署爬虫很简单,有三种方式:"],"Usage/Spider/Run.html":["在爬虫列表中操作列点击运行按钮,或者","在爬虫详情中概览标签下点击运行按钮,或者","定时任务触发","定时任务触发是比较常用的功能,对于增量抓取或对实时性有要求的任务很重要。这在定时任务中会详细介绍。","对于自定义爬虫,可以在配置标签下点击运行按钮","我们有两种运行爬虫的方式:","手动触发","然后,crawlab会提示任务已经派发到队列中去了,然后你可以在爬虫详情左侧看到新创建的任务。点击创建时间可以导航至任务详情。","运行爬虫"],"Usage/Spider/Analytics.html":["在运行了一段时间之后,爬虫会积累一些统计数据,例如运行成功率、任务数、运行时长等指标。crawlab将这些指标汇总并呈现给开发者。","统计数据","要查看统计数据的话,只需要在爬虫详情中,点击分析标签,就可以看到爬虫的统计数据了。"],"Usage/Task/":["任务"],"Usage/Schedule/":["定时任务"],"Usage/Site/":["网站"],"Architecture/":["架构"],"Architecture/Celery.html":["celeri"],"Architecture/App.html":["app"],"Examples/":["exampl","样例"]},"length":23},"tokenStore":{"root":{"1":{"6":{"docs":{},".":{"0":{"4":{"docs":{},"是":{"docs":{},"以":{"docs":{},"下":{"docs":{},"命":{"docs":{},"令":{"docs":{},"。":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}}}}}}}}},"docs":{}},"docs":{}}},"docs":{}},"2":{"7":{"0":{"1":{"7":{"docs":{},":":{"2":{"7":{"0":{"1":{"7":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}},"docs":{}},"docs":{}},"docs":{}},"docs":{}},"docs":{}}},"docs":{}},"docs":{}},"docs":{}},"docs":{}},"3":{"0":{"docs":{},"秒":{"docs":{},"的":{"docs":{},"时":{"docs":{},"间":{"docs":{},"来":{"docs":{},"b":{"docs":{},"u":{"docs":{},"i":{"docs":{},"l":{"docs":{},"d":{"docs":{},"前":{"docs":{},"端":{"docs":{},"静":{"docs":{},"态":{"docs":{},"文":{"docs":{},"件":{"docs":{},",":{"docs":{},"之":{"docs":{},"后":{"docs":{},"就":{"docs":{},"可":{"docs":{},"以":{"docs":{},"打":{"docs":{},"开":{"docs":{},"c":{"docs":{},"r":{"docs":{},"a":{"docs":{},"w":{"docs":{},"l":{"docs":{},"a":{"docs":{},"b":{"docs":{},"界":{"docs":{},"面":{"docs":{},"地":{"docs":{},"址":{"docs":{},"地":{"docs":{},"址":{"docs":{},"看":{"docs":{},"到":{"docs":{},"界":{"docs":{},"面":{"docs":{},"了":{"docs":{},"。":{"docs":{},"界":{"docs":{},"面":{"docs":{},"地":{"docs":{},"址":{"docs":{},"默":{"docs":{},"认":{"docs":{},"为":{"docs":{},"h":{"docs":{},"t":{"docs":{},"t":{"docs":{},"p":{"docs":{},":":{"docs":{},"/":{"docs":{},"/":{"docs":{},"l":{"docs":{},"o":{"docs":{},"c":{"docs":{},"a":{"docs":{},"l":{"docs":{},"h":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},":":{"8":{"0":{"8":{"0":{"docs":{},"。":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}}},"docs":{}},"docs":{}},"docs":{}},"docs":{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"docs":{}},"8":{"0":{"0":{"0":{"docs":{},":":{"8":{"0":{"0":{"0":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}},"docs":{}},"docs":{}},"docs":{}},"docs":{}}},"docs":{}},"8":{"0":{"docs":{},":":{"8":{"0":{"8":{"0":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}},"docs":{}},"docs":{}},"docs":{}},"docs":{}},";":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}}}},"docs":{}},"docs":{}},"docs":{}},"docs":{},"c":{"docs":{},"r":{"docs":{},"a":{"docs":{},"w":{"docs":{},"l":{"docs":{},"a":{"docs":{},"b":{"docs":{"./":{"ref":"./","tf":0.1111111111111111},"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.014634146341463415}},"主":{"docs":{},"要":{"docs":{},"解":{"docs":{},"决":{"docs":{},"的":{"docs":{},"是":{"docs":{},"大":{"docs":{},"量":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"管":{"docs":{},"理":{"docs":{},"困":{"docs":{},"难":{"docs":{},"的":{"docs":{},"问":{"docs":{},"题":{"docs":{},",":{"docs":{},"例":{"docs":{},"如":{"docs":{},"需":{"docs":{},"要":{"docs":{},"监":{"docs":{},"控":{"docs":{},"上":{"docs":{},"百":{"docs":{},"个":{"docs":{},"网":{"docs":{},"站":{"docs":{},"的":{"docs":{},"参":{"docs":{},"杂":{"docs":{},"s":{"docs":{},"c":{"docs":{},"r":{"docs":{},"a":{"docs":{},"p":{"docs":{},"y":{"docs":{},"和":{"docs":{},"s":{"docs":{},"e":{"docs":{},"l":{"docs":{},"e":{"docs":{},"n":{"docs":{},"i":{"docs":{},"u":{"docs":{},"m":{"docs":{},"的":{"docs":{},"项":{"docs":{},"目":{"docs":{},"不":{"docs":{},"容":{"docs":{},"易":{"docs":{},"做":{"docs":{},"到":{"docs":{},"同":{"docs":{},"时":{"docs":{},"管":{"docs":{},"理":{"docs":{},",":{"docs":{},"而":{"docs":{},"且":{"docs":{},"命":{"docs":{},"令":{"docs":{},"行":{"docs":{},"管":{"docs":{},"理":{"docs":{},"的":{"docs":{},"成":{"docs":{},"本":{"docs":{},"非":{"docs":{},"常":{"docs":{},"高":{"docs":{},",":{"docs":{},"还":{"docs":{},"容":{"docs":{},"易":{"docs":{},"出":{"docs":{},"错":{"docs":{},"。":{"docs":{},"c":{"docs":{},"r":{"docs":{},"a":{"docs":{},"w":{"docs":{},"l":{"docs":{},"a":{"docs":{},"b":{"docs":{},"支":{"docs":{},"持":{"docs":{},"任":{"docs":{},"何":{"docs":{},"语":{"docs":{},"言":{"docs":{},"和":{"docs":{},"任":{"docs":{},"何":{"docs":{},"框":{"docs":{},"架":{"docs":{},",":{"docs":{},"配":{"docs":{},"合":{"docs":{},"任":{"docs":{},"务":{"docs":{},"调":{"docs":{},"度":{"docs":{},"、":{"docs":{},"任":{"docs":{},"务":{"docs":{},"监":{"docs":{},"控":{"docs":{},",":{"docs":{},"很":{"docs":{},"容":{"docs":{},"易":{"docs":{},"做":{"docs":{},"到":{"docs":{},"对":{"docs":{},"成":{"docs":{},"规":{"docs":{},"模":{"docs":{},"的":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"项":{"docs":{},"目":{"docs":{},"进":{"docs":{},"行":{"docs":{},"有":{"docs":{},"效":{"docs":{},"监":{"docs":{},"控":{"docs":{},"管":{"docs":{},"理":{"docs":{},"。":{"docs":{"./":{"ref":"./","tf":0.1111111111111111}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"是":{"docs":{},"基":{"docs":{},"于":{"docs":{},"c":{"docs":{},"e":{"docs":{},"l":{"docs":{},"e":{"docs":{},"r":{"docs":{},"y":{"docs":{},"的":{"docs":{},"分":{"docs":{},"布":{"docs":{},"式":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"管":{"docs":{},"理":{"docs":{},"平":{"docs":{},"台":{"docs":{},",":{"docs":{},"可":{"docs":{},"以":{"docs":{},"集":{"docs":{},"成":{"docs":{},"任":{"docs":{},"何":{"docs":{},"语":{"docs":{},"言":{"docs":{},"和":{"docs":{},"任":{"docs":{},"何":{"docs":{},"框":{"docs":{},"架":{"docs":{},"。":{"docs":{"./":{"ref":"./","tf":0.1111111111111111}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"简":{"docs":{},"介":{"docs":{"./":{"ref":"./","tf":10}}}},"允":{"docs":{},"许":{"docs":{},"用":{"docs":{},"户":{"docs":{},"创":{"docs":{},"建":{"docs":{},"两":{"docs":{},"种":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},":":{"docs":{"Usage/Spider/Create.html":{"ref":"Usage/Spider/Create.html","tf":0.2}}}}}}}}}}}}},"会":{"docs":{},"自":{"docs":{},"动":{"docs":{},"发":{"docs":{},"现":{"docs":{},"p":{"docs":{},"r":{"docs":{},"o":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},"_":{"docs":{},"s":{"docs":{},"o":{"docs":{},"u":{"docs":{},"r":{"docs":{},"c":{"docs":{},"e":{"docs":{},"_":{"docs":{},"f":{"docs":{},"i":{"docs":{},"l":{"docs":{},"e":{"docs":{},"_":{"docs":{},"f":{"docs":{},"o":{"docs":{},"l":{"docs":{},"d":{"docs":{},"e":{"docs":{},"r":{"docs":{},"目":{"docs":{},"录":{"docs":{},"下":{"docs":{},"的":{"docs":{},"所":{"docs":{},"有":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"目":{"docs":{},"录":{"docs":{},",":{"docs":{},"并":{"docs":{},"将":{"docs":{},"这":{"docs":{},"些":{"docs":{},"目":{"docs":{},"录":{"docs":{},"生":{"docs":{},"成":{"docs":{},"自":{"docs":{},"定":{"docs":{},"义":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"并":{"docs":{},"集":{"docs":{},"成":{"docs":{},"到":{"docs":{},"c":{"docs":{},"r":{"docs":{},"a":{"docs":{},"w":{"docs":{},"l":{"docs":{},"a":{"docs":{},"b":{"docs":{},"中":{"docs":{},"。":{"docs":{},"因":{"docs":{},"此":{"docs":{},",":{"docs":{},"将":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"项":{"docs":{},"目":{"docs":{},"目":{"docs":{},"录":{"docs":{},"拷":{"docs":{},"贝":{"docs":{},"到":{"docs":{},"p":{"docs":{},"r":{"docs":{},"o":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},"_":{"docs":{},"s":{"docs":{},"o":{"docs":{},"u":{"docs":{},"r":{"docs":{},"c":{"docs":{},"e":{"docs":{},"_":{"docs":{},"f":{"docs":{},"i":{"docs":{},"l":{"docs":{},"e":{"docs":{},"_":{"docs":{},"f":{"docs":{},"o":{"docs":{},"l":{"docs":{},"d":{"docs":{},"e":{"docs":{},"r":{"docs":{},"目":{"docs":{},"录":{"docs":{},"下":{"docs":{},",":{"docs":{},"就":{"docs":{},"可":{"docs":{},"以":{"docs":{},"添":{"docs":{},"加":{"docs":{},"一":{"docs":{},"个":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"了":{"docs":{},"。":{"docs":{"Usage/Spider/CustomizedSpider.html":{"ref":"Usage/Spider/CustomizedSpider.html","tf":0.06666666666666667}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"的":{"docs":{},"可":{"docs":{},"配":{"docs":{},"置":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"是":{"docs":{},"基":{"docs":{},"于":{"docs":{},"s":{"docs":{},"c":{"docs":{},"r":{"docs":{},"a":{"docs":{},"p":{"docs":{},"y":{"docs":{},"的":{"docs":{},",":{"docs":{},"因":{"docs":{},"此":{"docs":{},"天":{"docs":{},"生":{"docs":{},"支":{"docs":{},"持":{"docs":{},"并":{"docs":{},"发":{"docs":{},"。":{"docs":{},"而":{"docs":{},"且":{"docs":{},",":{"docs":{},"可":{"docs":{},"配":{"docs":{},"置":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"完":{"docs":{},"全":{"docs":{},"支":{"docs":{},"持":{"docs":{},"自":{"docs":{},"定":{"docs":{},"义":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"的":{"docs":{},"一":{"docs":{},"般":{"docs":{},"功":{"docs":{},"能":{"docs":{},",":{"docs":{},"因":{"docs":{},"此":{"docs":{},"也":{"docs":{},"支":{"docs":{},"持":{"docs":{},"任":{"docs":{},"务":{"docs":{},"调":{"docs":{},"度":{"docs":{},"、":{"docs":{},"任":{"docs":{},"务":{"docs":{},"监":{"docs":{},"控":{"docs":{},"、":{"docs":{},"日":{"docs":{},"志":{"docs":{},"监":{"docs":{},"控":{"docs":{},"、":{"docs":{},"数":{"docs":{},"据":{"docs":{},"分":{"docs":{},"析":{"docs":{},"。":{"docs":{"Usage/Spider/ConfigurableSpider.html":{"ref":"Usage/Spider/ConfigurableSpider.html","tf":0.03225806451612903}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"n":{"docs":{},".":{"docs":{},"c":{"docs":{},"o":{"docs":{},"m":{"docs":{},"\"":{"docs":{},"]":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}}}}}}}},"o":{"docs":{},"m":{"docs":{},"p":{"docs":{},"o":{"docs":{},"s":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.00975609756097561}},"e":{"docs":{},".":{"docs":{},"y":{"docs":{},"m":{"docs":{},"l":{"docs":{},"后":{"docs":{},",":{"docs":{},"只":{"docs":{},"需":{"docs":{},"要":{"docs":{},"运":{"docs":{},"行":{"docs":{},"以":{"docs":{},"下":{"docs":{},"命":{"docs":{},"令":{"docs":{},"就":{"docs":{},"可":{"docs":{},"以":{"docs":{},"启":{"docs":{},"动":{"docs":{},"c":{"docs":{},"r":{"docs":{},"a":{"docs":{},"w":{"docs":{},"l":{"docs":{},"a":{"docs":{},"b":{"docs":{},"。":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}}}}}}}}}}}}}}}}}}}}}}}}},"定":{"docs":{},"义":{"docs":{},"如":{"docs":{},"下":{"docs":{},"。":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}}}}}},"更":{"docs":{},"改":{"docs":{},"为":{"docs":{},"如":{"docs":{},"下":{"docs":{},"内":{"docs":{},"容":{"docs":{},"。":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}}}}}}}}},"的":{"docs":{},"y":{"docs":{},"a":{"docs":{},"m":{"docs":{},"l":{"docs":{},"文":{"docs":{},"件":{"docs":{},"来":{"docs":{},"定":{"docs":{},"义":{"docs":{},"需":{"docs":{},"要":{"docs":{},"启":{"docs":{},"动":{"docs":{},"的":{"docs":{},"容":{"docs":{},"器":{"docs":{},",":{"docs":{},"可":{"docs":{},"以":{"docs":{},"是":{"docs":{},"单":{"docs":{},"个":{"docs":{},",":{"docs":{},"也":{"docs":{},"可":{"docs":{},"以":{"docs":{},"(":{"docs":{},"通":{"docs":{},"常":{"docs":{},")":{"docs":{},"是":{"docs":{},"多":{"docs":{},"个":{"docs":{},"的":{"docs":{},"。":{"docs":{},"c":{"docs":{},"r":{"docs":{},"a":{"docs":{},"w":{"docs":{},"l":{"docs":{},"a":{"docs":{},"b":{"docs":{},"的":{"docs":{},"d":{"docs":{},"o":{"docs":{},"c":{"docs":{},"k":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"也":{"docs":{},"很":{"docs":{},"简":{"docs":{},"单":{"docs":{},",":{"docs":{},"大":{"docs":{},"家":{"docs":{},"去":{"docs":{},"网":{"docs":{},"上":{"docs":{},"百":{"docs":{},"度":{"docs":{},"一":{"docs":{},"下":{"docs":{},"就":{"docs":{},"可":{"docs":{},"以":{"docs":{},"了":{"docs":{},"。":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}}}}}}}}}}}}}}}}}}}},"和":{"docs":{},"定":{"docs":{},"义":{"docs":{},"好":{"docs":{},"d":{"docs":{},"o":{"docs":{},"c":{"docs":{},"k":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}}}}}}}}},"是":{"docs":{},"一":{"docs":{},"个":{"docs":{},"集":{"docs":{},"群":{"docs":{},"管":{"docs":{},"理":{"docs":{},"方":{"docs":{},"式":{"docs":{},",":{"docs":{},"可":{"docs":{},"以":{"docs":{},"利":{"docs":{},"用":{"docs":{},"名":{"docs":{},"为":{"docs":{},"d":{"docs":{},"o":{"docs":{},"c":{"docs":{},"k":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}}}}}}}}}}}}}}}}}}}}},"的":{"docs":{},"方":{"docs":{},"式":{"docs":{},"很":{"docs":{},"适":{"docs":{},"合":{"docs":{},"多":{"docs":{},"节":{"docs":{},"点":{"docs":{},"部":{"docs":{},"署":{"docs":{},",":{"docs":{},"在":{"docs":{},"原":{"docs":{},"有":{"docs":{},"的":{"docs":{},"m":{"docs":{},"a":{"docs":{},"s":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"基":{"docs":{},"础":{"docs":{},"上":{"docs":{},"增":{"docs":{},"加":{"docs":{},"几":{"docs":{},"个":{"docs":{},"w":{"docs":{},"o":{"docs":{},"r":{"docs":{},"k":{"docs":{},"e":{"docs":{},"r":{"docs":{},"节":{"docs":{},"点":{"docs":{},",":{"docs":{},"达":{"docs":{},"到":{"docs":{},"多":{"docs":{},"节":{"docs":{},"点":{"docs":{},"部":{"docs":{},"署":{"docs":{},"的":{"docs":{},"目":{"docs":{},"的":{"docs":{},"。":{"docs":{},"将":{"docs":{},"d":{"docs":{},"o":{"docs":{},"c":{"docs":{},"k":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"来":{"docs":{},"部":{"docs":{},"署":{"docs":{},"。":{"docs":{},"d":{"docs":{},"o":{"docs":{},"c":{"docs":{},"k":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}}}}}}}}}}}}}}}}},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"_":{"docs":{},"n":{"docs":{},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{},":":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.00975609756097561}}}}}}}}}}}}}}}},"d":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0375}}},"l":{"docs":{},"o":{"docs":{},"n":{"docs":{},"e":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}}}}}},"e":{"docs":{},"l":{"docs":{},"e":{"docs":{},"r":{"docs":{},"i":{"docs":{"Architecture/Celery.html":{"ref":"Architecture/Celery.html","tf":11}}}}}}}},"d":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.00975609756097561}},"e":{"docs":{},"m":{"docs":{},"o":{"docs":{"./":{"ref":"./","tf":0.1111111111111111}}}},"p":{"docs":{},"e":{"docs":{},"n":{"docs":{},"d":{"docs":{},"s":{"docs":{},"_":{"docs":{},"o":{"docs":{},"n":{"docs":{},":":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.01951219512195122}}}}}}}}}}},"v":{"docs":{},".":{"docs":{},"c":{"docs":{},"r":{"docs":{},"a":{"docs":{},"w":{"docs":{},"l":{"docs":{},"a":{"docs":{},"b":{"docs":{},".":{"docs":{},"c":{"docs":{},"o":{"docs":{},"m":{"docs":{},";":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}}}}}}}}}}}}}}}}},"o":{"docs":{},"c":{"docs":{},"k":{"docs":{},"e":{"docs":{},"r":{"docs":{"Installation/":{"ref":"Installation/","tf":0.25},"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":10.029268292682927}},"安":{"docs":{},"装":{"docs":{},"部":{"docs":{},"署":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}}}}}}}}}}},"基":{"docs":{},"于":{"docs":{},"c":{"docs":{},"e":{"docs":{},"l":{"docs":{},"e":{"docs":{},"r":{"docs":{},"y":{"docs":{},"的":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"分":{"docs":{},"布":{"docs":{},"式":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"管":{"docs":{},"理":{"docs":{},"平":{"docs":{},"台":{"docs":{},",":{"docs":{},"支":{"docs":{},"持":{"docs":{},"多":{"docs":{},"种":{"docs":{},"编":{"docs":{},"程":{"docs":{},"语":{"docs":{},"言":{"docs":{},"以":{"docs":{},"及":{"docs":{},"多":{"docs":{},"种":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"框":{"docs":{},"架":{"docs":{},".":{"docs":{"./":{"ref":"./","tf":0.1111111111111111}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"本":{"docs":{},"使":{"docs":{},"用":{"docs":{},"手":{"docs":{},"册":{"docs":{},"会":{"docs":{},"帮":{"docs":{},"助":{"docs":{},"您":{"docs":{},"解":{"docs":{},"决":{"docs":{},"在":{"docs":{},"安":{"docs":{},"装":{"docs":{},"使":{"docs":{},"用":{"docs":{},"c":{"docs":{},"r":{"docs":{},"a":{"docs":{},"w":{"docs":{},"l":{"docs":{},"a":{"docs":{},"b":{"docs":{},"遇":{"docs":{},"到":{"docs":{},"的":{"docs":{},"任":{"docs":{},"何":{"docs":{},"问":{"docs":{},"题":{"docs":{},"。":{"docs":{"./":{"ref":"./","tf":0.1111111111111111}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"小":{"docs":{},"节":{"docs":{},"将":{"docs":{},"介":{"docs":{},"绍":{"docs":{},"三":{"docs":{},"种":{"docs":{},"安":{"docs":{},"装":{"docs":{},"d":{"docs":{},"o":{"docs":{},"c":{"docs":{},"k":{"docs":{},"e":{"docs":{},"r":{"docs":{},"的":{"docs":{},"方":{"docs":{},"式":{"docs":{},":":{"docs":{"Installation/":{"ref":"Installation/","tf":0.25}}}}}}}}}}}}}}}},"如":{"docs":{},"何":{"docs":{},"使":{"docs":{},"用":{"docs":{},"c":{"docs":{},"r":{"docs":{},"a":{"docs":{},"w":{"docs":{},"l":{"docs":{},"a":{"docs":{},"b":{"docs":{},",":{"docs":{},"包":{"docs":{},"括":{"docs":{},"如":{"docs":{},"下":{"docs":{},"内":{"docs":{},"容":{"docs":{},":":{"docs":{"Usage/":{"ref":"Usage/","tf":0.2}}}}}}}}}}}}}}}}}}}}}}}}}}},"查":{"docs":{},"看":{"docs":{},"演":{"docs":{},"示":{"docs":{"./":{"ref":"./","tf":0.1111111111111111}}}},"节":{"docs":{},"点":{"docs":{"Usage/Node/":{"ref":"Usage/Node/","tf":0.25}},"列":{"docs":{},"表":{"docs":{"Usage/Node/View.html":{"ref":"Usage/Node/View.html","tf":10.333333333333334}}}}}}}},"项":{"docs":{},"目":{"docs":{},"自":{"docs":{},"今":{"docs":{},"年":{"docs":{},"三":{"docs":{},"月":{"docs":{},"份":{"docs":{},"上":{"docs":{},"线":{"docs":{},"以":{"docs":{},"来":{"docs":{},"受":{"docs":{},"到":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"爱":{"docs":{},"好":{"docs":{},"者":{"docs":{},"们":{"docs":{},"和":{"docs":{},"开":{"docs":{},"发":{"docs":{},"者":{"docs":{},"们":{"docs":{},"的":{"docs":{},"好":{"docs":{},"评":{"docs":{},",":{"docs":{},"不":{"docs":{},"少":{"docs":{},"使":{"docs":{},"用":{"docs":{},"者":{"docs":{},"还":{"docs":{},"表":{"docs":{},"示":{"docs":{},"会":{"docs":{},"用":{"docs":{},"c":{"docs":{},"r":{"docs":{},"a":{"docs":{},"w":{"docs":{},"l":{"docs":{},"a":{"docs":{},"b":{"docs":{},"搭":{"docs":{},"建":{"docs":{},"公":{"docs":{},"司":{"docs":{},"的":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"平":{"docs":{},"台":{"docs":{},"。":{"docs":{},"经":{"docs":{},"过":{"docs":{},"近":{"3":{"docs":{},"个":{"docs":{},"月":{"docs":{},"的":{"docs":{},"迭":{"docs":{},"代":{"docs":{},",":{"docs":{},"我":{"docs":{},"们":{"docs":{},"陆":{"docs":{},"续":{"docs":{},"上":{"docs":{},"线":{"docs":{},"了":{"docs":{},"定":{"docs":{},"时":{"docs":{},"任":{"docs":{},"务":{"docs":{},"、":{"docs":{},"数":{"docs":{},"据":{"docs":{},"分":{"docs":{},"析":{"docs":{},"、":{"docs":{},"网":{"docs":{},"站":{"docs":{},"信":{"docs":{},"息":{"docs":{},"、":{"docs":{},"可":{"docs":{},"配":{"docs":{},"置":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"、":{"docs":{},"自":{"docs":{},"动":{"docs":{},"提":{"docs":{},"取":{"docs":{},"字":{"docs":{},"段":{"docs":{},"、":{"docs":{},"下":{"docs":{},"载":{"docs":{},"结":{"docs":{},"果":{"docs":{},"、":{"docs":{},"上":{"docs":{},"传":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"等":{"docs":{},"功":{"docs":{},"能":{"docs":{},",":{"docs":{},"将":{"docs":{},"c":{"docs":{},"r":{"docs":{},"a":{"docs":{},"w":{"docs":{},"l":{"docs":{},"a":{"docs":{},"b":{"docs":{},"打":{"docs":{},"造":{"docs":{},"得":{"docs":{},"更":{"docs":{},"加":{"docs":{},"实":{"docs":{},"用":{"docs":{},",":{"docs":{},"更":{"docs":{},"加":{"docs":{},"全":{"docs":{},"面":{"docs":{},",":{"docs":{},"能":{"docs":{},"够":{"docs":{},"真":{"docs":{},"正":{"docs":{},"帮":{"docs":{},"助":{"docs":{},"用":{"docs":{},"户":{"docs":{},"解":{"docs":{},"决":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"管":{"docs":{},"理":{"docs":{},"困":{"docs":{},"难":{"docs":{},"的":{"docs":{},"问":{"docs":{},"题":{"docs":{},"。":{"docs":{"./":{"ref":"./","tf":0.1111111111111111}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"docs":{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"首":{"docs":{},"先":{"docs":{},",":{"docs":{},"我":{"docs":{},"们":{"docs":{},"来":{"docs":{},"看":{"docs":{},"如":{"docs":{},"何":{"docs":{},"安":{"docs":{},"装":{"docs":{},"c":{"docs":{},"r":{"docs":{},"a":{"docs":{},"w":{"docs":{},"l":{"docs":{},"a":{"docs":{},"b":{"docs":{},"吧":{"docs":{},",":{"docs":{},"请":{"docs":{},"查":{"docs":{},"看":{"docs":{},"安":{"docs":{},"装":{"docs":{},"。":{"docs":{"./":{"ref":"./","tf":0.1111111111111111}}}}}}}}}}}}}}}}}}}}}}}}}},"是":{"docs":{},"将":{"docs":{},"g":{"docs":{},"i":{"docs":{},"t":{"docs":{},"h":{"docs":{},"u":{"docs":{},"b":{"docs":{},"上":{"docs":{},"的":{"docs":{},"代":{"docs":{},"码":{"docs":{},"拉":{"docs":{},"取":{"docs":{},"到":{"docs":{},"本":{"docs":{},"地":{"docs":{},"。":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}}}}}}}}}}}}}}}}}}}}}},"安":{"docs":{},"装":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}},"c":{"docs":{},"r":{"docs":{},"a":{"docs":{},"w":{"docs":{},"l":{"docs":{},"a":{"docs":{},"b":{"docs":{"Installation/":{"ref":"Installation/","tf":10}}}}}}}}},"d":{"docs":{},"o":{"docs":{},"c":{"docs":{},"k":{"docs":{},"e":{"docs":{},"r":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}}}}}}},"完":{"docs":{},"d":{"docs":{},"o":{"docs":{},"c":{"docs":{},"k":{"docs":{},"e":{"docs":{},"r":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}}}}}}}},"n":{"docs":{},"g":{"docs":{},"i":{"docs":{},"n":{"docs":{},"x":{"docs":{},",":{"docs":{},"在":{"docs":{},"u":{"docs":{},"b":{"docs":{},"u":{"docs":{},"n":{"docs":{},"t":{"docs":{},"u":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}}}}}}}}}}}}}}},"前":{"docs":{},"端":{"docs":{},"所":{"docs":{},"需":{"docs":{},"库":{"docs":{},"。":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}}}}}}}},"后":{"docs":{},"端":{"docs":{},"所":{"docs":{},"需":{"docs":{},"库":{"docs":{},"。":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}}}}}}}}}},"直":{"docs":{},"接":{"docs":{},"部":{"docs":{},"署":{"docs":{"Installation/":{"ref":"Installation/","tf":0.25},"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":10.0125}},"是":{"docs":{},"之":{"docs":{},"前":{"docs":{},"没":{"docs":{},"有":{"docs":{},"d":{"docs":{},"o":{"docs":{},"c":{"docs":{},"k":{"docs":{},"e":{"docs":{},"r":{"docs":{},"时":{"docs":{},"的":{"docs":{},"部":{"docs":{},"署":{"docs":{},"方":{"docs":{},"式":{"docs":{},",":{"docs":{},"相":{"docs":{},"对":{"docs":{},"于":{"docs":{},"d":{"docs":{},"o":{"docs":{},"c":{"docs":{},"k":{"docs":{},"e":{"docs":{},"r":{"docs":{},"部":{"docs":{},"署":{"docs":{},"来":{"docs":{},"说":{"docs":{},"有":{"docs":{},"些":{"docs":{},"繁":{"docs":{},"琐":{"docs":{},"。":{"docs":{},"但":{"docs":{},"了":{"docs":{},"解":{"docs":{},"如":{"docs":{},"何":{"docs":{},"直":{"docs":{},"接":{"docs":{},"部":{"docs":{},"署":{"docs":{},"可":{"docs":{},"以":{"docs":{},"帮":{"docs":{},"助":{"docs":{},"更":{"docs":{},"深":{"docs":{},"入":{"docs":{},"地":{"docs":{},"理":{"docs":{},"解":{"docs":{},"d":{"docs":{},"o":{"docs":{},"c":{"docs":{},"k":{"docs":{},"e":{"docs":{},"r":{"docs":{},"是":{"docs":{},"如":{"docs":{},"何":{"docs":{},"构":{"docs":{},"建":{"docs":{},"c":{"docs":{},"r":{"docs":{},"a":{"docs":{},"w":{"docs":{},"l":{"docs":{},"a":{"docs":{},"b":{"docs":{},"镜":{"docs":{},"像":{"docs":{},"的":{"docs":{},"。":{"docs":{},"这":{"docs":{},"里":{"docs":{},"简":{"docs":{},"单":{"docs":{},"介":{"docs":{},"绍":{"docs":{},"一":{"docs":{},"下":{"docs":{},"。":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"预":{"docs":{},"览":{"docs":{},"模":{"docs":{},"式":{"docs":{"Installation/":{"ref":"Installation/","tf":0.25},"Installation/Preview.html":{"ref":"Installation/Preview.html","tf":10.125}},"是":{"docs":{},"一":{"docs":{},"种":{"docs":{},"让":{"docs":{},"用":{"docs":{},"户":{"docs":{},"比":{"docs":{},"较":{"docs":{},"快":{"docs":{},"的":{"docs":{},"上":{"docs":{},"手":{"docs":{},"的":{"docs":{},"一":{"docs":{},"种":{"docs":{},"部":{"docs":{},"署":{"docs":{},"模":{"docs":{},"式":{"docs":{},"。":{"docs":{},"跟":{"docs":{},"直":{"docs":{},"接":{"docs":{},"部":{"docs":{},"署":{"docs":{},"类":{"docs":{},"似":{"docs":{},",":{"docs":{},"但":{"docs":{},"不":{"docs":{},"用":{"docs":{},"经":{"docs":{},"过":{"docs":{},"构":{"docs":{},"建":{"docs":{},"、":{"docs":{},"n":{"docs":{},"g":{"docs":{},"i":{"docs":{},"n":{"docs":{},"x":{"docs":{},"和":{"docs":{},"启":{"docs":{},"动":{"docs":{},"服":{"docs":{},"务":{"docs":{},"的":{"docs":{},"步":{"docs":{},"骤":{"docs":{},"。":{"docs":{},"在":{"docs":{},"启":{"docs":{},"动":{"docs":{},"时":{"docs":{},"只":{"docs":{},"需":{"docs":{},"要":{"docs":{},"执":{"docs":{},"行":{"docs":{},"以":{"docs":{},"下":{"docs":{},"命":{"docs":{},"令":{"docs":{},"就":{"docs":{},"可":{"docs":{},"以":{"docs":{},"了":{"docs":{},"。":{"docs":{},"相":{"docs":{},"较":{"docs":{},"于":{"docs":{},"直":{"docs":{},"接":{"docs":{},"部":{"docs":{},"署":{"docs":{},"来":{"docs":{},"说":{"docs":{},"方":{"docs":{},"便":{"docs":{},"一":{"docs":{},"些":{"docs":{},"。":{"docs":{"Installation/Preview.html":{"ref":"Installation/Preview.html","tf":0.125}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"\"":{"2":{"7":{"0":{"1":{"7":{"docs":{},":":{"2":{"7":{"0":{"1":{"7":{"docs":{},"\"":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.00975609756097561}}}},"docs":{}},"docs":{}},"docs":{}},"docs":{}},"docs":{}}},"docs":{}},"docs":{}},"docs":{}},"docs":{}},"6":{"3":{"7":{"9":{"docs":{},":":{"6":{"3":{"7":{"9":{"docs":{},"\"":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.00975609756097561}}}},"docs":{}},"docs":{}},"docs":{}},"docs":{}}},"docs":{}},"docs":{}},"docs":{}},"8":{"0":{"0":{"0":{"docs":{},":":{"8":{"0":{"0":{"0":{"docs":{},"\"":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.00975609756097561}}}},"docs":{}},"docs":{}},"docs":{}},"docs":{}}},"1":{"docs":{},":":{"8":{"0":{"0":{"0":{"docs":{},"\"":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}}},"docs":{}},"docs":{}},"docs":{}},"docs":{}}},"2":{"docs":{},":":{"8":{"0":{"0":{"0":{"docs":{},"\"":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}}},"docs":{}},"docs":{}},"docs":{}},"docs":{}}},"docs":{}},"8":{"0":{"docs":{},":":{"8":{"0":{"8":{"0":{"docs":{},"\"":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.00975609756097561}}}},"docs":{}},"docs":{}},"docs":{}},"docs":{}}},"docs":{}},"docs":{}},"docs":{}},"docs":{},"r":{"docs":{},"e":{"docs":{},"g":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{},"i":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}}}}}}}}}},"#":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.06829268292682927},"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0375}}},"'":{"3":{"docs":{},".":{"3":{"docs":{},"'":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.00975609756097561}}}},"docs":{}}},"docs":{}},"/":{"docs":{},"b":{"docs":{},"i":{"docs":{},"n":{"docs":{},"/":{"docs":{},"s":{"docs":{},"h":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.01951219512195122}}}}}}}},"h":{"docs":{},"o":{"docs":{},"m":{"docs":{},"e":{"docs":{},"/":{"docs":{},"y":{"docs":{},"e":{"docs":{},"q":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"/":{"docs":{},".":{"docs":{},"e":{"docs":{},"n":{"docs":{},"v":{"docs":{},".":{"docs":{},"p":{"docs":{},"r":{"docs":{},"o":{"docs":{},"d":{"docs":{},"u":{"docs":{},"c":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},".":{"docs":{},"m":{"docs":{},"a":{"docs":{},"s":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},":":{"docs":{},"/":{"docs":{},"o":{"docs":{},"p":{"docs":{},"t":{"docs":{},"/":{"docs":{},"c":{"docs":{},"r":{"docs":{},"a":{"docs":{},"w":{"docs":{},"l":{"docs":{},"a":{"docs":{},"b":{"docs":{},"/":{"docs":{},"f":{"docs":{},"r":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"e":{"docs":{},"n":{"docs":{},"d":{"docs":{},"/":{"docs":{},".":{"docs":{},"e":{"docs":{},"n":{"docs":{},"v":{"docs":{},".":{"docs":{},"p":{"docs":{},"r":{"docs":{},"o":{"docs":{},"d":{"docs":{},"u":{"docs":{},"c":{"docs":{},"t":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"w":{"docs":{},"o":{"docs":{},"r":{"docs":{},"k":{"docs":{},"e":{"docs":{},"r":{"docs":{},":":{"docs":{},"/":{"docs":{},"o":{"docs":{},"p":{"docs":{},"t":{"docs":{},"/":{"docs":{},"c":{"docs":{},"r":{"docs":{},"a":{"docs":{},"w":{"docs":{},"l":{"docs":{},"a":{"docs":{},"b":{"docs":{},"/":{"docs":{},"f":{"docs":{},"r":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"e":{"docs":{},"n":{"docs":{},"d":{"docs":{},"/":{"docs":{},".":{"docs":{},"e":{"docs":{},"n":{"docs":{},"v":{"docs":{},".":{"docs":{},"p":{"docs":{},"r":{"docs":{},"o":{"docs":{},"d":{"docs":{},"u":{"docs":{},"c":{"docs":{},"t":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.00975609756097561}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},":":{"docs":{},"/":{"docs":{},"o":{"docs":{},"p":{"docs":{},"t":{"docs":{},"/":{"docs":{},"c":{"docs":{},"r":{"docs":{},"a":{"docs":{},"w":{"docs":{},"l":{"docs":{},"a":{"docs":{},"b":{"docs":{},"/":{"docs":{},"f":{"docs":{},"r":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"e":{"docs":{},"n":{"docs":{},"d":{"docs":{},"/":{"docs":{},".":{"docs":{},"e":{"docs":{},"n":{"docs":{},"v":{"docs":{},".":{"docs":{},"p":{"docs":{},"r":{"docs":{},"o":{"docs":{},"d":{"docs":{},"u":{"docs":{},"c":{"docs":{},"t":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.00975609756097561}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"f":{"docs":{},"i":{"docs":{},"g":{"docs":{},".":{"docs":{},"m":{"docs":{},"a":{"docs":{},"s":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},".":{"docs":{},"p":{"docs":{},"y":{"docs":{},":":{"docs":{},"/":{"docs":{},"o":{"docs":{},"p":{"docs":{},"t":{"docs":{},"/":{"docs":{},"c":{"docs":{},"r":{"docs":{},"a":{"docs":{},"w":{"docs":{},"l":{"docs":{},"a":{"docs":{},"b":{"docs":{},"/":{"docs":{},"c":{"docs":{},"r":{"docs":{},"a":{"docs":{},"w":{"docs":{},"l":{"docs":{},"a":{"docs":{},"b":{"docs":{},"/":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"f":{"docs":{},"i":{"docs":{},"g":{"docs":{},"/":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"f":{"docs":{},"i":{"docs":{},"g":{"docs":{},".":{"docs":{},"p":{"docs":{},"i":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"p":{"docs":{},"y":{"docs":{},":":{"docs":{},"/":{"docs":{},"o":{"docs":{},"p":{"docs":{},"t":{"docs":{},"/":{"docs":{},"c":{"docs":{},"r":{"docs":{},"a":{"docs":{},"w":{"docs":{},"l":{"docs":{},"a":{"docs":{},"b":{"docs":{},"/":{"docs":{},"c":{"docs":{},"r":{"docs":{},"a":{"docs":{},"w":{"docs":{},"l":{"docs":{},"a":{"docs":{},"b":{"docs":{},"/":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"f":{"docs":{},"i":{"docs":{},"g":{"docs":{},"/":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"f":{"docs":{},"i":{"docs":{},"g":{"docs":{},".":{"docs":{},"p":{"docs":{},"i":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.00975609756097561}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"w":{"docs":{},"o":{"docs":{},"r":{"docs":{},"k":{"docs":{},"e":{"docs":{},"r":{"docs":{},".":{"docs":{},"p":{"docs":{},"y":{"docs":{},":":{"docs":{},"/":{"docs":{},"o":{"docs":{},"p":{"docs":{},"t":{"docs":{},"/":{"docs":{},"c":{"docs":{},"r":{"docs":{},"a":{"docs":{},"w":{"docs":{},"l":{"docs":{},"a":{"docs":{},"b":{"docs":{},"/":{"docs":{},"c":{"docs":{},"r":{"docs":{},"a":{"docs":{},"w":{"docs":{},"l":{"docs":{},"a":{"docs":{},"b":{"docs":{},"/":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"f":{"docs":{},"i":{"docs":{},"g":{"docs":{},"/":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"f":{"docs":{},"i":{"docs":{},"g":{"docs":{},".":{"docs":{},"p":{"docs":{},"i":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.00975609756097561}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"j":{"docs":{},"e":{"docs":{},"n":{"docs":{},"k":{"docs":{},"i":{"docs":{},"n":{"docs":{},"s":{"docs":{},"_":{"docs":{},"h":{"docs":{},"o":{"docs":{},"m":{"docs":{},"e":{"docs":{},"/":{"docs":{},"w":{"docs":{},"o":{"docs":{},"r":{"docs":{},"k":{"docs":{},"s":{"docs":{},"p":{"docs":{},"a":{"docs":{},"c":{"docs":{},"e":{"docs":{},"/":{"docs":{},"c":{"docs":{},"r":{"docs":{},"a":{"docs":{},"w":{"docs":{},"l":{"docs":{},"a":{"docs":{},"b":{"docs":{},"_":{"docs":{},"d":{"docs":{},"e":{"docs":{},"v":{"docs":{},"e":{"docs":{},"l":{"docs":{},"o":{"docs":{},"p":{"docs":{},"/":{"docs":{},"f":{"docs":{},"r":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"e":{"docs":{},"n":{"docs":{},"d":{"docs":{},"/":{"docs":{},"d":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},";":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"o":{"docs":{},"p":{"docs":{},"t":{"docs":{},"/":{"docs":{},"c":{"docs":{},"r":{"docs":{},"a":{"docs":{},"w":{"docs":{},"l":{"docs":{},"a":{"docs":{},"b":{"docs":{},"/":{"docs":{},"d":{"docs":{},"o":{"docs":{},"c":{"docs":{},"k":{"docs":{},"e":{"docs":{},"r":{"docs":{},"_":{"docs":{},"i":{"docs":{},"n":{"docs":{},"i":{"docs":{},"t":{"docs":{},".":{"docs":{},"s":{"docs":{},"h":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.01951219512195122}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"[":{"docs":{},"\"":{"docs":{},"h":{"docs":{},"t":{"docs":{},"t":{"docs":{},"p":{"docs":{},"s":{"docs":{},":":{"docs":{},"/":{"docs":{},"/":{"docs":{},"r":{"docs":{},"e":{"docs":{},"g":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{},"y":{"docs":{},".":{"docs":{},"d":{"docs":{},"o":{"docs":{},"c":{"docs":{},"k":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}}}}}}}}}}}}}}}}}}}}}}},"a":{"docs":{},"p":{"docs":{},"p":{"docs":{},"]":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}}}}}}},"\\":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.024390243902439025}}},"a":{"docs":{},"l":{"docs":{},"w":{"docs":{},"a":{"docs":{},"y":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.01951219512195122}}}}}},"p":{"docs":{},"p":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.01951219512195122},"Architecture/App.html":{"ref":"Architecture/App.html","tf":11}},".":{"docs":{},"p":{"docs":{},"i":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}}}}}},"i":{"docs":{},"服":{"docs":{},"务":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}}}}},"t":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}}}}},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"r":{"docs":{},"y":{"docs":{},"p":{"docs":{},"o":{"docs":{},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{},":":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.01951219512195122}}}}}}}}}}}},"x":{"docs":{},"a":{"docs":{},"m":{"docs":{},"p":{"docs":{},"l":{"docs":{"Examples/":{"ref":"Examples/","tf":1}}}}}}}},"i":{"docs":{},"m":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},":":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.03902439024390244}}}}}}},"n":{"docs":{},"d":{"docs":{},"e":{"docs":{},"x":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}},".":{"docs":{},"h":{"docs":{},"t":{"docs":{},"m":{"docs":{},"l":{"docs":{},";":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}}}}}}}}}}},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"l":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.05}}}}}}}},"m":{"docs":{},"a":{"docs":{},"s":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.014634146341463415}},":":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.00975609756097561}}}}}}},"n":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},".":{"docs":{},"p":{"docs":{},"i":{"docs":{"Installation/Preview.html":{"ref":"Installation/Preview.html","tf":0.125}}}}}}}}}},"i":{"docs":{},"r":{"docs":{},"r":{"docs":{},"o":{"docs":{},"r":{"docs":{},"s":{"docs":{},"\"":{"docs":{},":":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}}}}}}}}},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"o":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.024390243902439025}},":":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.00975609756097561}},"l":{"docs":{},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.00975609756097561}}}}}}}}},"一":{"docs":{},"行":{"docs":{},"命":{"docs":{},"令":{"docs":{},"。":{"docs":{},"如":{"docs":{},"何":{"docs":{},"安":{"docs":{},"装":{"docs":{},"d":{"docs":{},"o":{"docs":{},"c":{"docs":{},"k":{"docs":{},"e":{"docs":{},"r":{"docs":{},"跟":{"docs":{},"操":{"docs":{},"作":{"docs":{},"系":{"docs":{},"统":{"docs":{},"有":{"docs":{},"关":{"docs":{},",":{"docs":{},"这":{"docs":{},"里":{"docs":{},"就":{"docs":{},"不":{"docs":{},"展":{"docs":{},"开":{"docs":{},"讲":{"docs":{},"了":{"docs":{},",":{"docs":{},"需":{"docs":{},"要":{"docs":{},"的":{"docs":{},"同":{"docs":{},"学":{"docs":{},"自":{"docs":{},"行":{"docs":{},"百":{"docs":{},"度":{"docs":{},"一":{"docs":{},"下":{"docs":{},"相":{"docs":{},"关":{"docs":{},"教":{"docs":{},"程":{"docs":{},"。":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"n":{"docs":{},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.00975609756097561}}}}},"g":{"docs":{},"i":{"docs":{},"n":{"docs":{},"x":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.00975609756097561},"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0375}}}}}},"p":{"docs":{},"m":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.025}}}}},"p":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.014634146341463415}},"o":{"docs":{},"r":{"docs":{},"t":{"docs":{},"s":{"docs":{},":":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.03902439024390244}}}}}}},"u":{"docs":{},"l":{"docs":{},"l":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}}}},"i":{"docs":{},"p":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}}}},"m":{"2":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0625}}},"docs":{}},"y":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"n":{"docs":{"Installation/Preview.html":{"ref":"Installation/Preview.html","tf":0.125}}}}}}}},"r":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}},"e":{"docs":{},"d":{"docs":{},"i":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.01951219512195122}},"s":{"docs":{},":":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.00975609756097561}},"l":{"docs":{},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.00975609756097561}}}}}}}}}}}},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{},":":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.01951219512195122}}}}}}}},"l":{"docs":{},"o":{"docs":{},"a":{"docs":{},"d":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}}}}}},"q":{"docs":{},"u":{"docs":{},"i":{"docs":{},"r":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}}}}}}},"m":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}},"u":{"docs":{},"n":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.00975609756097561},"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125},"Installation/Preview.html":{"ref":"Installation/Preview.html","tf":0.125}}}},"o":{"docs":{},"o":{"docs":{},"t":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}}}}}},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"v":{"docs":{"Installation/Preview.html":{"ref":"Installation/Preview.html","tf":0.125}},"i":{"docs":{},"c":{"docs":{},"e":{"docs":{},"s":{"docs":{},":":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.00975609756097561}}}}}}},"e":{"docs":{},"r":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}},"_":{"docs":{},"n":{"docs":{},"a":{"docs":{},"m":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}}}}}}},"来":{"docs":{},"进":{"docs":{},"行":{"docs":{},"的":{"docs":{},",":{"docs":{},"因":{"docs":{},"此":{"docs":{},"是":{"docs":{},"开":{"docs":{},"发":{"docs":{},"者":{"docs":{},"模":{"docs":{},"式":{"docs":{},"。":{"docs":{},"注":{"docs":{},"意":{"docs":{},":":{"docs":{},"强":{"docs":{},"烈":{"docs":{},"不":{"docs":{},"建":{"docs":{},"议":{"docs":{},"在":{"docs":{},"生":{"docs":{},"产":{"docs":{},"环":{"docs":{},"境":{"docs":{},"中":{"docs":{},"用":{"docs":{},"预":{"docs":{},"览":{"docs":{},"模":{"docs":{},"式":{"docs":{},"。":{"docs":{},"预":{"docs":{},"览":{"docs":{},"模":{"docs":{},"式":{"docs":{},"只":{"docs":{},"是":{"docs":{},"让":{"docs":{},"开":{"docs":{},"发":{"docs":{},"者":{"docs":{},"快":{"docs":{},"速":{"docs":{},"体":{"docs":{},"验":{"docs":{},"c":{"docs":{},"r":{"docs":{},"a":{"docs":{},"w":{"docs":{},"l":{"docs":{},"a":{"docs":{},"b":{"docs":{},"以":{"docs":{},"及":{"docs":{},"调":{"docs":{},"试":{"docs":{},"代":{"docs":{},"码":{"docs":{},"问":{"docs":{},"题":{"docs":{},"的":{"docs":{},"一":{"docs":{},"种":{"docs":{},"方":{"docs":{},"式":{"docs":{},",":{"docs":{},"而":{"docs":{},"不":{"docs":{},"是":{"docs":{},"用":{"docs":{},"作":{"docs":{},"生":{"docs":{},"产":{"docs":{},"环":{"docs":{},"境":{"docs":{},"部":{"docs":{},"署":{"docs":{},"的":{"docs":{},"。":{"docs":{"Installation/Preview.html":{"ref":"Installation/Preview.html","tf":0.125}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"t":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0375}}}}}},"u":{"docs":{},"d":{"docs":{},"o":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}}}}}},"t":{"docs":{},"i":{"docs":{},"k":{"docs":{},"a":{"docs":{},"z":{"docs":{},"y":{"docs":{},"q":{"docs":{},"/":{"docs":{},"c":{"docs":{},"r":{"docs":{},"a":{"docs":{},"w":{"docs":{},"l":{"docs":{},"a":{"docs":{},"b":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}},":":{"docs":{},"l":{"docs":{},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.024390243902439025}}}}}}}}}}}}}}}}}}}}}}}},"u":{"docs":{},"p":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}}},"v":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.00975609756097561}},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},":":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.00975609756097561}}}}}}}}},"o":{"docs":{},"l":{"docs":{},"u":{"docs":{},"m":{"docs":{},"n":{"docs":{},"s":{"docs":{},":":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.01951219512195122}}}}}}}}}},"w":{"docs":{},"o":{"docs":{},"r":{"docs":{},"k":{"docs":{},"e":{"docs":{},"r":{"1":{"docs":{},":":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}}},"2":{"docs":{},":":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}}},"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.00975609756097561},"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}},".":{"docs":{},"p":{"docs":{},"i":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}}}}},",":{"docs":{},"他":{"docs":{},"们":{"docs":{},"通":{"docs":{},"过":{"docs":{},"连":{"docs":{},"接":{"docs":{},"到":{"docs":{},"配":{"docs":{},"置":{"docs":{},"好":{"docs":{},"的":{"docs":{},"b":{"docs":{},"r":{"docs":{},"o":{"docs":{},"k":{"docs":{},"e":{"docs":{},"r":{"docs":{},"(":{"docs":{},"通":{"docs":{},"常":{"docs":{},"是":{"docs":{},"r":{"docs":{},"e":{"docs":{},"d":{"docs":{},"i":{"docs":{},"s":{"docs":{},")":{"docs":{},"来":{"docs":{},"进":{"docs":{},"行":{"docs":{},"与":{"docs":{},"主":{"docs":{},"机":{"docs":{},"的":{"docs":{},"通":{"docs":{},"信":{"docs":{},"。":{"docs":{"Usage/Node/View.html":{"ref":"Usage/Node/View.html","tf":0.3333333333333333}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"{":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805},"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}}},"}":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805},"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}}},"下":{"docs":{},"载":{"docs":{},"镜":{"docs":{},"像":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}}}}},"其":{"docs":{},"中":{"docs":{},",":{"docs":{},"我":{"docs":{},"们":{"docs":{},"映":{"docs":{},"射":{"docs":{},"了":{"8":{"0":{"8":{"0":{"docs":{},"端":{"docs":{},"口":{"docs":{},"(":{"docs":{},"n":{"docs":{},"g":{"docs":{},"i":{"docs":{},"n":{"docs":{},"x":{"docs":{},"前":{"docs":{},"端":{"docs":{},"静":{"docs":{},"态":{"docs":{},"文":{"docs":{},"件":{"docs":{},")":{"docs":{},"以":{"docs":{},"及":{"8":{"0":{"0":{"0":{"docs":{},"端":{"docs":{},"口":{"docs":{},"(":{"docs":{},"后":{"docs":{},"端":{"docs":{},"a":{"docs":{},"p":{"docs":{},"i":{"docs":{},")":{"docs":{},"到":{"docs":{},"宿":{"docs":{},"主":{"docs":{},"机":{"docs":{},"。":{"docs":{},"另":{"docs":{},"外":{"docs":{},"还":{"docs":{},"将":{"docs":{},"前":{"docs":{},"端":{"docs":{},"配":{"docs":{},"置":{"docs":{},"文":{"docs":{},"件":{"docs":{},"/":{"docs":{},"h":{"docs":{},"o":{"docs":{},"m":{"docs":{},"e":{"docs":{},"/":{"docs":{},"y":{"docs":{},"e":{"docs":{},"q":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"/":{"docs":{},".":{"docs":{},"e":{"docs":{},"n":{"docs":{},"v":{"docs":{},".":{"docs":{},"p":{"docs":{},"r":{"docs":{},"o":{"docs":{},"d":{"docs":{},"u":{"docs":{},"c":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"和":{"docs":{},"后":{"docs":{},"端":{"docs":{},"配":{"docs":{},"置":{"docs":{},"文":{"docs":{},"件":{"docs":{},"/":{"docs":{},"h":{"docs":{},"o":{"docs":{},"m":{"docs":{},"e":{"docs":{},"/":{"docs":{},"y":{"docs":{},"e":{"docs":{},"q":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"/":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"f":{"docs":{},"i":{"docs":{},"g":{"docs":{},".":{"docs":{},"p":{"docs":{},"y":{"docs":{},"映":{"docs":{},"射":{"docs":{},"到":{"docs":{},"了":{"docs":{},"容":{"docs":{},"器":{"docs":{},"相":{"docs":{},"应":{"docs":{},"的":{"docs":{},"目":{"docs":{},"录":{"docs":{},"下":{"docs":{},"。":{"docs":{},"传":{"docs":{},"入":{"docs":{},"参":{"docs":{},"数":{"docs":{},"m":{"docs":{},"a":{"docs":{},"s":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"是":{"docs":{},"代":{"docs":{},"表":{"docs":{},"该":{"docs":{},"启":{"docs":{},"动":{"docs":{},"方":{"docs":{},"式":{"docs":{},"为":{"docs":{},"主":{"docs":{},"机":{"docs":{},"启":{"docs":{},"动":{"docs":{},"模":{"docs":{},"式":{"docs":{},",":{"docs":{},"也":{"docs":{},"就":{"docs":{},"是":{"docs":{},"所":{"docs":{},"有":{"docs":{},"服":{"docs":{},"务":{"docs":{},"(":{"docs":{},"前":{"docs":{},"端":{"docs":{},"、":{"docs":{},"a":{"docs":{},"p":{"docs":{},"i":{"docs":{},"、":{"docs":{},"f":{"docs":{},"l":{"docs":{},"o":{"docs":{},"w":{"docs":{},"e":{"docs":{},"r":{"docs":{},"、":{"docs":{},"w":{"docs":{},"o":{"docs":{},"r":{"docs":{},"k":{"docs":{},"e":{"docs":{},"r":{"docs":{},")":{"docs":{},"都":{"docs":{},"会":{"docs":{},"启":{"docs":{},"动":{"docs":{},"。":{"docs":{},"另":{"docs":{},"外":{"docs":{},"一":{"docs":{},"个":{"docs":{},"模":{"docs":{},"式":{"docs":{},"是":{"docs":{},"w":{"docs":{},"o":{"docs":{},"r":{"docs":{},"k":{"docs":{},"e":{"docs":{},"r":{"docs":{},"模":{"docs":{},"式":{"docs":{},",":{"docs":{},"只":{"docs":{},"会":{"docs":{},"启":{"docs":{},"动":{"docs":{},"必":{"docs":{},"要":{"docs":{},"的":{"docs":{},"a":{"docs":{},"p":{"docs":{},"i":{"docs":{},"和":{"docs":{},"w":{"docs":{},"o":{"docs":{},"r":{"docs":{},"k":{"docs":{},"e":{"docs":{},"r":{"docs":{},"服":{"docs":{},"务":{"docs":{},",":{"docs":{},"这":{"docs":{},"个":{"docs":{},"对":{"docs":{},"于":{"docs":{},"分":{"docs":{},"布":{"docs":{},"式":{"docs":{},"部":{"docs":{},"署":{"docs":{},"比":{"docs":{},"较":{"docs":{},"有":{"docs":{},"用":{"docs":{},"。":{"docs":{},"等":{"docs":{},"待":{"docs":{},"大":{"docs":{},"约":{"2":{"0":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}},"docs":{}},"docs":{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"docs":{}},"docs":{}},"docs":{}},"docs":{}}}}}}}}}}}}}}}}}}},"docs":{}},"docs":{}},"docs":{}},"docs":{}}}}}},"r":{"docs":{},"o":{"docs":{},"o":{"docs":{},"t":{"docs":{},"是":{"docs":{},"静":{"docs":{},"态":{"docs":{},"文":{"docs":{},"件":{"docs":{},"的":{"docs":{},"根":{"docs":{},"目":{"docs":{},"录":{"docs":{},",":{"docs":{},"这":{"docs":{},"里":{"docs":{},"是":{"docs":{},"n":{"docs":{},"p":{"docs":{},"m":{"docs":{},"打":{"docs":{},"包":{"docs":{},"好":{"docs":{},"后":{"docs":{},"的":{"docs":{},"静":{"docs":{},"态":{"docs":{},"文":{"docs":{},"件":{"docs":{},"。":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"前":{"docs":{},"端":{"docs":{},"配":{"docs":{},"置":{"docs":{},"文":{"docs":{},"件":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.01951219512195122}}}}}}},"者":{"docs":{},"可":{"docs":{},"以":{"docs":{},"通":{"docs":{},"过":{"docs":{},"w":{"docs":{},"e":{"docs":{},"b":{"docs":{},"界":{"docs":{},"面":{"docs":{},"和":{"docs":{},"创":{"docs":{},"建":{"docs":{},"项":{"docs":{},"目":{"docs":{},"目":{"docs":{},"录":{"docs":{},"的":{"docs":{},"方":{"docs":{},"式":{"docs":{},"来":{"docs":{},"添":{"docs":{},"加":{"docs":{},",":{"docs":{},"后":{"docs":{},"者":{"docs":{},"由":{"docs":{},"于":{"docs":{},"没":{"docs":{},"有":{"docs":{},"源":{"docs":{},"代":{"docs":{},"码":{"docs":{},",":{"docs":{},"只":{"docs":{},"能":{"docs":{},"通":{"docs":{},"过":{"docs":{},"w":{"docs":{},"e":{"docs":{},"b":{"docs":{},"界":{"docs":{},"面":{"docs":{},"来":{"docs":{},"添":{"docs":{},"加":{"docs":{},"。":{"docs":{"Usage/Spider/Create.html":{"ref":"Usage/Spider/Create.html","tf":0.2}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"同":{"docs":{},"样":{"docs":{},",":{"docs":{},"在":{"docs":{},"浏":{"docs":{},"览":{"docs":{},"器":{"docs":{},"中":{"docs":{},"输":{"docs":{},"入":{"docs":{},"h":{"docs":{},"t":{"docs":{},"t":{"docs":{},"p":{"docs":{},":":{"docs":{},"/":{"docs":{},"/":{"docs":{},"l":{"docs":{},"o":{"docs":{},"c":{"docs":{},"a":{"docs":{},"l":{"docs":{},"h":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},":":{"8":{"0":{"8":{"0":{"docs":{},"就":{"docs":{},"可":{"docs":{},"以":{"docs":{},"看":{"docs":{},"到":{"docs":{},"界":{"docs":{},"面":{"docs":{},"。":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}}}}}}}}}},"docs":{}},"docs":{}},"docs":{}},"docs":{}}}}}}}}}}}}}}}}}}}}}}}}}}}},"后":{"docs":{},"端":{"docs":{},"配":{"docs":{},"置":{"docs":{},"文":{"docs":{},"件":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.01951219512195122}}}}}}},"面":{"docs":{},"我":{"docs":{},"们":{"docs":{},"需":{"docs":{},"要":{"docs":{},"让":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"运":{"docs":{},"行":{"docs":{},"在":{"docs":{},"各":{"docs":{},"个":{"docs":{},"节":{"docs":{},"点":{"docs":{},"上":{"docs":{},",":{"docs":{},"需":{"docs":{},"要":{"docs":{},"让":{"docs":{},"主":{"docs":{},"机":{"docs":{},"与":{"docs":{},"节":{"docs":{},"点":{"docs":{},"进":{"docs":{},"行":{"docs":{},"通":{"docs":{},"信":{"docs":{},",":{"docs":{},"因":{"docs":{},"此":{"docs":{},"需":{"docs":{},"要":{"docs":{},"知":{"docs":{},"道":{"docs":{},"节":{"docs":{},"点":{"docs":{},"的":{"docs":{},"i":{"docs":{},"p":{"docs":{},"地":{"docs":{},"址":{"docs":{},"和":{"docs":{},"端":{"docs":{},"口":{"docs":{},"。":{"docs":{},"我":{"docs":{},"们":{"docs":{},"需":{"docs":{},"要":{"docs":{},"手":{"docs":{},"动":{"docs":{},"配":{"docs":{},"置":{"docs":{},"一":{"docs":{},"下":{"docs":{},"节":{"docs":{},"点":{"docs":{},"的":{"docs":{},"i":{"docs":{},"p":{"docs":{},"和":{"docs":{},"端":{"docs":{},"口":{"docs":{},"。":{"docs":{},"在":{"docs":{},"节":{"docs":{},"点":{"docs":{},"列":{"docs":{},"表":{"docs":{},"中":{"docs":{},"点":{"docs":{},"击":{"docs":{},"操":{"docs":{},"作":{"docs":{},"列":{"docs":{},"里":{"docs":{},"的":{"docs":{},"蓝":{"docs":{},"色":{"docs":{},"查":{"docs":{},"看":{"docs":{},"按":{"docs":{},"钮":{"docs":{},"进":{"docs":{},"入":{"docs":{},"到":{"docs":{},"节":{"docs":{},"点":{"docs":{},"详":{"docs":{},"情":{"docs":{},"。":{"docs":{},"节":{"docs":{},"点":{"docs":{},"详":{"docs":{},"情":{"docs":{},"样":{"docs":{},"子":{"docs":{},"如":{"docs":{},"下":{"docs":{},"。":{"docs":{"Usage/Node/Edit.html":{"ref":"Usage/Node/Edit.html","tf":0.25}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"多":{"docs":{},"节":{"docs":{},"点":{"docs":{},"模":{"docs":{},"式":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}}}}}},"对":{"docs":{},"d":{"docs":{},"o":{"docs":{},"c":{"docs":{},"k":{"docs":{},"e":{"docs":{},"r":{"docs":{},"不":{"docs":{},"了":{"docs":{},"解":{"docs":{},"的":{"docs":{},"开":{"docs":{},"发":{"docs":{},"者":{"docs":{},",":{"docs":{},"可":{"docs":{},"以":{"docs":{},"参":{"docs":{},"考":{"docs":{},"一":{"docs":{},"下":{"docs":{},"这":{"docs":{},"篇":{"docs":{},"文":{"docs":{},"章":{"docs":{},"(":{"9":{"1":{"0":{"2":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}},"docs":{}},"docs":{}},"docs":{}},"docs":{}}}}}}}}}}}}}}}}}}}}}}}}}},"于":{"docs":{},"自":{"docs":{},"定":{"docs":{},"义":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},",":{"docs":{},"可":{"docs":{},"以":{"docs":{},"在":{"docs":{},"配":{"docs":{},"置":{"docs":{},"标":{"docs":{},"签":{"docs":{},"下":{"docs":{},"点":{"docs":{},"击":{"docs":{},"运":{"docs":{},"行":{"docs":{},"按":{"docs":{},"钮":{"docs":{"Usage/Spider/Run.html":{"ref":"Usage/Spider/Run.html","tf":0.09090909090909091}}}}}}}}}}}}}}}}}}}}}}}},"年":{"docs":{},"了":{"docs":{},",":{"docs":{},"学":{"docs":{},"点":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}}}}}},"当":{"docs":{},"然":{"docs":{},",":{"docs":{},"也":{"docs":{},"可":{"docs":{},"以":{"docs":{},"用":{"docs":{},"d":{"docs":{},"o":{"docs":{},"c":{"docs":{},"k":{"docs":{},"e":{"docs":{},"r":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}}}}}}}}}}}}}},"我":{"docs":{},"们":{"docs":{},"已":{"docs":{},"经":{"docs":{},"在":{"docs":{},"d":{"docs":{},"o":{"docs":{},"c":{"docs":{},"k":{"docs":{},"e":{"docs":{},"r":{"docs":{},"h":{"docs":{},"u":{"docs":{},"b":{"docs":{},"上":{"docs":{},"构":{"docs":{},"建":{"docs":{},"了":{"docs":{},"c":{"docs":{},"r":{"docs":{},"a":{"docs":{},"w":{"docs":{},"l":{"docs":{},"a":{"docs":{},"b":{"docs":{},"的":{"docs":{},"镜":{"docs":{},"像":{"docs":{},",":{"docs":{},"开":{"docs":{},"发":{"docs":{},"者":{"docs":{},"只":{"docs":{},"需":{"docs":{},"要":{"docs":{},"将":{"docs":{},"其":{"docs":{},"p":{"docs":{},"u":{"docs":{},"l":{"docs":{},"l":{"docs":{},"下":{"docs":{},"来":{"docs":{},"使":{"docs":{},"用":{"docs":{},"。":{"docs":{},"在":{"docs":{},"p":{"docs":{},"u":{"docs":{},"l":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"有":{"docs":{},"两":{"docs":{},"种":{"docs":{},"运":{"docs":{},"行":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"的":{"docs":{},"方":{"docs":{},"式":{"docs":{},":":{"docs":{"Usage/Spider/Run.html":{"ref":"Usage/Spider/Run.html","tf":0.09090909090909091}}}}}}}}}}}}}}},"执":{"docs":{},"行":{"docs":{},"以":{"docs":{},"下":{"docs":{},"命":{"docs":{},"令":{"docs":{},"将":{"docs":{},"c":{"docs":{},"r":{"docs":{},"a":{"docs":{},"w":{"docs":{},"l":{"docs":{},"a":{"docs":{},"b":{"docs":{},"的":{"docs":{},"镜":{"docs":{},"像":{"docs":{},"下":{"docs":{},"载":{"docs":{},"下":{"docs":{},"来":{"docs":{},"。":{"docs":{},"镜":{"docs":{},"像":{"docs":{},"大":{"docs":{},"小":{"docs":{},"大":{"docs":{},"概":{"docs":{},"在":{"docs":{},"几":{"docs":{},"百":{"docs":{},"兆":{"docs":{},",":{"docs":{},"因":{"docs":{},"此":{"docs":{},"下":{"docs":{},"载":{"docs":{},"需":{"docs":{},"要":{"docs":{},"几":{"docs":{},"分":{"docs":{},"钟":{"docs":{},"时":{"docs":{},"间":{"docs":{},"。":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"拷":{"docs":{},"贝":{"docs":{},"一":{"docs":{},"份":{"docs":{},"后":{"docs":{},"端":{"docs":{},"配":{"docs":{},"置":{"docs":{},"文":{"docs":{},"件":{"docs":{},".":{"docs":{},"/":{"docs":{},"c":{"docs":{},"r":{"docs":{},"a":{"docs":{},"w":{"docs":{},"l":{"docs":{},"a":{"docs":{},"b":{"docs":{},"/":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"f":{"docs":{},"i":{"docs":{},"g":{"docs":{},"/":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"f":{"docs":{},"i":{"docs":{},"g":{"docs":{},".":{"docs":{},"p":{"docs":{},"y":{"docs":{},"以":{"docs":{},"及":{"docs":{},"前":{"docs":{},"端":{"docs":{},"配":{"docs":{},"置":{"docs":{},"文":{"docs":{},"件":{"docs":{},".":{"docs":{},"/":{"docs":{},"f":{"docs":{},"r":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"e":{"docs":{},"n":{"docs":{},"d":{"docs":{},"/":{"docs":{},".":{"docs":{},"e":{"docs":{},"n":{"docs":{},"v":{"docs":{},".":{"docs":{},"p":{"docs":{},"r":{"docs":{},"o":{"docs":{},"d":{"docs":{},"u":{"docs":{},"c":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"到":{"docs":{},"某":{"docs":{},"一":{"docs":{},"个":{"docs":{},"地":{"docs":{},"方":{"docs":{},"。":{"docs":{},"例":{"docs":{},"如":{"docs":{},"我":{"docs":{},"的":{"docs":{},"例":{"docs":{},"子":{"docs":{},",":{"docs":{},"分":{"docs":{},"别":{"docs":{},"为":{"docs":{},"/":{"docs":{},"h":{"docs":{},"o":{"docs":{},"m":{"docs":{},"e":{"docs":{},"/":{"docs":{},"y":{"docs":{},"e":{"docs":{},"q":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"/":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"f":{"docs":{},"i":{"docs":{},"g":{"docs":{},".":{"docs":{},"p":{"docs":{},"y":{"docs":{},"和":{"docs":{},"/":{"docs":{},"h":{"docs":{},"o":{"docs":{},"m":{"docs":{},"e":{"docs":{},"/":{"docs":{},"y":{"docs":{},"e":{"docs":{},"q":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"/":{"docs":{},".":{"docs":{},"e":{"docs":{},"n":{"docs":{},"v":{"docs":{},".":{"docs":{},"p":{"docs":{},"r":{"docs":{},"o":{"docs":{},"d":{"docs":{},"u":{"docs":{},"c":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"。":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"更":{"docs":{},"改":{"docs":{},"后":{"docs":{},"端":{"docs":{},"配":{"docs":{},"置":{"docs":{},"文":{"docs":{},"件":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"f":{"docs":{},"i":{"docs":{},"g":{"docs":{},".":{"docs":{},"p":{"docs":{},"y":{"docs":{},",":{"docs":{},"将":{"docs":{},"m":{"docs":{},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"o":{"docs":{},"d":{"docs":{},"b":{"docs":{},"、":{"docs":{},"r":{"docs":{},"e":{"docs":{},"d":{"docs":{},"i":{"docs":{},"s":{"docs":{},"的":{"docs":{},"指":{"docs":{},"向":{"docs":{},"i":{"docs":{},"p":{"docs":{},"更":{"docs":{},"改":{"docs":{},"为":{"docs":{},"自":{"docs":{},"己":{"docs":{},"数":{"docs":{},"据":{"docs":{},"的":{"docs":{},"值":{"docs":{},"。":{"docs":{},"注":{"docs":{},"意":{"docs":{},",":{"docs":{},"容":{"docs":{},"器":{"docs":{},"中":{"docs":{},"对":{"docs":{},"应":{"docs":{},"的":{"docs":{},"宿":{"docs":{},"主":{"docs":{},"机":{"docs":{},"的":{"docs":{},"i":{"docs":{},"p":{"docs":{},"地":{"docs":{},"址":{"docs":{},"不":{"docs":{},"是":{"docs":{},"l":{"docs":{},"o":{"docs":{},"c":{"docs":{},"a":{"docs":{},"l":{"docs":{},"h":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},",":{"docs":{},"而":{"docs":{},"是":{"1":{"7":{"2":{"docs":{},".":{"1":{"7":{"docs":{},".":{"0":{"docs":{},".":{"1":{"docs":{},"(":{"docs":{},"当":{"docs":{},"然":{"docs":{},"也":{"docs":{},"可":{"docs":{},"以":{"docs":{},"用":{"docs":{},"n":{"docs":{},"e":{"docs":{},"t":{"docs":{},"w":{"docs":{},"o":{"docs":{},"r":{"docs":{},"k":{"docs":{},"来":{"docs":{},"做":{"docs":{},",":{"docs":{},"只":{"docs":{},"是":{"docs":{},"稍":{"docs":{},"微":{"docs":{},"麻":{"docs":{},"烦":{"docs":{},"一":{"docs":{},"些":{"docs":{},")":{"docs":{},"。":{"docs":{},"更":{"docs":{},"改":{"docs":{},"前":{"docs":{},"端":{"docs":{},"配":{"docs":{},"置":{"docs":{},"文":{"docs":{},"件":{"docs":{},".":{"docs":{},"e":{"docs":{},"n":{"docs":{},"v":{"docs":{},".":{"docs":{},"p":{"docs":{},"r":{"docs":{},"o":{"docs":{},"d":{"docs":{},"u":{"docs":{},"c":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},",":{"docs":{},"将":{"docs":{},"a":{"docs":{},"p":{"docs":{},"i":{"docs":{},"地":{"docs":{},"址":{"docs":{},"v":{"docs":{},"u":{"docs":{},"e":{"docs":{},"_":{"docs":{},"a":{"docs":{},"p":{"docs":{},"p":{"docs":{},"_":{"docs":{},"b":{"docs":{},"a":{"docs":{},"s":{"docs":{},"e":{"docs":{},"_":{"docs":{},"u":{"docs":{},"r":{"docs":{},"l":{"docs":{},"更":{"docs":{},"改":{"docs":{},"为":{"docs":{},"宿":{"docs":{},"主":{"docs":{},"机":{"docs":{},"所":{"docs":{},"在":{"docs":{},"的":{"docs":{},"i":{"docs":{},"p":{"docs":{},"地":{"docs":{},"址":{"docs":{},",":{"docs":{},"例":{"docs":{},"如":{"docs":{},"h":{"docs":{},"t":{"docs":{},"t":{"docs":{},"p":{"docs":{},":":{"docs":{},"/":{"docs":{},"/":{"1":{"9":{"2":{"docs":{},".":{"1":{"6":{"8":{"docs":{},".":{"0":{"docs":{},".":{"8":{"docs":{},":":{"8":{"0":{"0":{"0":{"docs":{},",":{"docs":{},"这":{"docs":{},"将":{"docs":{},"是":{"docs":{},"前":{"docs":{},"端":{"docs":{},"调":{"docs":{},"用":{"docs":{},"a":{"docs":{},"p":{"docs":{},"i":{"docs":{},"会":{"docs":{},"用":{"docs":{},"到":{"docs":{},"的":{"docs":{},"u":{"docs":{},"r":{"docs":{},"l":{"docs":{},"。":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}}}}}}}}}}}}}}}}}}}}},"docs":{}},"docs":{}},"docs":{}},"docs":{}}},"docs":{}}},"docs":{}}},"docs":{}},"docs":{}},"docs":{}}},"docs":{}},"docs":{}},"docs":{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"docs":{}}},"docs":{}}},"docs":{}},"docs":{}}},"docs":{}},"docs":{}},"docs":{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"好":{"docs":{},"配":{"docs":{},"置":{"docs":{},"文":{"docs":{},"件":{"docs":{},"之":{"docs":{},"后":{"docs":{},",":{"docs":{},"接":{"docs":{},"下":{"docs":{},"来":{"docs":{},"就":{"docs":{},"是":{"docs":{},"运":{"docs":{},"行":{"docs":{},"容":{"docs":{},"器":{"docs":{},"了":{"docs":{},"。":{"docs":{},"执":{"docs":{},"行":{"docs":{},"以":{"docs":{},"下":{"docs":{},"命":{"docs":{},"令":{"docs":{},"来":{"docs":{},"启":{"docs":{},"动":{"docs":{},"容":{"docs":{},"器":{"docs":{},"。":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"配":{"docs":{},"置":{"docs":{},"文":{"docs":{},"件":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}}}}}}},"知":{"docs":{},"识":{"docs":{},")":{"docs":{},"做":{"docs":{},"进":{"docs":{},"一":{"docs":{},"步":{"docs":{},"了":{"docs":{},"解":{"docs":{},"。":{"docs":{},"简":{"docs":{},"单":{"docs":{},"来":{"docs":{},"说":{"docs":{},",":{"docs":{},"d":{"docs":{},"o":{"docs":{},"c":{"docs":{},"k":{"docs":{},"e":{"docs":{},"r":{"docs":{},"可":{"docs":{},"以":{"docs":{},"利":{"docs":{},"用":{"docs":{},"已":{"docs":{},"存":{"docs":{},"在":{"docs":{},"的":{"docs":{},"镜":{"docs":{},"像":{"docs":{},"帮":{"docs":{},"助":{"docs":{},"构":{"docs":{},"建":{"docs":{},"一":{"docs":{},"些":{"docs":{},"常":{"docs":{},"用":{"docs":{},"的":{"docs":{},"服":{"docs":{},"务":{"docs":{},"和":{"docs":{},"应":{"docs":{},"用":{"docs":{},",":{"docs":{},"例":{"docs":{},"如":{"docs":{},"n":{"docs":{},"g":{"docs":{},"i":{"docs":{},"n":{"docs":{},"x":{"docs":{},"、":{"docs":{},"m":{"docs":{},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"o":{"docs":{},"d":{"docs":{},"b":{"docs":{},"、":{"docs":{},"r":{"docs":{},"e":{"docs":{},"d":{"docs":{},"i":{"docs":{},"s":{"docs":{},"等":{"docs":{},"等":{"docs":{},"。":{"docs":{},"用":{"docs":{},"d":{"docs":{},"o":{"docs":{},"c":{"docs":{},"k":{"docs":{},"e":{"docs":{},"r":{"docs":{},"运":{"docs":{},"行":{"docs":{},"一":{"docs":{},"个":{"docs":{},"m":{"docs":{},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"o":{"docs":{},"d":{"docs":{},"b":{"docs":{},"服":{"docs":{},"务":{"docs":{},"仅":{"docs":{},"需":{"docs":{},"d":{"docs":{},"o":{"docs":{},"c":{"docs":{},"k":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"运":{"docs":{},"行":{"docs":{},"d":{"docs":{},"o":{"docs":{},"c":{"docs":{},"k":{"docs":{},"e":{"docs":{},"r":{"docs":{},"容":{"docs":{},"器":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}}}}}}}}},"爬":{"docs":{},"虫":{"docs":{"Usage/Spider/":{"ref":"Usage/Spider/","tf":0.14285714285714285},"Usage/Spider/Run.html":{"ref":"Usage/Spider/Run.html","tf":10.090909090909092}}}}}},"这":{"docs":{},"应":{"docs":{},"该":{"docs":{},"是":{"docs":{},"部":{"docs":{},"署":{"docs":{},"应":{"docs":{},"用":{"docs":{},"的":{"docs":{},"最":{"docs":{},"方":{"docs":{},"便":{"docs":{},"也":{"docs":{},"是":{"docs":{},"最":{"docs":{},"节":{"docs":{},"省":{"docs":{},"时":{"docs":{},"间":{"docs":{},"的":{"docs":{},"方":{"docs":{},"式":{"docs":{},"了":{"docs":{},"。":{"docs":{},"在":{"docs":{},"最":{"docs":{},"近":{"docs":{},"的":{"docs":{},"一":{"docs":{},"次":{"docs":{},"版":{"docs":{},"本":{"docs":{},"更":{"docs":{},"新":{"docs":{},"v":{"0":{"docs":{},".":{"2":{"docs":{},".":{"3":{"docs":{},"中":{"docs":{},",":{"docs":{},"我":{"docs":{},"们":{"docs":{},"发":{"docs":{},"布":{"docs":{},"了":{"docs":{},"d":{"docs":{},"o":{"docs":{},"c":{"docs":{},"k":{"docs":{},"e":{"docs":{},"r":{"docs":{},"功":{"docs":{},"能":{"docs":{},",":{"docs":{},"让":{"docs":{},"大":{"docs":{},"家":{"docs":{},"可":{"docs":{},"以":{"docs":{},"利":{"docs":{},"用":{"docs":{},"d":{"docs":{},"o":{"docs":{},"c":{"docs":{},"k":{"docs":{},"e":{"docs":{},"r":{"docs":{},"来":{"docs":{},"轻":{"docs":{},"松":{"docs":{},"部":{"docs":{},"署":{"docs":{},"c":{"docs":{},"r":{"docs":{},"a":{"docs":{},"w":{"docs":{},"l":{"docs":{},"a":{"docs":{},"b":{"docs":{},"。":{"docs":{},"下":{"docs":{},"面":{"docs":{},"将":{"docs":{},"一":{"docs":{},"步":{"docs":{},"一":{"docs":{},"步":{"docs":{},"介":{"docs":{},"绍":{"docs":{},"如":{"docs":{},"何":{"docs":{},"使":{"docs":{},"用":{"docs":{},"d":{"docs":{},"o":{"docs":{},"c":{"docs":{},"k":{"docs":{},"e":{"docs":{},"r":{"docs":{},"来":{"docs":{},"部":{"docs":{},"署":{"docs":{},"c":{"docs":{},"r":{"docs":{},"a":{"docs":{},"w":{"docs":{},"l":{"docs":{},"a":{"docs":{},"b":{"docs":{},"。":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"docs":{}}},"docs":{}}},"docs":{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"样":{"docs":{},"的":{"docs":{},"话":{"docs":{},",":{"docs":{},"p":{"docs":{},"u":{"docs":{},"l":{"docs":{},"l":{"docs":{},"镜":{"docs":{},"像":{"docs":{},"的":{"docs":{},"速":{"docs":{},"度":{"docs":{},"会":{"docs":{},"比":{"docs":{},"不":{"docs":{},"改":{"docs":{},"变":{"docs":{},"镜":{"docs":{},"像":{"docs":{},"源":{"docs":{},"的":{"docs":{},"速":{"docs":{},"度":{"docs":{},"快":{"docs":{},"很":{"docs":{},"多":{"docs":{},"。":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}}}}}}}}}}}}}}}}}}}}}}}}}}}},",":{"docs":{},"p":{"docs":{},"m":{"2":{"docs":{},"会":{"docs":{},"启":{"docs":{},"动":{"3":{"docs":{},"个":{"docs":{},"守":{"docs":{},"护":{"docs":{},"进":{"docs":{},"程":{"docs":{},"来":{"docs":{},"管":{"docs":{},"理":{"docs":{},"这":{"3":{"docs":{},"个":{"docs":{},"服":{"docs":{},"务":{"docs":{},"。":{"docs":{},"我":{"docs":{},"们":{"docs":{},"如":{"docs":{},"果":{"docs":{},"想":{"docs":{},"看":{"docs":{},"后":{"docs":{},"端":{"docs":{},"服":{"docs":{},"务":{"docs":{},"的":{"docs":{},"日":{"docs":{},"志":{"docs":{},"的":{"docs":{},"话":{"docs":{},",":{"docs":{},"可":{"docs":{},"以":{"docs":{},"执":{"docs":{},"行":{"docs":{},"以":{"docs":{},"下":{"docs":{},"命":{"docs":{},"令":{"docs":{},"。":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"docs":{}}}}}}}}}}},"docs":{}}}}},"docs":{}}},"我":{"docs":{},"们":{"docs":{},"就":{"docs":{},"完":{"docs":{},"成":{"docs":{},"了":{"docs":{},"节":{"docs":{},"点":{"docs":{},"的":{"docs":{},"配":{"docs":{},"置":{"docs":{},"工":{"docs":{},"作":{"docs":{},"。":{"docs":{"Usage/Node/Edit.html":{"ref":"Usage/Node/Edit.html","tf":0.25}}}}}}}}}}}}}}}}}},"里":{"docs":{},"先":{"docs":{},"定":{"docs":{},"义":{"docs":{},"了":{"docs":{},"m":{"docs":{},"a":{"docs":{},"s":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"节":{"docs":{},"点":{"docs":{},",":{"docs":{},"也":{"docs":{},"就":{"docs":{},"是":{"docs":{},"c":{"docs":{},"r":{"docs":{},"a":{"docs":{},"w":{"docs":{},"l":{"docs":{},"a":{"docs":{},"b":{"docs":{},"的":{"docs":{},"主":{"docs":{},"节":{"docs":{},"点":{"docs":{},"。":{"docs":{},"m":{"docs":{},"a":{"docs":{},"s":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"依":{"docs":{},"赖":{"docs":{},"于":{"docs":{},"m":{"docs":{},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"o":{"docs":{},"和":{"docs":{},"r":{"docs":{},"e":{"docs":{},"d":{"docs":{},"i":{"docs":{},"s":{"docs":{},"容":{"docs":{},"器":{"docs":{},",":{"docs":{},"因":{"docs":{},"此":{"docs":{},"在":{"docs":{},"启":{"docs":{},"动":{"docs":{},"之":{"docs":{},"前":{"docs":{},"会":{"docs":{},"同":{"docs":{},"时":{"docs":{},"启":{"docs":{},"动":{"docs":{},"m":{"docs":{},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"o":{"docs":{},"和":{"docs":{},"r":{"docs":{},"e":{"docs":{},"d":{"docs":{},"i":{"docs":{},"s":{"docs":{},"容":{"docs":{},"器":{"docs":{},"。":{"docs":{},"这":{"docs":{},"样":{"docs":{},"就":{"docs":{},"不":{"docs":{},"需":{"docs":{},"要":{"docs":{},"单":{"docs":{},"独":{"docs":{},"配":{"docs":{},"置":{"docs":{},"m":{"docs":{},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"o":{"docs":{},"和":{"docs":{},"r":{"docs":{},"e":{"docs":{},"d":{"docs":{},"i":{"docs":{},"s":{"docs":{},"服":{"docs":{},"务":{"docs":{},"了":{"docs":{},",":{"docs":{},"大":{"docs":{},"大":{"docs":{},"节":{"docs":{},"省":{"docs":{},"了":{"docs":{},"环":{"docs":{},"境":{"docs":{},"配":{"docs":{},"置":{"docs":{},"的":{"docs":{},"时":{"docs":{},"间":{"docs":{},"。":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"启":{"docs":{},"动":{"docs":{},"了":{"docs":{},"多":{"docs":{},"增":{"docs":{},"加":{"docs":{},"了":{"docs":{},"两":{"docs":{},"个":{"docs":{},"w":{"docs":{},"o":{"docs":{},"r":{"docs":{},"k":{"docs":{},"e":{"docs":{},"r":{"docs":{},"节":{"docs":{},"点":{"docs":{},",":{"docs":{},"以":{"docs":{},"w":{"docs":{},"o":{"docs":{},"r":{"docs":{},"k":{"docs":{},"e":{"docs":{},"r":{"docs":{},"模":{"docs":{},"式":{"docs":{},"启":{"docs":{},"动":{"docs":{},"。":{"docs":{},"这":{"docs":{},"样":{"docs":{},",":{"docs":{},"多":{"docs":{},"节":{"docs":{},"点":{"docs":{},"部":{"docs":{},"署":{"docs":{},",":{"docs":{},"也":{"docs":{},"就":{"docs":{},"是":{"docs":{},"分":{"docs":{},"布":{"docs":{},"式":{"docs":{},"部":{"docs":{},"署":{"docs":{},"就":{"docs":{},"完":{"docs":{},"成":{"docs":{},"了":{"docs":{},"。":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"是":{"docs":{},"指":{"docs":{},"启":{"docs":{},"动":{"docs":{},"后":{"docs":{},"端":{"docs":{},"服":{"docs":{},"务":{"docs":{},"。":{"docs":{},"我":{"docs":{},"们":{"docs":{},"用":{"docs":{},"p":{"docs":{},"m":{"2":{"docs":{},"来":{"docs":{},"管":{"docs":{},"理":{"docs":{},"进":{"docs":{},"程":{"docs":{},"。":{"docs":{},"执":{"docs":{},"行":{"docs":{},"以":{"docs":{},"下":{"docs":{},"命":{"docs":{},"令":{"docs":{},"。":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}}}}}}}}}}}}}}}},"docs":{}}}}}}}}}}}}}}},"的":{"docs":{},"构":{"docs":{},"建":{"docs":{},"是":{"docs":{},"指":{"docs":{},"前":{"docs":{},"端":{"docs":{},"构":{"docs":{},"建":{"docs":{},",":{"docs":{},"需":{"docs":{},"要":{"docs":{},"执":{"docs":{},"行":{"docs":{},"以":{"docs":{},"下":{"docs":{},"命":{"docs":{},"令":{"docs":{},"。":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}}}}}}}}}}}}}}}}}}}},"爬":{"docs":{},"虫":{"docs":{},"部":{"docs":{},"署":{"docs":{},"是":{"docs":{},"指":{"docs":{},"自":{"docs":{},"定":{"docs":{},"义":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"的":{"docs":{},"部":{"docs":{},"署":{"docs":{},",":{"docs":{},"因":{"docs":{},"为":{"docs":{},"可":{"docs":{},"配":{"docs":{},"置":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"已":{"docs":{},"经":{"docs":{},"内":{"docs":{},"嵌":{"docs":{},"到":{"docs":{},"c":{"docs":{},"r":{"docs":{},"a":{"docs":{},"w":{"docs":{},"l":{"docs":{},"a":{"docs":{},"b":{"docs":{},"中":{"docs":{},"了":{"docs":{},",":{"docs":{},"所":{"docs":{},"有":{"docs":{},"节":{"docs":{},"点":{"docs":{},"都":{"docs":{},"可":{"docs":{},"以":{"docs":{},"使":{"docs":{},"用":{"docs":{},",":{"docs":{},"不":{"docs":{},"需":{"docs":{},"要":{"docs":{},"额":{"docs":{},"外":{"docs":{},"部":{"docs":{},"署":{"docs":{},"。":{"docs":{},"简":{"docs":{},"单":{"docs":{},"来":{"docs":{},"说":{"docs":{},",":{"docs":{},"就":{"docs":{},"是":{"docs":{},"将":{"docs":{},"主":{"docs":{},"机":{"docs":{},"上":{"docs":{},"的":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"源":{"docs":{},"代":{"docs":{},"码":{"docs":{},"通":{"docs":{},"过":{"docs":{},"h":{"docs":{},"t":{"docs":{},"t":{"docs":{},"p":{"docs":{},"的":{"docs":{},"方":{"docs":{},"式":{"docs":{},"打":{"docs":{},"包":{"docs":{},"传":{"docs":{},"输":{"docs":{},"至":{"docs":{},"w":{"docs":{},"o":{"docs":{},"r":{"docs":{},"k":{"docs":{},"e":{"docs":{},"r":{"docs":{},"节":{"docs":{},"点":{"docs":{},"上":{"docs":{},",":{"docs":{},"因":{"docs":{},"此":{"docs":{},"节":{"docs":{},"点":{"docs":{},"就":{"docs":{},"可":{"docs":{},"以":{"docs":{},"运":{"docs":{},"行":{"docs":{},"传":{"docs":{},"输":{"docs":{},"过":{"docs":{},"来":{"docs":{},"的":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"了":{"docs":{},"。":{"docs":{"Usage/Spider/Deploy.html":{"ref":"Usage/Spider/Deploy.html","tf":0.14285714285714285}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"已":{"docs":{},"经":{"docs":{},"有":{"docs":{},"一":{"docs":{},"些":{"docs":{},"配":{"docs":{},"置":{"docs":{},"好":{"docs":{},"的":{"docs":{},"初":{"docs":{},"始":{"docs":{},"输":{"docs":{},"入":{"docs":{},"项":{"docs":{},"。":{"docs":{},"我":{"docs":{},"们":{"docs":{},"简":{"docs":{},"单":{"docs":{},"介":{"docs":{},"绍":{"docs":{},"一":{"docs":{},"下":{"docs":{},"各":{"docs":{},"自":{"docs":{},"的":{"docs":{},"含":{"docs":{},"义":{"docs":{},"。":{"docs":{"Usage/Spider/ConfigurableSpider.html":{"ref":"Usage/Spider/ConfigurableSpider.html","tf":0.03225806451612903}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"我":{"docs":{},"们":{"docs":{},"选":{"docs":{},"择":{"docs":{},"列":{"docs":{},"表":{"docs":{},"+":{"docs":{},"详":{"docs":{},"情":{"docs":{},"页":{"docs":{},"。":{"docs":{"Usage/Spider/ConfigurableSpider.html":{"ref":"Usage/Spider/ConfigurableSpider.html","tf":0.03225806451612903}}}}}}}}}}}}}},"个":{"docs":{},"方":{"docs":{},"式":{"docs":{},"稍":{"docs":{},"微":{"docs":{},"有":{"docs":{},"些":{"docs":{},"繁":{"docs":{},"琐":{"docs":{},",":{"docs":{},"但":{"docs":{},"是":{"docs":{},"对":{"docs":{},"于":{"docs":{},"无":{"docs":{},"法":{"docs":{},"轻":{"docs":{},"松":{"docs":{},"获":{"docs":{},"取":{"docs":{},"服":{"docs":{},"务":{"docs":{},"器":{"docs":{},"的":{"docs":{},"读":{"docs":{},"写":{"docs":{},"权":{"docs":{},"限":{"docs":{},"时":{"docs":{},"是":{"docs":{},"非":{"docs":{},"常":{"docs":{},"有":{"docs":{},"用":{"docs":{},"的":{"docs":{},",":{"docs":{},"适":{"docs":{},"合":{"docs":{},"在":{"docs":{},"生":{"docs":{},"产":{"docs":{},"环":{"docs":{},"境":{"docs":{},"上":{"docs":{},"使":{"docs":{},"用":{"docs":{},"。":{"docs":{"Usage/Spider/CustomizedSpider.html":{"ref":"Usage/Spider/CustomizedSpider.html","tf":0.06666666666666667}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"默":{"docs":{},"认":{"docs":{},"是":{"docs":{},"开":{"docs":{},"启":{"docs":{},"的":{"docs":{},"。":{"docs":{},"如":{"docs":{},"果":{"docs":{},"开":{"docs":{},"启":{"docs":{},",":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"将":{"docs":{},"先":{"docs":{},"抓":{"docs":{},"取":{"docs":{},"网":{"docs":{},"站":{"docs":{},"的":{"docs":{},"r":{"docs":{},"o":{"docs":{},"b":{"docs":{},"o":{"docs":{},"t":{"docs":{},"s":{"docs":{},".":{"docs":{},"t":{"docs":{},"x":{"docs":{},"t":{"docs":{},"并":{"docs":{},"判":{"docs":{},"断":{"docs":{},"页":{"docs":{},"面":{"docs":{},"是":{"docs":{},"否":{"docs":{},"可":{"docs":{},"抓":{"docs":{},";":{"docs":{},"否":{"docs":{},"则":{"docs":{},",":{"docs":{},"不":{"docs":{},"会":{"docs":{},"对":{"docs":{},"此":{"docs":{},"进":{"docs":{},"行":{"docs":{},"验":{"docs":{},"证":{"docs":{},"。":{"docs":{},"用":{"docs":{},"户":{"docs":{},"可":{"docs":{},"以":{"docs":{},"选":{"docs":{},"择":{"docs":{},"将":{"docs":{},"其":{"docs":{},"关":{"docs":{},"闭":{"docs":{},"。":{"docs":{},"请":{"docs":{},"注":{"docs":{},"意":{"docs":{},",":{"docs":{},"任":{"docs":{},"何":{"docs":{},"无":{"docs":{},"视":{"docs":{},"r":{"docs":{},"o":{"docs":{},"b":{"docs":{},"o":{"docs":{},"t":{"docs":{},"s":{"docs":{},"协":{"docs":{},"议":{"docs":{},"的":{"docs":{},"行":{"docs":{},"为":{"docs":{},"都":{"docs":{},"有":{"docs":{},"法":{"docs":{},"律":{"docs":{},"风":{"docs":{},"险":{"docs":{},"。":{"docs":{"Usage/Spider/ConfigurableSpider.html":{"ref":"Usage/Spider/ConfigurableSpider.html","tf":0.03225806451612903}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"种":{"docs":{},"方":{"docs":{},"式":{"docs":{},"非":{"docs":{},"常":{"docs":{},"方":{"docs":{},"便":{"docs":{},",":{"docs":{},"但":{"docs":{},"是":{"docs":{},"需":{"docs":{},"要":{"docs":{},"获":{"docs":{},"得":{"docs":{},"主":{"docs":{},"机":{"docs":{},"服":{"docs":{},"务":{"docs":{},"器":{"docs":{},"的":{"docs":{},"读":{"docs":{},"写":{"docs":{},"权":{"docs":{},"限":{"docs":{},",":{"docs":{},"因":{"docs":{},"而":{"docs":{},"比":{"docs":{},"较":{"docs":{},"适":{"docs":{},"合":{"docs":{},"在":{"docs":{},"开":{"docs":{},"发":{"docs":{},"环":{"docs":{},"境":{"docs":{},"上":{"docs":{},"采":{"docs":{},"用":{"docs":{},"。":{"docs":{"Usage/Spider/CustomizedSpider.html":{"ref":"Usage/Spider/CustomizedSpider.html","tf":0.06666666666666667}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"也":{"docs":{},"是":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"抓":{"docs":{},"取":{"docs":{},"采":{"docs":{},"用":{"docs":{},"的":{"docs":{},"策":{"docs":{},"略":{"docs":{},",":{"docs":{},"也":{"docs":{},"就":{"docs":{},"是":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"遍":{"docs":{},"历":{"docs":{},"网":{"docs":{},"页":{"docs":{},"是":{"docs":{},"如":{"docs":{},"何":{"docs":{},"进":{"docs":{},"行":{"docs":{},"的":{"docs":{},"。":{"docs":{},"作":{"docs":{},"为":{"docs":{},"第":{"docs":{},"一":{"docs":{},"个":{"docs":{},"版":{"docs":{},"本":{"docs":{},",":{"docs":{},"我":{"docs":{},"们":{"docs":{},"有":{"docs":{},"仅":{"docs":{},"列":{"docs":{},"表":{"docs":{},"、":{"docs":{},"仅":{"docs":{},"详":{"docs":{},"情":{"docs":{},"页":{"docs":{},"、":{"docs":{},"列":{"docs":{},"表":{"docs":{},"+":{"docs":{},"详":{"docs":{},"情":{"docs":{},"页":{"docs":{},"。":{"docs":{"Usage/Spider/ConfigurableSpider.html":{"ref":"Usage/Spider/ConfigurableSpider.html","tf":0.03225806451612903}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"些":{"docs":{},"都":{"docs":{},"是":{"docs":{},"再":{"docs":{},"列":{"docs":{},"表":{"docs":{},"页":{"docs":{},"或":{"docs":{},"详":{"docs":{},"情":{"docs":{},"页":{"docs":{},"中":{"docs":{},"需":{"docs":{},"要":{"docs":{},"提":{"docs":{},"取":{"docs":{},"的":{"docs":{},"字":{"docs":{},"段":{"docs":{},"。":{"docs":{},"字":{"docs":{},"段":{"docs":{},"由":{"docs":{},"c":{"docs":{},"s":{"docs":{},"s":{"docs":{},"选":{"docs":{},"择":{"docs":{},"器":{"docs":{},"或":{"docs":{},"者":{"docs":{},"x":{"docs":{},"p":{"docs":{},"a":{"docs":{},"t":{"docs":{},"h":{"docs":{},"来":{"docs":{},"匹":{"docs":{},"配":{"docs":{},"提":{"docs":{},"取":{"docs":{},"。":{"docs":{},"可":{"docs":{},"以":{"docs":{},"选":{"docs":{},"择":{"docs":{},"文":{"docs":{},"本":{"docs":{},"或":{"docs":{},"者":{"docs":{},"属":{"docs":{},"性":{"docs":{},"。":{"docs":{"Usage/Spider/ConfigurableSpider.html":{"ref":"Usage/Spider/ConfigurableSpider.html","tf":0.03225806451612903}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"镜":{"docs":{},"像":{"docs":{},"之":{"docs":{},"前":{"docs":{},",":{"docs":{},"我":{"docs":{},"们":{"docs":{},"需":{"docs":{},"要":{"docs":{},"配":{"docs":{},"置":{"docs":{},"一":{"docs":{},"下":{"docs":{},"镜":{"docs":{},"像":{"docs":{},"源":{"docs":{},"。":{"docs":{},"因":{"docs":{},"为":{"docs":{},"我":{"docs":{},"们":{"docs":{},"在":{"docs":{},"墙":{"docs":{},"内":{"docs":{},",":{"docs":{},"使":{"docs":{},"用":{"docs":{},"原":{"docs":{},"有":{"docs":{},"的":{"docs":{},"镜":{"docs":{},"像":{"docs":{},"源":{"docs":{},"速":{"docs":{},"度":{"docs":{},"非":{"docs":{},"常":{"docs":{},"感":{"docs":{},"人":{"docs":{},",":{"docs":{},"因":{"docs":{},"此":{"docs":{},"将":{"docs":{},"使":{"docs":{},"用":{"docs":{},"d":{"docs":{},"o":{"docs":{},"c":{"docs":{},"k":{"docs":{},"e":{"docs":{},"r":{"docs":{},"h":{"docs":{},"u":{"docs":{},"b":{"docs":{},"在":{"docs":{},"国":{"docs":{},"内":{"docs":{},"的":{"docs":{},"加":{"docs":{},"速":{"docs":{},"器":{"docs":{},"。":{"docs":{},"创":{"docs":{},"建":{"docs":{},"/":{"docs":{},"e":{"docs":{},"t":{"docs":{},"c":{"docs":{},"/":{"docs":{},"d":{"docs":{},"o":{"docs":{},"c":{"docs":{},"k":{"docs":{},"e":{"docs":{},"r":{"docs":{},"/":{"docs":{},"d":{"docs":{},"a":{"docs":{},"e":{"docs":{},"m":{"docs":{},"o":{"docs":{},"n":{"docs":{},".":{"docs":{},"j":{"docs":{},"s":{"docs":{},"o":{"docs":{},"n":{"docs":{},"文":{"docs":{},"件":{"docs":{},",":{"docs":{},"在":{"docs":{},"其":{"docs":{},"中":{"docs":{},"输":{"docs":{},"入":{"docs":{},"如":{"docs":{},"下":{"docs":{},"内":{"docs":{},"容":{"docs":{},"。":{"docs":{"Installation/Docker.html":{"ref":"Installation/Docker.html","tf":0.004878048780487805}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},".":{"docs":{},".":{"docs":{},"/":{"docs":{},"c":{"docs":{},"r":{"docs":{},"a":{"docs":{},"w":{"docs":{},"l":{"docs":{},"a":{"docs":{},"b":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}}}}}}}}},"f":{"docs":{},"r":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"e":{"docs":{},"n":{"docs":{},"d":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}}}}}}}}}}}}},"b":{"docs":{},"u":{"docs":{},"i":{"docs":{},"l":{"docs":{},"d":{"docs":{},":":{"docs":{},"p":{"docs":{},"r":{"docs":{},"o":{"docs":{},"d":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}}}}}}}}}}}},"f":{"docs":{},"l":{"docs":{},"o":{"docs":{},"w":{"docs":{},"e":{"docs":{},"r":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}},".":{"docs":{},"p":{"docs":{},"i":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}}}}}}}}}},"r":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"e":{"docs":{},"n":{"docs":{},"d":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}}}}}}}}}},"g":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}},"i":{"docs":{},"t":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}}}}},"h":{"docs":{},"t":{"docs":{},"t":{"docs":{},"p":{"docs":{},"s":{"docs":{},":":{"docs":{},"/":{"docs":{},"/":{"docs":{},"g":{"docs":{},"i":{"docs":{},"t":{"docs":{},"h":{"docs":{},"u":{"docs":{},"b":{"docs":{},".":{"docs":{},"c":{"docs":{},"o":{"docs":{},"m":{"docs":{},"/":{"docs":{},"t":{"docs":{},"i":{"docs":{},"k":{"docs":{},"a":{"docs":{},"z":{"docs":{},"y":{"docs":{},"q":{"docs":{},"/":{"docs":{},"c":{"docs":{},"r":{"docs":{},"a":{"docs":{},"w":{"docs":{},"l":{"docs":{},"a":{"docs":{},"b":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"l":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"e":{"docs":{},"n":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}}}}}}},"o":{"docs":{},"g":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}}}}},"y":{"docs":{},"a":{"docs":{},"r":{"docs":{},"n":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.025}}}}}},"分":{"docs":{},"别":{"docs":{},"配":{"docs":{},"置":{"docs":{},"前":{"docs":{},"端":{"docs":{},"配":{"docs":{},"置":{"docs":{},"文":{"docs":{},"件":{"docs":{},".":{"docs":{},"/":{"docs":{},"f":{"docs":{},"r":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"e":{"docs":{},"n":{"docs":{},"d":{"docs":{},"/":{"docs":{},".":{"docs":{},"e":{"docs":{},"n":{"docs":{},"v":{"docs":{},".":{"docs":{},"p":{"docs":{},"r":{"docs":{},"o":{"docs":{},"d":{"docs":{},"u":{"docs":{},"c":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"和":{"docs":{},"后":{"docs":{},"端":{"docs":{},"配":{"docs":{},"置":{"docs":{},"文":{"docs":{},"件":{"docs":{},".":{"docs":{},"/":{"docs":{},"c":{"docs":{},"r":{"docs":{},"a":{"docs":{},"w":{"docs":{},"l":{"docs":{},"a":{"docs":{},"b":{"docs":{},"/":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"f":{"docs":{},"i":{"docs":{},"g":{"docs":{},"/":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"f":{"docs":{},"i":{"docs":{},"g":{"docs":{},".":{"docs":{},"p":{"docs":{},"y":{"docs":{},"。":{"docs":{},"分":{"docs":{},"别":{"docs":{},"需":{"docs":{},"要":{"docs":{},"对":{"docs":{},"部":{"docs":{},"署":{"docs":{},"后":{"docs":{},"a":{"docs":{},"p":{"docs":{},"i":{"docs":{},"地":{"docs":{},"址":{"docs":{},"以":{"docs":{},"及":{"docs":{},"数":{"docs":{},"据":{"docs":{},"库":{"docs":{},"地":{"docs":{},"址":{"docs":{},"进":{"docs":{},"行":{"docs":{},"配":{"docs":{},"置":{"docs":{},"。":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"页":{"docs":{},"选":{"docs":{},"择":{"docs":{},"器":{"docs":{"Usage/Spider/ConfigurableSpider.html":{"ref":"Usage/Spider/ConfigurableSpider.html","tf":0.03225806451612903}}}}}}},"启":{"docs":{},"动":{"docs":{},"服":{"docs":{},"务":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}}}}}},"拉":{"docs":{},"取":{"docs":{},"代":{"docs":{},"码":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}}}}}},"构":{"docs":{},"建":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}},"完":{"docs":{},"成":{"docs":{},"后":{"docs":{},",":{"docs":{},"会":{"docs":{},"在":{"docs":{},".":{"docs":{},"/":{"docs":{},"f":{"docs":{},"r":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"e":{"docs":{},"n":{"docs":{},"d":{"docs":{},"目":{"docs":{},"录":{"docs":{},"下":{"docs":{},"创":{"docs":{},"建":{"docs":{},"一":{"docs":{},"个":{"docs":{},"d":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"文":{"docs":{},"件":{"docs":{},"夹":{"docs":{},",":{"docs":{},"里":{"docs":{},"面":{"docs":{},"是":{"docs":{},"打":{"docs":{},"包":{"docs":{},"好":{"docs":{},"后":{"docs":{},"的":{"docs":{},"静":{"docs":{},"态":{"docs":{},"文":{"docs":{},"件":{"docs":{},"。":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"添":{"docs":{},"加":{"docs":{},"/":{"docs":{},"e":{"docs":{},"t":{"docs":{},"c":{"docs":{},"/":{"docs":{},"n":{"docs":{},"g":{"docs":{},"i":{"docs":{},"n":{"docs":{},"x":{"docs":{},"/":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"f":{"docs":{},".":{"docs":{},"d":{"docs":{},"/":{"docs":{},"c":{"docs":{},"r":{"docs":{},"a":{"docs":{},"w":{"docs":{},"l":{"docs":{},"a":{"docs":{},"b":{"docs":{},".":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"f":{"docs":{},"文":{"docs":{},"件":{"docs":{},",":{"docs":{},"输":{"docs":{},"入":{"docs":{},"以":{"docs":{},"下":{"docs":{},"内":{"docs":{},"容":{"docs":{},"。":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"完":{"docs":{},"成":{"docs":{},"后":{"docs":{},",":{"docs":{},"可":{"docs":{},"以":{"docs":{},"看":{"docs":{},"到":{"docs":{},"刚":{"docs":{},"刚":{"docs":{},"添":{"docs":{},"加":{"docs":{},"的":{"docs":{},"可":{"docs":{},"配":{"docs":{},"置":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"出":{"docs":{},"现":{"docs":{},"了":{"docs":{},"在":{"docs":{},"最":{"docs":{},"下":{"docs":{},"方":{"docs":{},",":{"docs":{},"点":{"docs":{},"击":{"docs":{},"查":{"docs":{},"看":{"docs":{},"进":{"docs":{},"入":{"docs":{},"到":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"详":{"docs":{},"情":{"docs":{},"。":{"docs":{"Usage/Spider/ConfigurableSpider.html":{"ref":"Usage/Spider/ConfigurableSpider.html","tf":0.03225806451612903}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"爬":{"docs":{},"虫":{"docs":{"Usage/Spider/ConfigurableSpider.html":{"ref":"Usage/Spider/ConfigurableSpider.html","tf":0.03225806451612903}}}}}},"然":{"docs":{},"后":{"docs":{},"在":{"docs":{},"浏":{"docs":{},"览":{"docs":{},"器":{"docs":{},"中":{"docs":{},"输":{"docs":{},"入":{"docs":{},"h":{"docs":{},"t":{"docs":{},"t":{"docs":{},"p":{"docs":{},":":{"docs":{},"/":{"docs":{},"/":{"docs":{},"l":{"docs":{},"o":{"docs":{},"c":{"docs":{},"a":{"docs":{},"l":{"docs":{},"h":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},":":{"8":{"0":{"8":{"0":{"docs":{},"就":{"docs":{},"可":{"docs":{},"以":{"docs":{},"看":{"docs":{},"到":{"docs":{},"界":{"docs":{},"面":{"docs":{},"了":{"docs":{},"。":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}}}}}}}}}}}},"docs":{}},"docs":{}},"docs":{}},"docs":{}}}}}}}}}}}}}}}}}}}}}}}}},",":{"docs":{},"在":{"docs":{},"侧":{"docs":{},"边":{"docs":{},"栏":{"docs":{},"点":{"docs":{},"击":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"导":{"docs":{},"航":{"docs":{},"至":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"列":{"docs":{},"表":{"docs":{},",":{"docs":{},"点":{"docs":{},"击":{"docs":{},"添":{"docs":{},"加":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"按":{"docs":{},"钮":{"docs":{},",":{"docs":{},"选":{"docs":{},"择":{"docs":{},"自":{"docs":{},"定":{"docs":{},"义":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},",":{"docs":{},"点":{"docs":{},"击":{"docs":{},"上":{"docs":{},"传":{"docs":{},"按":{"docs":{},"钮":{"docs":{},",":{"docs":{},"选":{"docs":{},"择":{"docs":{},"刚":{"docs":{},"刚":{"docs":{},"打":{"docs":{},"包":{"docs":{},"好":{"docs":{},"的":{"docs":{},"z":{"docs":{},"i":{"docs":{},"p":{"docs":{},"文":{"docs":{},"件":{"docs":{},"。":{"docs":{},"上":{"docs":{},"传":{"docs":{},"成":{"docs":{},"功":{"docs":{},"后":{"docs":{},",":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"列":{"docs":{},"表":{"docs":{},"中":{"docs":{},"会":{"docs":{},"出":{"docs":{},"现":{"docs":{},"新":{"docs":{},"添":{"docs":{},"加":{"docs":{},"的":{"docs":{},"自":{"docs":{},"定":{"docs":{},"义":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"。":{"docs":{},"这":{"docs":{},"样":{"docs":{},"就":{"docs":{},"算":{"docs":{},"添":{"docs":{},"加":{"docs":{},"好":{"docs":{},"了":{"docs":{},"。":{"docs":{"Usage/Spider/CustomizedSpider.html":{"ref":"Usage/Spider/CustomizedSpider.html","tf":0.06666666666666667}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"c":{"docs":{},"r":{"docs":{},"a":{"docs":{},"w":{"docs":{},"l":{"docs":{},"a":{"docs":{},"b":{"docs":{},"会":{"docs":{},"提":{"docs":{},"示":{"docs":{},"任":{"docs":{},"务":{"docs":{},"已":{"docs":{},"经":{"docs":{},"派":{"docs":{},"发":{"docs":{},"到":{"docs":{},"队":{"docs":{},"列":{"docs":{},"中":{"docs":{},"去":{"docs":{},"了":{"docs":{},",":{"docs":{},"然":{"docs":{},"后":{"docs":{},"你":{"docs":{},"可":{"docs":{},"以":{"docs":{},"在":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"详":{"docs":{},"情":{"docs":{},"左":{"docs":{},"侧":{"docs":{},"看":{"docs":{},"到":{"docs":{},"新":{"docs":{},"创":{"docs":{},"建":{"docs":{},"的":{"docs":{},"任":{"docs":{},"务":{"docs":{},"。":{"docs":{},"点":{"docs":{},"击":{"docs":{},"创":{"docs":{},"建":{"docs":{},"时":{"docs":{},"间":{"docs":{},"可":{"docs":{},"以":{"docs":{},"导":{"docs":{},"航":{"docs":{},"至":{"docs":{},"任":{"docs":{},"务":{"docs":{},"详":{"docs":{},"情":{"docs":{},"。":{"docs":{"Usage/Spider/Run.html":{"ref":"Usage/Spider/Run.html","tf":0.09090909090909091}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"现":{"docs":{},"在":{"docs":{},",":{"docs":{},"只":{"docs":{},"需":{"docs":{},"要":{"docs":{},"启":{"docs":{},"动":{"docs":{},"n":{"docs":{},"g":{"docs":{},"i":{"docs":{},"n":{"docs":{},"x":{"docs":{},"服":{"docs":{},"务":{"docs":{},"就":{"docs":{},"完":{"docs":{},"成":{"docs":{},"了":{"docs":{},"启":{"docs":{},"动":{"docs":{},"前":{"docs":{},"端":{"docs":{},"服":{"docs":{},"务":{"docs":{},"。":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}}}}}}}}}}}}}}}}}}}}}}}}}}}},"配":{"docs":{},"置":{"docs":{"Installation/Direct.html":{"ref":"Installation/Direct.html","tf":0.0125}},"爬":{"docs":{},"虫":{"docs":{"Usage/Spider/CustomizedSpider.html":{"ref":"Usage/Spider/CustomizedSpider.html","tf":0.06666666666666667},"Usage/Spider/ConfigurableSpider.html":{"ref":"Usage/Spider/ConfigurableSpider.html","tf":0.03225806451612903}}}}}},"该":{"docs":{},"模":{"docs":{},"式":{"docs":{},"同":{"docs":{},"样":{"docs":{},"会":{"docs":{},"启":{"docs":{},"动":{"3":{"docs":{},"个":{"docs":{},"后":{"docs":{},"端":{"docs":{},"服":{"docs":{},"务":{"docs":{},"和":{"1":{"docs":{},"个":{"docs":{},"前":{"docs":{},"端":{"docs":{},"服":{"docs":{},"务":{"docs":{},"。":{"docs":{},"前":{"docs":{},"端":{"docs":{},"服":{"docs":{},"务":{"docs":{},"是":{"docs":{},"通":{"docs":{},"过":{"docs":{},"n":{"docs":{},"p":{"docs":{},"m":{"docs":{"Installation/Preview.html":{"ref":"Installation/Preview.html","tf":0.125}}}}}}}}}}}}}}}}}}},"docs":{}}}}}}}},"docs":{}}}}}}}}},"任":{"docs":{},"务":{"docs":{"Usage/":{"ref":"Usage/","tf":0.2},"Usage/Task/":{"ref":"Usage/Task/","tf":10}}}},"使":{"docs":{},"用":{"docs":{},"c":{"docs":{},"r":{"docs":{},"a":{"docs":{},"w":{"docs":{},"l":{"docs":{},"a":{"docs":{},"b":{"docs":{"Usage/":{"ref":"Usage/","tf":10}}}}}}}}}}},"定":{"docs":{},"时":{"docs":{},"任":{"docs":{},"务":{"docs":{"Usage/":{"ref":"Usage/","tf":0.2},"Usage/Schedule/":{"ref":"Usage/Schedule/","tf":10}},"触":{"docs":{},"发":{"docs":{"Usage/Spider/Run.html":{"ref":"Usage/Spider/Run.html","tf":0.18181818181818182}},"是":{"docs":{},"比":{"docs":{},"较":{"docs":{},"常":{"docs":{},"用":{"docs":{},"的":{"docs":{},"功":{"docs":{},"能":{"docs":{},",":{"docs":{},"对":{"docs":{},"于":{"docs":{},"增":{"docs":{},"量":{"docs":{},"抓":{"docs":{},"取":{"docs":{},"或":{"docs":{},"对":{"docs":{},"实":{"docs":{},"时":{"docs":{},"性":{"docs":{},"有":{"docs":{},"要":{"docs":{},"求":{"docs":{},"的":{"docs":{},"任":{"docs":{},"务":{"docs":{},"很":{"docs":{},"重":{"docs":{},"要":{"docs":{},"。":{"docs":{},"这":{"docs":{},"在":{"docs":{},"定":{"docs":{},"时":{"docs":{},"任":{"docs":{},"务":{"docs":{},"中":{"docs":{},"会":{"docs":{},"详":{"docs":{},"细":{"docs":{},"介":{"docs":{},"绍":{"docs":{},"。":{"docs":{"Usage/Spider/Run.html":{"ref":"Usage/Spider/Run.html","tf":0.09090909090909091}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"爬":{"docs":{},"虫":{"docs":{"Usage/":{"ref":"Usage/","tf":0.2},"Usage/Spider/":{"ref":"Usage/Spider/","tf":10.142857142857142}},"就":{"docs":{},"是":{"docs":{},"我":{"docs":{},"们":{"docs":{},"通":{"docs":{},"常":{"docs":{},"说":{"docs":{},"的":{"docs":{},"网":{"docs":{},"络":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"了":{"docs":{},",":{"docs":{},"本":{"docs":{},"小":{"docs":{},"节":{"docs":{},"将":{"docs":{},"介":{"docs":{},"绍":{"docs":{},"如":{"docs":{},"下":{"docs":{},"内":{"docs":{},"容":{"docs":{},":":{"docs":{"Usage/Spider/":{"ref":"Usage/Spider/","tf":0.14285714285714285}}}}}}}}}}}}}}}}}}}}}}}}}}},"最":{"docs":{},"开":{"docs":{},"始":{"docs":{},"遍":{"docs":{},"历":{"docs":{},"的":{"docs":{},"网":{"docs":{},"址":{"docs":{},"。":{"docs":{"Usage/Spider/ConfigurableSpider.html":{"ref":"Usage/Spider/ConfigurableSpider.html","tf":0.03225806451612903}}}}}}}}}}}}},"节":{"docs":{},"点":{"docs":{"Usage/":{"ref":"Usage/","tf":0.2},"Usage/Node/":{"ref":"Usage/Node/","tf":10.25}},"其":{"docs":{},"实":{"docs":{},"就":{"docs":{},"是":{"docs":{},"c":{"docs":{},"e":{"docs":{},"l":{"docs":{},"e":{"docs":{},"r":{"docs":{},"y":{"docs":{},"中":{"docs":{},"的":{"docs":{},"w":{"docs":{},"o":{"docs":{},"r":{"docs":{},"k":{"docs":{},"e":{"docs":{},"r":{"docs":{},"。":{"docs":{},"一":{"docs":{},"个":{"docs":{},"节":{"docs":{},"点":{"docs":{},"运":{"docs":{},"行":{"docs":{},"时":{"docs":{},"会":{"docs":{},"连":{"docs":{},"接":{"docs":{},"到":{"docs":{},"一":{"docs":{},"个":{"docs":{},"任":{"docs":{},"务":{"docs":{},"队":{"docs":{},"列":{"docs":{},"(":{"docs":{},"例":{"docs":{},"如":{"docs":{},"r":{"docs":{},"e":{"docs":{},"d":{"docs":{},"i":{"docs":{},"s":{"docs":{},")":{"docs":{},"来":{"docs":{},"接":{"docs":{},"收":{"docs":{},"和":{"docs":{},"运":{"docs":{},"行":{"docs":{},"任":{"docs":{},"务":{"docs":{},"。":{"docs":{},"所":{"docs":{},"有":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"需":{"docs":{},"要":{"docs":{},"在":{"docs":{},"运":{"docs":{},"行":{"docs":{},"时":{"docs":{},"被":{"docs":{},"部":{"docs":{},"署":{"docs":{},"到":{"docs":{},"节":{"docs":{},"点":{"docs":{},"上":{"docs":{},",":{"docs":{},"用":{"docs":{},"户":{"docs":{},"在":{"docs":{},"部":{"docs":{},"署":{"docs":{},"前":{"docs":{},"需":{"docs":{},"要":{"docs":{},"定":{"docs":{},"义":{"docs":{},"节":{"docs":{},"点":{"docs":{},"的":{"docs":{},"i":{"docs":{},"p":{"docs":{},"地":{"docs":{},"址":{"docs":{},"和":{"docs":{},"端":{"docs":{},"口":{"docs":{},"(":{"docs":{},"默":{"docs":{},"认":{"docs":{},"为":{"docs":{},"l":{"docs":{},"o":{"docs":{},"c":{"docs":{},"a":{"docs":{},"l":{"docs":{},"h":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},":":{"8":{"0":{"0":{"0":{"docs":{},")":{"docs":{},"。":{"docs":{"Usage/Node/":{"ref":"Usage/Node/","tf":0.25}}}}},"docs":{}},"docs":{}},"docs":{}},"docs":{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"修":{"docs":{},"改":{"docs":{},"节":{"docs":{},"点":{"docs":{},"信":{"docs":{},"息":{"docs":{"Usage/Node/":{"ref":"Usage/Node/","tf":0.25},"Usage/Node/Edit.html":{"ref":"Usage/Node/Edit.html","tf":10.25}}}}}}}},"点":{"docs":{},"击":{"docs":{},"侧":{"docs":{},"边":{"docs":{},"栏":{"docs":{},"的":{"docs":{},"节":{"docs":{},"点":{"docs":{},"导":{"docs":{},"航":{"docs":{},"至":{"docs":{},"节":{"docs":{},"点":{"docs":{},"列":{"docs":{},"表":{"docs":{},",":{"docs":{},"可":{"docs":{},"以":{"docs":{},"看":{"docs":{},"到":{"docs":{},"已":{"docs":{},"上":{"docs":{},"线":{"docs":{},"的":{"docs":{},"节":{"docs":{},"点":{"docs":{},"。":{"docs":{},"这":{"docs":{},"里":{"docs":{},"的":{"docs":{},"节":{"docs":{},"点":{"docs":{},"其":{"docs":{},"实":{"docs":{},"就":{"docs":{},"是":{"docs":{},"已":{"docs":{},"经":{"docs":{},"运":{"docs":{},"行":{"docs":{},"起":{"docs":{},"来":{"docs":{},"的":{"docs":{},"c":{"docs":{},"e":{"docs":{},"l":{"docs":{},"e":{"docs":{},"r":{"docs":{},"i":{"docs":{"Usage/Node/View.html":{"ref":"Usage/Node/View.html","tf":0.3333333333333333}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"保":{"docs":{},"存":{"docs":{},"、":{"docs":{},"预":{"docs":{},"览":{"docs":{},",":{"docs":{},"查":{"docs":{},"看":{"docs":{},"预":{"docs":{},"览":{"docs":{},"内":{"docs":{},"容":{"docs":{},"。":{"docs":{"Usage/Spider/ConfigurableSpider.html":{"ref":"Usage/Spider/ConfigurableSpider.html","tf":0.03225806451612903}}}}}}}}}}}}}}},"可":{"docs":{},"配":{"docs":{},"置":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"。":{"docs":{"Usage/Spider/ConfigurableSpider.html":{"ref":"Usage/Spider/ConfigurableSpider.html","tf":0.03225806451612903}}}}}}}},"配":{"docs":{},"置":{"docs":{},"标":{"docs":{},"签":{"docs":{},"进":{"docs":{},"入":{"docs":{},"到":{"docs":{},"配":{"docs":{},"置":{"docs":{},"页":{"docs":{},"面":{"docs":{},"。":{"docs":{},"接":{"docs":{},"下":{"docs":{},"来":{"docs":{},",":{"docs":{},"我":{"docs":{},"们":{"docs":{},"需":{"docs":{},"要":{"docs":{},"对":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"规":{"docs":{},"则":{"docs":{},"进":{"docs":{},"行":{"docs":{},"配":{"docs":{},"置":{"docs":{},"。":{"docs":{"Usage/Spider/ConfigurableSpider.html":{"ref":"Usage/Spider/ConfigurableSpider.html","tf":0.03225806451612903}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"在":{"docs":{},"右":{"docs":{},"侧":{"docs":{},"分":{"docs":{},"别":{"docs":{},"输":{"docs":{},"入":{"docs":{},"该":{"docs":{},"节":{"docs":{},"点":{"docs":{},"对":{"docs":{},"应":{"docs":{},"的":{"docs":{},"节":{"docs":{},"点":{"docs":{},"i":{"docs":{},"p":{"docs":{},"和":{"docs":{},"节":{"docs":{},"点":{"docs":{},"端":{"docs":{},"口":{"docs":{},",":{"docs":{},"然":{"docs":{},"后":{"docs":{},"点":{"docs":{},"击":{"docs":{},"保":{"docs":{},"存":{"docs":{},"按":{"docs":{},"钮":{"docs":{},",":{"docs":{},"保":{"docs":{},"存":{"docs":{},"该":{"docs":{},"节":{"docs":{},"点":{"docs":{},"信":{"docs":{},"息":{"docs":{},"。":{"docs":{"Usage/Node/Edit.html":{"ref":"Usage/Node/Edit.html","tf":0.25}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"定":{"docs":{},"义":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"中":{"docs":{},",":{"docs":{},"我":{"docs":{},"们":{"docs":{},"需":{"docs":{},"要":{"docs":{},"配":{"docs":{},"置":{"docs":{},"一":{"docs":{},"下":{"docs":{},"执":{"docs":{},"行":{"docs":{},"命":{"docs":{},"令":{"docs":{},"(":{"docs":{},"运":{"docs":{},"行":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"时":{"docs":{},"后":{"docs":{},"台":{"docs":{},"执":{"docs":{},"行":{"docs":{},"的":{"docs":{},"s":{"docs":{},"h":{"docs":{},"e":{"docs":{},"l":{"docs":{},"l":{"docs":{},"命":{"docs":{},"令":{"docs":{},")":{"docs":{},"和":{"docs":{},"结":{"docs":{},"果":{"docs":{},"集":{"docs":{},"(":{"docs":{},"通":{"docs":{},"过":{"docs":{},"c":{"docs":{},"r":{"docs":{},"a":{"docs":{},"w":{"docs":{},"l":{"docs":{},"a":{"docs":{},"b":{"docs":{},"_":{"docs":{},"c":{"docs":{},"o":{"docs":{},"l":{"docs":{},"l":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"传":{"docs":{},"递":{"docs":{},"给":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"程":{"docs":{},"序":{"docs":{},",":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"程":{"docs":{},"序":{"docs":{},"存":{"docs":{},"储":{"docs":{},"结":{"docs":{},"果":{"docs":{},"的":{"docs":{},"地":{"docs":{},"方":{"docs":{},")":{"docs":{},",":{"docs":{},"然":{"docs":{},"后":{"docs":{},"点":{"docs":{},"击":{"docs":{},"保":{"docs":{},"存":{"docs":{},"按":{"docs":{},"钮":{"docs":{},"保":{"docs":{},"存":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"信":{"docs":{},"息":{"docs":{},"。":{"docs":{"Usage/Spider/CustomizedSpider.html":{"ref":"Usage/Spider/CustomizedSpider.html","tf":0.06666666666666667}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"通":{"docs":{},"过":{"docs":{},"w":{"docs":{},"e":{"docs":{},"b":{"docs":{},"界":{"docs":{},"面":{"docs":{},"上":{"docs":{},"传":{"docs":{},"之":{"docs":{},"前":{"docs":{},",":{"docs":{},"需":{"docs":{},"要":{"docs":{},"将":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"项":{"docs":{},"目":{"docs":{},"文":{"docs":{},"件":{"docs":{},"打":{"docs":{},"包":{"docs":{},"成":{"docs":{},"z":{"docs":{},"i":{"docs":{},"p":{"docs":{},"格":{"docs":{},"式":{"docs":{},"。":{"docs":{"Usage/Spider/CustomizedSpider.html":{"ref":"Usage/Spider/CustomizedSpider.html","tf":0.06666666666666667}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"侧":{"docs":{},"边":{"docs":{},"栏":{"docs":{},"点":{"docs":{},"击":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"导":{"docs":{},"航":{"docs":{},"至":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"列":{"docs":{},"表":{"docs":{},",":{"docs":{},"点":{"docs":{},"击":{"docs":{},"添":{"docs":{},"加":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"按":{"docs":{},"钮":{"docs":{},"。":{"docs":{"Usage/Spider/ConfigurableSpider.html":{"ref":"Usage/Spider/ConfigurableSpider.html","tf":0.03225806451612903}}}}}}}}}}}}}}}}}}}}}}}}}},"检":{"docs":{},"查":{"docs":{},"完":{"docs":{},"目":{"docs":{},"标":{"docs":{},"网":{"docs":{},"页":{"docs":{},"的":{"docs":{},"元":{"docs":{},"素":{"docs":{},"c":{"docs":{},"s":{"docs":{},"s":{"docs":{},"选":{"docs":{},"择":{"docs":{},"器":{"docs":{},"之":{"docs":{},"后":{"docs":{},",":{"docs":{},"我":{"docs":{},"们":{"docs":{},"输":{"docs":{},"入":{"docs":{},"列":{"docs":{},"表":{"docs":{},"项":{"docs":{},"选":{"docs":{},"择":{"docs":{},"器":{"docs":{},"、":{"docs":{},"开":{"docs":{},"始":{"docs":{},"u":{"docs":{},"r":{"docs":{},"l":{"docs":{},"、":{"docs":{},"列":{"docs":{},"表":{"docs":{},"页":{"docs":{},"/":{"docs":{},"详":{"docs":{},"情":{"docs":{},"页":{"docs":{},"等":{"docs":{},"信":{"docs":{},"息":{"docs":{},"。":{"docs":{},"注":{"docs":{},"意":{"docs":{},"勾":{"docs":{},"选":{"docs":{},"u":{"docs":{},"r":{"docs":{},"l":{"docs":{},"为":{"docs":{},"详":{"docs":{},"情":{"docs":{},"页":{"docs":{},"u":{"docs":{},"r":{"docs":{},"l":{"docs":{},"。":{"docs":{"Usage/Spider/ConfigurableSpider.html":{"ref":"Usage/Spider/ConfigurableSpider.html","tf":0.03225806451612903}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"爬":{"docs":{},"虫":{"docs":{},"列":{"docs":{},"表":{"docs":{},"中":{"docs":{},"点":{"docs":{},"击":{"docs":{},"操":{"docs":{},"作":{"docs":{},"列":{"docs":{},"的":{"docs":{},"部":{"docs":{},"署":{"docs":{},"按":{"docs":{},"钮":{"docs":{},",":{"docs":{},"将":{"docs":{},"指":{"docs":{},"定":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"部":{"docs":{},"署":{"docs":{},"到":{"docs":{},"所":{"docs":{},"有":{"docs":{},"在":{"docs":{},"线":{"docs":{},"节":{"docs":{},"点":{"docs":{},"中":{"docs":{},";":{"docs":{"Usage/Spider/Deploy.html":{"ref":"Usage/Spider/Deploy.html","tf":0.14285714285714285}}}}}}}}}}}}}}}}}}}}}}}}}}},"部":{"docs":{},"署":{"docs":{},"所":{"docs":{},"有":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},",":{"docs":{},"将":{"docs":{},"所":{"docs":{},"有":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"部":{"docs":{},"署":{"docs":{},"到":{"docs":{},"所":{"docs":{},"有":{"docs":{},"在":{"docs":{},"线":{"docs":{},"节":{"docs":{},"点":{"docs":{},"中":{"docs":{},";":{"docs":{"Usage/Spider/Deploy.html":{"ref":"Usage/Spider/Deploy.html","tf":0.14285714285714285}}}}}}}}}}}}}}}}}}}}}}}}}}},"操":{"docs":{},"作":{"docs":{},"列":{"docs":{},"点":{"docs":{},"击":{"docs":{},"运":{"docs":{},"行":{"docs":{},"按":{"docs":{},"钮":{"docs":{},",":{"docs":{},"或":{"docs":{},"者":{"docs":{"Usage/Spider/Run.html":{"ref":"Usage/Spider/Run.html","tf":0.09090909090909091}}}}}}}}}}}}}}}}},"详":{"docs":{},"情":{"docs":{},"的":{"docs":{},"概":{"docs":{},"览":{"docs":{},"标":{"docs":{},"签":{"docs":{},"中":{"docs":{},",":{"docs":{},"点":{"docs":{},"击":{"docs":{},"部":{"docs":{},"署":{"docs":{},"按":{"docs":{},"钮":{"docs":{},",":{"docs":{},"将":{"docs":{},"指":{"docs":{},"定":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"部":{"docs":{},"署":{"docs":{},"到":{"docs":{},"所":{"docs":{},"有":{"docs":{},"在":{"docs":{},"线":{"docs":{},"节":{"docs":{},"点":{"docs":{},"中":{"docs":{},"。":{"docs":{"Usage/Spider/Deploy.html":{"ref":"Usage/Spider/Deploy.html","tf":0.14285714285714285}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"中":{"docs":{},"概":{"docs":{},"览":{"docs":{},"标":{"docs":{},"签":{"docs":{},"下":{"docs":{},"点":{"docs":{},"击":{"docs":{},"运":{"docs":{},"行":{"docs":{},"按":{"docs":{},"钮":{"docs":{},",":{"docs":{},"或":{"docs":{},"者":{"docs":{"Usage/Spider/Run.html":{"ref":"Usage/Spider/Run.html","tf":0.09090909090909091}}}}}}}}}}}}}}}}}}}}},"运":{"docs":{},"行":{"docs":{},"了":{"docs":{},"一":{"docs":{},"段":{"docs":{},"时":{"docs":{},"间":{"docs":{},"之":{"docs":{},"后":{"docs":{},",":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"会":{"docs":{},"积":{"docs":{},"累":{"docs":{},"一":{"docs":{},"些":{"docs":{},"统":{"docs":{},"计":{"docs":{},"数":{"docs":{},"据":{"docs":{},",":{"docs":{},"例":{"docs":{},"如":{"docs":{},"运":{"docs":{},"行":{"docs":{},"成":{"docs":{},"功":{"docs":{},"率":{"docs":{},"、":{"docs":{},"任":{"docs":{},"务":{"docs":{},"数":{"docs":{},"、":{"docs":{},"运":{"docs":{},"行":{"docs":{},"时":{"docs":{},"长":{"docs":{},"等":{"docs":{},"指":{"docs":{},"标":{"docs":{},"。":{"docs":{},"c":{"docs":{},"r":{"docs":{},"a":{"docs":{},"w":{"docs":{},"l":{"docs":{},"a":{"docs":{},"b":{"docs":{},"将":{"docs":{},"这":{"docs":{},"些":{"docs":{},"指":{"docs":{},"标":{"docs":{},"汇":{"docs":{},"总":{"docs":{},"并":{"docs":{},"呈":{"docs":{},"现":{"docs":{},"给":{"docs":{},"开":{"docs":{},"发":{"docs":{},"者":{"docs":{},"。":{"docs":{"Usage/Spider/Analytics.html":{"ref":"Usage/Spider/Analytics.html","tf":0.3333333333333333}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"创":{"docs":{},"建":{"docs":{},"爬":{"docs":{},"虫":{"docs":{"Usage/Spider/":{"ref":"Usage/Spider/","tf":0.14285714285714285},"Usage/Spider/Create.html":{"ref":"Usage/Spider/Create.html","tf":10.2}}}}}},"可":{"docs":{},"配":{"docs":{},"置":{"docs":{},"爬":{"docs":{},"虫":{"docs":{"Usage/Spider/":{"ref":"Usage/Spider/","tf":0.14285714285714285},"Usage/Spider/Create.html":{"ref":"Usage/Spider/Create.html","tf":0.2},"Usage/Spider/ConfigurableSpider.html":{"ref":"Usage/Spider/ConfigurableSpider.html","tf":10.03225806451613}},"是":{"docs":{},"版":{"docs":{},"本":{"docs":{},"v":{"0":{"docs":{},".":{"2":{"docs":{},".":{"1":{"docs":{},"开":{"docs":{},"发":{"docs":{},"的":{"docs":{},"功":{"docs":{},"能":{"docs":{},"。":{"docs":{},"目":{"docs":{},"的":{"docs":{},"是":{"docs":{},"将":{"docs":{},"具":{"docs":{},"有":{"docs":{},"相":{"docs":{},"似":{"docs":{},"网":{"docs":{},"站":{"docs":{},"结":{"docs":{},"构":{"docs":{},"的":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"项":{"docs":{},"目":{"docs":{},"可":{"docs":{},"配":{"docs":{},"置":{"docs":{},"化":{"docs":{},",":{"docs":{},"将":{"docs":{},"开":{"docs":{},"发":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"的":{"docs":{},"过":{"docs":{},"程":{"docs":{},"流":{"docs":{},"程":{"docs":{},"化":{"docs":{},",":{"docs":{},"大":{"docs":{},"大":{"docs":{},"提":{"docs":{},"高":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"开":{"docs":{},"发":{"docs":{},"效":{"docs":{},"率":{"docs":{},"。":{"docs":{"Usage/Spider/ConfigurableSpider.html":{"ref":"Usage/Spider/ConfigurableSpider.html","tf":0.03225806451612903}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"docs":{}}},"docs":{}}},"docs":{}}}}}}}}}},"统":{"docs":{},"计":{"docs":{},"数":{"docs":{},"据":{"docs":{"Usage/Spider/":{"ref":"Usage/Spider/","tf":0.14285714285714285},"Usage/Spider/Analytics.html":{"ref":"Usage/Spider/Analytics.html","tf":10.333333333333334}}}}}},"部":{"docs":{},"署":{"docs":{},"爬":{"docs":{},"虫":{"docs":{"Usage/Spider/":{"ref":"Usage/Spider/","tf":0.14285714285714285},"Usage/Spider/Deploy.html":{"ref":"Usage/Spider/Deploy.html","tf":10.142857142857142}},"很":{"docs":{},"简":{"docs":{},"单":{"docs":{},",":{"docs":{},"有":{"docs":{},"三":{"docs":{},"种":{"docs":{},"方":{"docs":{},"式":{"docs":{},":":{"docs":{"Usage/Spider/Deploy.html":{"ref":"Usage/Spider/Deploy.html","tf":0.14285714285714285}}}}}}}}}}}}}},"好":{"docs":{},"之":{"docs":{},"后":{"docs":{},",":{"docs":{},"我":{"docs":{},"们":{"docs":{},"就":{"docs":{},"可":{"docs":{},"以":{"docs":{},"运":{"docs":{},"行":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"了":{"docs":{},"。":{"docs":{"Usage/Spider/Deploy.html":{"ref":"Usage/Spider/Deploy.html","tf":0.14285714285714285}}}}}}}}}}}}}}}}}}},"自":{"docs":{},"定":{"docs":{},"义":{"docs":{},"爬":{"docs":{},"虫":{"docs":{"Usage/Spider/Create.html":{"ref":"Usage/Spider/Create.html","tf":0.2},"Usage/Spider/CustomizedSpider.html":{"ref":"Usage/Spider/CustomizedSpider.html","tf":10.066666666666666}},"是":{"docs":{},"指":{"docs":{},"用":{"docs":{},"户":{"docs":{},"可":{"docs":{},"以":{"docs":{},"添":{"docs":{},"加":{"docs":{},"的":{"docs":{},"任":{"docs":{},"何":{"docs":{},"语":{"docs":{},"言":{"docs":{},"任":{"docs":{},"何":{"docs":{},"框":{"docs":{},"架":{"docs":{},"的":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},",":{"docs":{},"高":{"docs":{},"度":{"docs":{},"自":{"docs":{},"定":{"docs":{},"义":{"docs":{},"化":{"docs":{},"。":{"docs":{},"当":{"docs":{},"用":{"docs":{},"户":{"docs":{},"添":{"docs":{},"加":{"docs":{},"好":{"docs":{},"自":{"docs":{},"定":{"docs":{},"义":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"之":{"docs":{},"后":{"docs":{},",":{"docs":{},"c":{"docs":{},"r":{"docs":{},"a":{"docs":{},"w":{"docs":{},"l":{"docs":{},"a":{"docs":{},"b":{"docs":{},"就":{"docs":{},"可":{"docs":{},"以":{"docs":{},"将":{"docs":{},"其":{"docs":{},"集":{"docs":{},"成":{"docs":{},"到":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"管":{"docs":{},"理":{"docs":{},"的":{"docs":{},"系":{"docs":{},"统":{"docs":{},"中":{"docs":{},"来":{"docs":{},"。":{"docs":{"Usage/Spider/CustomizedSpider.html":{"ref":"Usage/Spider/CustomizedSpider.html","tf":0.06666666666666667}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"的":{"docs":{},"添":{"docs":{},"加":{"docs":{},"有":{"docs":{},"两":{"docs":{},"种":{"docs":{},"方":{"docs":{},"式":{"docs":{},":":{"docs":{"Usage/Spider/CustomizedSpider.html":{"ref":"Usage/Spider/CustomizedSpider.html","tf":0.06666666666666667}}}}}}}}}}}}}}}},"接":{"docs":{},"下":{"docs":{},"来":{"docs":{},",":{"docs":{},"我":{"docs":{},"们":{"docs":{},"就":{"docs":{},"可":{"docs":{},"以":{"docs":{},"部":{"docs":{},"署":{"docs":{},"、":{"docs":{},"运":{"docs":{},"行":{"docs":{},"自":{"docs":{},"定":{"docs":{},"义":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"了":{"docs":{},"。":{"docs":{"Usage/Spider/CustomizedSpider.html":{"ref":"Usage/Spider/CustomizedSpider.html","tf":0.06666666666666667}}}}}}}}}}}}}}}}}}}}}}},"通":{"docs":{},"过":{"docs":{},"w":{"docs":{},"e":{"docs":{},"b":{"docs":{},"界":{"docs":{},"面":{"docs":{},"上":{"docs":{},"传":{"docs":{"Usage/Spider/CustomizedSpider.html":{"ref":"Usage/Spider/CustomizedSpider.html","tf":0.06666666666666667}},"爬":{"docs":{},"虫":{"docs":{"Usage/Spider/CustomizedSpider.html":{"ref":"Usage/Spider/CustomizedSpider.html","tf":0.06666666666666667}}}}}}}}}}},"创":{"docs":{},"建":{"docs":{},"项":{"docs":{},"目":{"docs":{},"目":{"docs":{},"录":{"docs":{"Usage/Spider/CustomizedSpider.html":{"ref":"Usage/Spider/CustomizedSpider.html","tf":0.06666666666666667}}}}}}}},"添":{"docs":{},"加":{"docs":{},"项":{"docs":{},"目":{"docs":{},"目":{"docs":{},"录":{"docs":{"Usage/Spider/CustomizedSpider.html":{"ref":"Usage/Spider/CustomizedSpider.html","tf":0.06666666666666667}}}}}}}}}},"&":{"docs":{"Usage/Spider/ConfigurableSpider.html":{"ref":"Usage/Spider/ConfigurableSpider.html","tf":0.06451612903225806}}},"仅":{"docs":{},"列":{"docs":{},"表":{"docs":{},"页":{"docs":{},"。":{"docs":{},"这":{"docs":{},"也":{"docs":{},"是":{"docs":{},"最":{"docs":{},"简":{"docs":{},"单":{"docs":{},"的":{"docs":{},"形":{"docs":{},"式":{"docs":{},",":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"遍":{"docs":{},"历":{"docs":{},"列":{"docs":{},"表":{"docs":{},"上":{"docs":{},"的":{"docs":{},"列":{"docs":{},"表":{"docs":{},"项":{"docs":{},",":{"docs":{},"将":{"docs":{},"数":{"docs":{},"据":{"docs":{},"抓":{"docs":{},"取":{"docs":{},"下":{"docs":{},"来":{"docs":{},"。":{"docs":{"Usage/Spider/ConfigurableSpider.html":{"ref":"Usage/Spider/ConfigurableSpider.html","tf":0.03225806451612903}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"详":{"docs":{},"情":{"docs":{},"页":{"docs":{},"。":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"只":{"docs":{},"抓":{"docs":{},"取":{"docs":{},"详":{"docs":{},"情":{"docs":{},"页":{"docs":{},"。":{"docs":{"Usage/Spider/ConfigurableSpider.html":{"ref":"Usage/Spider/ConfigurableSpider.html","tf":0.03225806451612903}}}}}}}}}}}}}}}},"列":{"docs":{},"表":{"docs":{},"+":{"docs":{},"详":{"docs":{},"情":{"docs":{},"页":{"docs":{},"。":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"先":{"docs":{},"遍":{"docs":{},"历":{"docs":{},"列":{"docs":{},"表":{"docs":{},"页":{"docs":{},",":{"docs":{},"将":{"docs":{},"列":{"docs":{},"表":{"docs":{},"项":{"docs":{},"中":{"docs":{},"的":{"docs":{},"详":{"docs":{},"情":{"docs":{},"页":{"docs":{},"地":{"docs":{},"址":{"docs":{},"提":{"docs":{},"取":{"docs":{},"出":{"docs":{},"来":{"docs":{},"并":{"docs":{},"跟":{"docs":{},"进":{"docs":{},"抓":{"docs":{},"取":{"docs":{},"详":{"docs":{},"情":{"docs":{},"页":{"docs":{},"。":{"docs":{"Usage/Spider/ConfigurableSpider.html":{"ref":"Usage/Spider/ConfigurableSpider.html","tf":0.03225806451612903}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"页":{"docs":{},"字":{"docs":{},"段":{"docs":{"Usage/Spider/ConfigurableSpider.html":{"ref":"Usage/Spider/ConfigurableSpider.html","tf":0.03225806451612903}}}}},"项":{"docs":{},"的":{"docs":{},"匹":{"docs":{},"和":{"docs":{},"分":{"docs":{},"页":{"docs":{},"按":{"docs":{},"钮":{"docs":{},"的":{"docs":{},"匹":{"docs":{},"配":{"docs":{},"查":{"docs":{},"询":{"docs":{},",":{"docs":{},"由":{"docs":{},"c":{"docs":{},"s":{"docs":{},"s":{"docs":{},"或":{"docs":{},"x":{"docs":{},"p":{"docs":{},"a":{"docs":{},"t":{"docs":{},"h":{"docs":{},"来":{"docs":{},"进":{"docs":{},"行":{"docs":{},"匹":{"docs":{},"配":{"docs":{},"。":{"docs":{"Usage/Spider/ConfigurableSpider.html":{"ref":"Usage/Spider/ConfigurableSpider.html","tf":0.03225806451612903}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"选":{"docs":{},"择":{"docs":{},"器":{"docs":{"Usage/Spider/ConfigurableSpider.html":{"ref":"Usage/Spider/ConfigurableSpider.html","tf":0.03225806451612903}}}}}}}},"开":{"docs":{},"始":{"docs":{},"u":{"docs":{},"r":{"docs":{},"l":{"docs":{"Usage/Spider/ConfigurableSpider.html":{"ref":"Usage/Spider/ConfigurableSpider.html","tf":0.03225806451612903}}}}}}},"抓":{"docs":{},"取":{"docs":{},"类":{"docs":{},"别":{"docs":{"Usage/Spider/ConfigurableSpider.html":{"ref":"Usage/Spider/ConfigurableSpider.html","tf":0.03225806451612903}}}}}},"详":{"docs":{},"情":{"docs":{},"页":{"docs":{},"字":{"docs":{},"段":{"docs":{"Usage/Spider/ConfigurableSpider.html":{"ref":"Usage/Spider/ConfigurableSpider.html","tf":0.03225806451612903}}}}}}},"输":{"docs":{},"入":{"docs":{},"完":{"docs":{},"基":{"docs":{},"本":{"docs":{},"信":{"docs":{},"息":{"docs":{},",":{"docs":{},"点":{"docs":{},"击":{"docs":{},"添":{"docs":{},"加":{"docs":{},"。":{"docs":{"Usage/Spider/ConfigurableSpider.html":{"ref":"Usage/Spider/ConfigurableSpider.html","tf":0.03225806451612903}}}}}}}}}}}}}}},"遵":{"docs":{},"守":{"docs":{},"r":{"docs":{},"o":{"docs":{},"b":{"docs":{},"o":{"docs":{},"t":{"docs":{},"s":{"docs":{},"协":{"docs":{},"议":{"docs":{"Usage/Spider/ConfigurableSpider.html":{"ref":"Usage/Spider/ConfigurableSpider.html","tf":0.03225806451612903}}}}}}}}}}}},"手":{"docs":{},"动":{"docs":{},"触":{"docs":{},"发":{"docs":{"Usage/Spider/Run.html":{"ref":"Usage/Spider/Run.html","tf":0.18181818181818182}}}}}},"要":{"docs":{},"查":{"docs":{},"看":{"docs":{},"统":{"docs":{},"计":{"docs":{},"数":{"docs":{},"据":{"docs":{},"的":{"docs":{},"话":{"docs":{},",":{"docs":{},"只":{"docs":{},"需":{"docs":{},"要":{"docs":{},"在":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"详":{"docs":{},"情":{"docs":{},"中":{"docs":{},",":{"docs":{},"点":{"docs":{},"击":{"docs":{},"分":{"docs":{},"析":{"docs":{},"标":{"docs":{},"签":{"docs":{},",":{"docs":{},"就":{"docs":{},"可":{"docs":{},"以":{"docs":{},"看":{"docs":{},"到":{"docs":{},"爬":{"docs":{},"虫":{"docs":{},"的":{"docs":{},"统":{"docs":{},"计":{"docs":{},"数":{"docs":{},"据":{"docs":{},"了":{"docs":{},"。":{"docs":{"Usage/Spider/Analytics.html":{"ref":"Usage/Spider/Analytics.html","tf":0.3333333333333333}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"网":{"docs":{},"站":{"docs":{"Usage/Site/":{"ref":"Usage/Site/","tf":10}}}},"架":{"docs":{},"构":{"docs":{"Architecture/":{"ref":"Architecture/","tf":11}}}},"样":{"docs":{},"例":{"docs":{"Examples/":{"ref":"Examples/","tf":10}}}}},"length":285},"corpusTokens":["\"27017:27017\"","\"6379:6379\"","\"8000:8000\"","\"8001:8000\"","\"8002:8000\"","\"8080:8080\"","\"registri","#","&","'3.3'","../crawlab","../frontend","/bin/sh","/home/yeqing/.env.production.master:/opt/crawlab/frontend/.env.product","/home/yeqing/.env.production.worker:/opt/crawlab/frontend/.env.product","/home/yeqing/.env.production:/opt/crawlab/frontend/.env.product","/home/yeqing/config.master.py:/opt/crawlab/crawlab/config/config.pi","/home/yeqing/config.py:/opt/crawlab/crawlab/config/config.pi","/home/yeqing/config.worker.py:/opt/crawlab/crawlab/config/config.pi","/home/yeqing/jenkins_home/workspace/crawlab_develop/frontend/dist;","/opt/crawlab/docker_init.sh","16.04是以下命令。","27017:27017","30秒的时间来build前端静态文件,之后就可以打开crawlab界面地址地址看到界面了。界面地址默认为http://localhost:8080。","8000:8000","8080:8080","8080;","[\"https://registry.dock","[app]","\\","alway","api服务","app","app.pi","apt","build:prod","cd","celeri","clone","cn.com\"]","compos","compose.yml后,只需要运行以下命令就可以启动crawlab。","compose.yml定义如下。","compose.yml更改为如下内容。","compose.yml的yaml文件来定义需要启动的容器,可以是单个,也可以(通常)是多个的。crawlab的dock","compose也很简单,大家去网上百度一下就可以了。","compose和定义好dock","compose是一个集群管理方式,可以利用名为dock","compose的方式很适合多节点部署,在原有的master基础上增加几个worker节点,达到多节点部署的目的。将dock","compose的方式来部署。dock","container_name:","crawlab","crawlab主要解决的是大量爬虫管理困难的问题,例如需要监控上百个网站的参杂scrapy和selenium的项目不容易做到同时管理,而且命令行管理的成本非常高,还容易出错。crawlab支持任何语言和任何框架,配合任务调度、任务监控,很容易做到对成规模的爬虫项目进行有效监控管理。","crawlab会自动发现project_source_file_folder目录下的所有爬虫目录,并将这些目录生成自定义爬虫并集成到crawlab中。因此,将爬虫项目目录拷贝到project_source_file_folder目录下,就可以添加一个爬虫了。","crawlab允许用户创建两种爬虫:","crawlab是基于celery的分布式爬虫管理平台,可以集成任何语言和任何框架。","crawlab的可配置爬虫是基于scrapy的,因此天生支持并发。而且,可配置爬虫完全支持自定义爬虫的一般功能,因此也支持任务调度、任务监控、日志监控、数据分析。","crawlab简介","d","demo","depends_on:","dev.crawlab.com;","docker","docker安装部署","entrypoint:","exampl","flower","flower.pi","frontend","g","git","https://github.com/tikazyq/crawlab","image:","index","index.html;","instal","listen","log","manage.pi","master","master:","mirrors\":","mongo","mongo:","mongo:latest","mongo一行命令。如何安装docker跟操作系统有关,这里就不展开讲了,需要的同学自行百度一下相关教程。","name","nginx","npm","p","pip","pm2","ports:","pull","python","r","redi","redis:","redis:latest","reload","requir","restart:","rm","root","run","serv","server","server_nam","serve来进行的,因此是开发者模式。注意:强烈不建议在生产环境中用预览模式。预览模式只是让开发者快速体验crawlab以及调试代码问题的一种方式,而不是用作生产环境部署的。","services:","start","sudo","tikazyq/crawlab","tikazyq/crawlab:latest","up","v","version:","volumns:","worker","worker.pi","worker1:","worker2:","worker,他们通过连接到配置好的broker(通常是redis)来进行与主机的通信。","yarn","{","}","下载镜像","仅列表页。这也是最简单的形式,爬虫遍历列表上的列表项,将数据抓取下来。","仅详情页。爬虫只抓取详情页。","任务","使用crawlab","修改节点信息","其中,root是静态文件的根目录,这里是npm打包好后的静态文件。","其中,我们映射了8080端口(nginx前端静态文件)以及8000端口(后端api)到宿主机。另外还将前端配置文件/home/yeqing/.env.production和后端配置文件/home/yeqing/config.py映射到了容器相应的目录下。传入参数master是代表该启动方式为主机启动模式,也就是所有服务(前端、api、flower、worker)都会启动。另外一个模式是worker模式,只会启动必要的api和worker服务,这个对于分布式部署比较有用。等待大约20","分别配置前端配置文件./frontend/.env.production和后端配置文件./crawlab/config/config.py。分别需要对部署后api地址以及数据库地址进行配置。","分页选择器","列表+详情页。爬虫先遍历列表页,将列表项中的详情页地址提取出来并跟进抓取详情页。","列表页字段","列表项的匹和分页按钮的匹配查询,由css或xpath来进行匹配。","列表项选择器","创建爬虫","前端配置文件","前者可以通过web界面和创建项目目录的方式来添加,后者由于没有源代码,只能通过web界面来添加。","可配置爬虫","可配置爬虫是版本v0.2.1开发的功能。目的是将具有相似网站结构的爬虫项目可配置化,将开发爬虫的过程流程化,大大提高爬虫开发效率。","同样,在浏览器中输入http://localhost:8080就可以看到界面。","后端配置文件","后面我们需要让爬虫运行在各个节点上,需要让主机与节点进行通信,因此需要知道节点的ip地址和端口。我们需要手动配置一下节点的ip和端口。在节点列表中点击操作列里的蓝色查看按钮进入到节点详情。节点详情样子如下。","启动服务","在侧边栏点击爬虫导航至爬虫列表,点击添加爬虫按钮。","在右侧分别输入该节点对应的节点ip和节点端口,然后点击保存按钮,保存该节点信息。","在定义爬虫中,我们需要配置一下执行命令(运行爬虫时后台执行的shell命令)和结果集(通过crawlab_collection传递给爬虫程序,爬虫程序存储结果的地方),然后点击保存按钮保存爬虫信息。","在检查完目标网页的元素css选择器之后,我们输入列表项选择器、开始url、列表页/详情页等信息。注意勾选url为详情页url。","在爬虫列表中操作列点击运行按钮,或者","在爬虫列表中点击操作列的部署按钮,将指定爬虫部署到所有在线节点中;","在爬虫列表中点击部署所有爬虫,将所有爬虫部署到所有在线节点中;","在爬虫详情中概览标签下点击运行按钮,或者","在爬虫详情的概览标签中,点击部署按钮,将指定爬虫部署到所有在线节点中。","在运行了一段时间之后,爬虫会积累一些统计数据,例如运行成功率、任务数、运行时长等指标。crawlab将这些指标汇总并呈现给开发者。","在通过web界面上传之前,需要将爬虫项目文件打包成zip格式。","基于celery的爬虫分布式爬虫管理平台,支持多种编程语言以及多种爬虫框架.","多节点模式","安装","安装crawlab","安装docker","安装nginx,在ubuntu","安装前端所需库。","安装后端所需库。","安装完docker","定时任务","定时任务触发","定时任务触发是比较常用的功能,对于增量抓取或对实时性有要求的任务很重要。这在定时任务中会详细介绍。","对docker不了解的开发者,可以参考一下这篇文章(9102","对于自定义爬虫,可以在配置标签下点击运行按钮","年了,学点","开始url","当然,也可以用docker","我们已经在dockerhub上构建了crawlab的镜像,开发者只需要将其pull下来使用。在pul","我们有两种运行爬虫的方式:","手动触发","执行以下命令将crawlab的镜像下载下来。镜像大小大概在几百兆,因此下载需要几分钟时间。","抓取类别","拉取代码","拷贝一份后端配置文件./crawlab/config/config.py以及前端配置文件./frontend/.env.production到某一个地方。例如我的例子,分别为/home/yeqing/config.py和/home/yeqing/.env.production。","接下来,我们就可以部署、运行自定义爬虫了。","更改后端配置文件config.py,将mongodb、redis的指向ip更改为自己数据的值。注意,容器中对应的宿主机的ip地址不是localhost,而是172.17.0.1(当然也可以用network来做,只是稍微麻烦一些)。更改前端配置文件.env.production,将api地址vue_app_base_url更改为宿主机所在的ip地址,例如http://192.168.0.8:8000,这将是前端调用api会用到的url。","更改好配置文件之后,接下来就是运行容器了。执行以下命令来启动容器。","更改配置文件","本使用手册会帮助您解决在安装使用crawlab遇到的任何问题。","本小节将介绍三种安装docker的方式:","本小节将介绍如何使用crawlab,包括如下内容:","构建","构建完成后,会在./frontend目录下创建一个dist文件夹,里面是打包好后的静态文件。","架构","查看演示","查看节点","查看节点列表","样例","添加/etc/nginx/conf.d/crawlab.conf文件,输入以下内容。","添加完成后,可以看到刚刚添加的可配置爬虫出现了在最下方,点击查看进入到爬虫详情。","添加爬虫","点击侧边栏的节点导航至节点列表,可以看到已上线的节点。这里的节点其实就是已经运行起来的celeri","点击保存、预览,查看预览内容。","点击可配置爬虫。","点击配置标签进入到配置页面。接下来,我们需要对爬虫规则进行配置。","然后在浏览器中输入http://localhost:8080就可以看到界面了。","然后,crawlab会提示任务已经派发到队列中去了,然后你可以在爬虫详情左侧看到新创建的任务。点击创建时间可以导航至任务详情。","然后,在侧边栏点击爬虫导航至爬虫列表,点击添加爬虫按钮,选择自定义爬虫,点击上传按钮,选择刚刚打包好的zip文件。上传成功后,爬虫列表中会出现新添加的自定义爬虫。这样就算添加好了。","爬虫","爬虫就是我们通常说的网络爬虫了,本小节将介绍如下内容:","爬虫最开始遍历的网址。","现在,只需要启动nginx服务就完成了启动前端服务。","直接部署","直接部署是之前没有docker时的部署方式,相对于docker部署来说有些繁琐。但了解如何直接部署可以帮助更深入地理解docker是如何构建crawlab镜像的。这里简单介绍一下。","知识)做进一步了解。简单来说,docker可以利用已存在的镜像帮助构建一些常用的服务和应用,例如nginx、mongodb、redis等等。用docker运行一个mongodb服务仅需dock","统计数据","网站","自定义爬虫","自定义爬虫是指用户可以添加的任何语言任何框架的爬虫,高度自定义化。当用户添加好自定义爬虫之后,crawlab就可以将其集成到爬虫管理的系统中来。","自定义爬虫的添加有两种方式:","节点","节点其实就是celery中的worker。一个节点运行时会连接到一个任务队列(例如redis)来接收和运行任务。所有爬虫需要在运行时被部署到节点上,用户在部署前需要定义节点的ip地址和端口(默认为localhost:8000)。","要查看统计数据的话,只需要在爬虫详情中,点击分析标签,就可以看到爬虫的统计数据了。","该模式同样会启动3个后端服务和1个前端服务。前端服务是通过npm","详情页字段","输入完基本信息,点击添加。","运行docker容器","运行爬虫","这个方式稍微有些繁琐,但是对于无法轻松获取服务器的读写权限时是非常有用的,适合在生产环境上使用。","这个默认是开启的。如果开启,爬虫将先抓取网站的robots.txt并判断页面是否可抓;否则,不会对此进行验证。用户可以选择将其关闭。请注意,任何无视robots协议的行为都有法律风险。","这也是爬虫抓取采用的策略,也就是爬虫遍历网页是如何进行的。作为第一个版本,我们有仅列表、仅详情页、列表+详情页。","这些都是再列表页或详情页中需要提取的字段。字段由css选择器或者xpath来匹配提取。可以选择文本或者属性。","这应该是部署应用的最方便也是最节省时间的方式了。在最近的一次版本更新v0.2.3中,我们发布了docker功能,让大家可以利用docker来轻松部署crawlab。下面将一步一步介绍如何使用docker来部署crawlab。","这样的话,pull镜像的速度会比不改变镜像源的速度快很多。","这样,pm2会启动3个守护进程来管理这3个服务。我们如果想看后端服务的日志的话,可以执行以下命令。","这样,我们就完成了节点的配置工作。","这种方式非常方便,但是需要获得主机服务器的读写权限,因而比较适合在开发环境上采用。","这里先定义了master节点,也就是crawlab的主节点。master依赖于mongo和redis容器,因此在启动之前会同时启动mongo和redis容器。这样就不需要单独配置mongo和redis服务了,大大节省了环境配置的时间。","这里启动了多增加了两个worker节点,以worker模式启动。这样,多节点部署,也就是分布式部署就完成了。","这里已经有一些配置好的初始输入项。我们简单介绍一下各自的含义。","这里我们选择列表+详情页。","这里是指启动后端服务。我们用pm2来管理进程。执行以下命令。","这里的构建是指前端构建,需要执行以下命令。","这里的爬虫部署是指自定义爬虫的部署,因为可配置爬虫已经内嵌到crawlab中了,所有节点都可以使用,不需要额外部署。简单来说,就是将主机上的爬虫源代码通过http的方式打包传输至worker节点上,因此节点就可以运行传输过来的爬虫了。","通过web界面上传","通过web界面上传爬虫","通过创建项目目录","通过添加项目目录","遵守robots协议","部署好之后,我们就可以运行爬虫了。","部署爬虫","部署爬虫很简单,有三种方式:","配置","配置爬虫","镜像之前,我们需要配置一下镜像源。因为我们在墙内,使用原有的镜像源速度非常感人,因此将使用dockerhub在国内的加速器。创建/etc/docker/daemon.json文件,在其中输入如下内容。","项目自今年三月份上线以来受到爬虫爱好者们和开发者们的好评,不少使用者还表示会用crawlab搭建公司的爬虫平台。经过近3个月的迭代,我们陆续上线了定时任务、数据分析、网站信息、可配置爬虫、自动提取字段、下载结果、上传爬虫等功能,将crawlab打造得更加实用,更加全面,能够真正帮助用户解决爬虫管理困难的问题。","预览模式","预览模式是一种让用户比较快的上手的一种部署模式。跟直接部署类似,但不用经过构建、nginx和启动服务的步骤。在启动时只需要执行以下命令就可以了。相较于直接部署来说方便一些。","首先是将github上的代码拉取到本地。","首先,我们来看如何安装crawlab吧,请查看安装。"],"pipeline":["stopWordFilter","stemmer"]},"store":{"./":{"url":"./","title":"Crawlab简介","keywords":"","body":"Crawlab\n基于Celery的爬虫分布式爬虫管理平台,支持多种编程语言以及多种爬虫框架.\n查看演示 Demo\nCrawlab是基于Celery的分布式爬虫管理平台,可以集成任何语言和任何框架。\n项目自今年三月份上线以来受到爬虫爱好者们和开发者们的好评,不少使用者还表示会用Crawlab搭建公司的爬虫平台。经过近3个月的迭代,我们陆续上线了定时任务、数据分析、网站信息、可配置爬虫、自动提取字段、下载结果、上传爬虫等功能,将Crawlab打造得更加实用,更加全面,能够真正帮助用户解决爬虫管理困难的问题。\nCrawlab主要解决的是大量爬虫管理困难的问题,例如需要监控上百个网站的参杂scrapy和selenium的项目不容易做到同时管理,而且命令行管理的成本非常高,还容易出错。Crawlab支持任何语言和任何框架,配合任务调度、任务监控,很容易做到对成规模的爬虫项目进行有效监控管理。\n本使用手册会帮助您解决在安装使用Crawlab遇到的任何问题。\n首先,我们来看如何安装Crawlab吧,请查看安装。\n"},"Installation/":{"url":"Installation/","title":"安装Crawlab","keywords":"","body":"本小节将介绍三种安装Docker的方式:\n\nDocker\n直接部署\n预览模式\n\n"},"Installation/Docker.html":{"url":"Installation/Docker.html","title":"Docker","keywords":"","body":"Docker安装部署\n这应该是部署应用的最方便也是最节省时间的方式了。在最近的一次版本更新v0.2.3中,我们发布了Docker功能,让大家可以利用Docker来轻松部署Crawlab。下面将一步一步介绍如何使用Docker来部署Crawlab。\n对Docker不了解的开发者,可以参考一下这篇文章(9102 年了,学点 Docker 知识)做进一步了解。简单来说,Docker可以利用已存在的镜像帮助构建一些常用的服务和应用,例如Nginx、MongoDB、Redis等等。用Docker运行一个MongoDB服务仅需docker run -d --name mongo -p 27017:27017 mongo一行命令。如何安装Docker跟操作系统有关,这里就不展开讲了,需要的同学自行百度一下相关教程。\n下载镜像\n我们已经在DockerHub上构建了Crawlab的镜像,开发者只需要将其pull下来使用。在pull 镜像之前,我们需要配置一下镜像源。因为我们在墙内,使用原有的镜像源速度非常感人,因此将使用DockerHub在国内的加速器。创建/etc/docker/daemon.json文件,在其中输入如下内容。\n{\n \"registry-mirrors\": [\"https://registry.docker-cn.com\"]\n}\n\n这样的话,pull镜像的速度会比不改变镜像源的速度快很多。\n执行以下命令将Crawlab的镜像下载下来。镜像大小大概在几百兆,因此下载需要几分钟时间。\ndocker pull tikazyq/crawlab:latest\n\n更改配置文件\n拷贝一份后端配置文件./crawlab/config/config.py以及前端配置文件./frontend/.env.production到某一个地方。例如我的例子,分别为/home/yeqing/config.py和/home/yeqing/.env.production。\n更改后端配置文件config.py,将MongoDB、Redis的指向IP更改为自己数据的值。注意,容器中对应的宿主机的IP地址不是localhost,而是172.17.0.1(当然也可以用network来做,只是稍微麻烦一些)。更改前端配置文件.env.production,将API地址VUE_APP_BASE_URL更改为宿主机所在的IP地址,例如http://192.168.0.8:8000,这将是前端调用API会用到的URL。\n运行Docker容器\n更改好配置文件之后,接下来就是运行容器了。执行以下命令来启动容器。\ndocker run -d --rm --name crawlab \\\n -p 8080:8080 \\\n -p 8000:8000 \\\n -v /home/yeqing/.env.production:/opt/crawlab/frontend/.env.production \\\n -v /home/yeqing/config.py:/opt/crawlab/crawlab/config/config.py \\\n tikazyq/crawlab master\n\n其中,我们映射了8080端口(Nginx前端静态文件)以及8000端口(后端API)到宿主机。另外还将前端配置文件/home/yeqing/.env.production和后端配置文件/home/yeqing/config.py映射到了容器相应的目录下。传入参数master是代表该启动方式为主机启动模式,也就是所有服务(前端、Api、Flower、Worker)都会启动。另外一个模式是worker模式,只会启动必要的Api和Worker服务,这个对于分布式部署比较有用。等待大约20-30秒的时间来build前端静态文件,之后就可以打开Crawlab界面地址地址看到界面了。界面地址默认为http://localhost:8080。\n\nDocker-Compose\n当然,也可以用docker-compose的方式来部署。docker-compose是一个集群管理方式,可以利用名为docker-compose.yml的yaml文件来定义需要启动的容器,可以是单个,也可以(通常)是多个的。Crawlab的docker-compose.yml定义如下。\nversion: '3.3'\nservices:\n master: \n image: tikazyq/crawlab:latest\n container_name: crawlab\n volumns:\n - /home/yeqing/config.py:/opt/crawlab/crawlab/config/config.py # 后端配置文件\n - /home/yeqing/.env.production:/opt/crawlab/frontend/.env.production # 前端配置文件\n ports: \n - \"8080:8080\" # nginx\n - \"8000:8000\" # app\n depends_on:\n - mongo\n - redis\n entrypoint:\n - /bin/sh\n - /opt/crawlab/docker_init.sh\n - master\n mongo:\n image: mongo:latest\n restart: always\n ports:\n - \"27017:27017\"\n redis:\n image: redis:latest\n restart: always\n ports:\n - \"6379:6379\"\n\n这里先定义了master节点,也就是Crawlab的主节点。master依赖于mongo和redis容器,因此在启动之前会同时启动mongo和redis容器。这样就不需要单独配置mongo和redis服务了,大大节省了环境配置的时间。\n安装docker-compose也很简单,大家去网上百度一下就可以了。\n安装完docker-compose和定义好docker-compose.yml后,只需要运行以下命令就可以启动Crawlab。\ndocker-compose up\n\n同样,在浏览器中输入http://localhost:8080就可以看到界面。\n多节点模式\ndocker-compose的方式很适合多节点部署,在原有的master基础上增加几个worker节点,达到多节点部署的目的。将docker-compose.yml更改为如下内容。\nversion: '3.3'\nservices:\n master: \n image: tikazyq/crawlab:latest\n container_name: crawlab\n volumns:\n - /home/yeqing/config.master.py:/opt/crawlab/crawlab/config/config.py # 后端配置文件\n - /home/yeqing/.env.production.master:/opt/crawlab/frontend/.env.production # 前端配置文件\n ports: \n - \"8080:8080\" # nginx\n - \"8000:8000\" # app\n depends_on:\n - mongo\n - redis\n entrypoint:\n - /bin/sh\n - /opt/crawlab/docker_init.sh\n - master\n worker1: \n image: tikazyq/crawlab:latest\n volumns:\n - /home/yeqing/config.worker.py:/opt/crawlab/crawlab/config/config.py # 后端配置文件\n - /home/yeqing/.env.production.worker:/opt/crawlab/frontend/.env.production # 前端配置文件\n ports:\n - \"8001:8000\" # app\n depends_on:\n - mongo\n - redis\n entrypoint:\n - /bin/sh\n - /opt/crawlab/docker_init.sh\n - worker\n worker2: \n image: tikazyq/crawlab:latest\n volumns:\n - /home/yeqing/config.worker.py:/opt/crawlab/crawlab/config/config.py # 后端配置文件\n - /home/yeqing/.env.production.worker:/opt/crawlab/frontend/.env.production # 前端配置文件\n ports:\n - \"8002:8000\" # app\n depends_on:\n - mongo\n - redis\n entrypoint:\n - /bin/sh\n - /opt/crawlab/docker_init.sh\n - worker\n mongo:\n image: mongo:latest\n restart: always\n ports:\n - \"27017:27017\"\n redis:\n image: redis:latest\n restart: always\n ports:\n - \"6379:6379\"\n\n这里启动了多增加了两个worker节点,以worker模式启动。这样,多节点部署,也就是分布式部署就完成了。\n"},"Installation/Direct.html":{"url":"Installation/Direct.html","title":"直接部署","keywords":"","body":"直接部署\n直接部署是之前没有Docker时的部署方式,相对于Docker部署来说有些繁琐。但了解如何直接部署可以帮助更深入地理解Docker是如何构建Crawlab镜像的。这里简单介绍一下。\n拉取代码\n首先是将github上的代码拉取到本地。\ngit clone https://github.com/tikazyq/crawlab\n\n安装\n安装前端所需库。\nnpm install -g yarn pm2\ncd frontend\nyarn install\n\n安装后端所需库。\ncd ../crawlab\npip install -r requirements\n\n配置\n分别配置前端配置文件./frontend/.env.production和后端配置文件./crawlab/config/config.py。分别需要对部署后API地址以及数据库地址进行配置。\n构建\n这里的构建是指前端构建,需要执行以下命令。\ncd ../frontend\nnpm run build:prod\n\n构建完成后,会在./frontend目录下创建一个dist文件夹,里面是打包好后的静态文件。\nNginx\n安装nginx,在ubuntu 16.04是以下命令。\nsudo apt-get install nginx\n\n添加/etc/nginx/conf.d/crawlab.conf文件,输入以下内容。\nserver {\n listen 8080;\n server_name dev.crawlab.com;\n root /home/yeqing/jenkins_home/workspace/crawlab_develop/frontend/dist;\n index index.html;\n}\n其中,root是静态文件的根目录,这里是npm打包好后的静态文件。\n现在,只需要启动nginx服务就完成了启动前端服务。\nnginx reload\n\n启动服务\n这里是指启动后端服务。我们用pm2来管理进程。执行以下命令。\npm2 start app.py # API服务\npm2 start worker.py # Worker\npm2 start flower.py # Flower\n\n这样,pm2会启动3个守护进程来管理这3个服务。我们如果想看后端服务的日志的话,可以执行以下命令。\npm2 logs [app]\n\n然后在浏览器中输入http://localhost:8080就可以看到界面了。\n"},"Installation/Preview.html":{"url":"Installation/Preview.html","title":"预览模式","keywords":"","body":"预览模式\n预览模式是一种让用户比较快的上手的一种部署模式。跟直接部署类似,但不用经过构建、nginx和启动服务的步骤。在启动时只需要执行以下命令就可以了。相较于直接部署来说方便一些。\npython manage.py serve\n\n该模式同样会启动3个后端服务和1个前端服务。前端服务是通过npm run serve来进行的,因此是开发者模式。注意:强烈不建议在生产环境中用预览模式。预览模式只是让开发者快速体验Crawlab以及调试代码问题的一种方式,而不是用作生产环境部署的。\n"},"Usage/":{"url":"Usage/","title":"使用Crawlab","keywords":"","body":"本小节将介绍如何使用Crawlab,包括如下内容:\n\n节点\n爬虫\n任务\n定时任务\n\n"},"Usage/Node/":{"url":"Usage/Node/","title":"节点","keywords":"","body":"节点\n节点其实就是Celery中的Worker。一个节点运行时会连接到一个任务队列(例如Redis)来接收和运行任务。所有爬虫需要在运行时被部署到节点上,用户在部署前需要定义节点的IP地址和端口(默认为localhost:8000)。\n\n查看节点\n修改节点信息\n\n"},"Usage/Node/View.html":{"url":"Usage/Node/View.html","title":"查看节点列表","keywords":"","body":"查看节点列表\n点击侧边栏的节点导航至节点列表,可以看到已上线的节点。这里的节点其实就是已经运行起来的celery worker,他们通过连接到配置好的broker(通常是redis)来进行与主机的通信。\n\n"},"Usage/Node/Edit.html":{"url":"Usage/Node/Edit.html","title":"修改节点信息","keywords":"","body":"修改节点信息\n后面我们需要让爬虫运行在各个节点上,需要让主机与节点进行通信,因此需要知道节点的IP地址和端口。我们需要手动配置一下节点的IP和端口。在节点列表中点击操作列里的蓝色查看按钮进入到节点详情。节点详情样子如下。\n\n在右侧分别输入该节点对应的节点IP和节点端口,然后点击保存按钮,保存该节点信息。\n这样,我们就完成了节点的配置工作。\n"},"Usage/Spider/":{"url":"Usage/Spider/","title":"爬虫","keywords":"","body":"爬虫\n爬虫就是我们通常说的网络爬虫了,本小节将介绍如下内容:\n\n创建爬虫\n部署爬虫\n运行爬虫\n可配置爬虫\n统计数据\n\n"},"Usage/Spider/Create.html":{"url":"Usage/Spider/Create.html","title":"创建爬虫","keywords":"","body":"创建爬虫\nCrawlab允许用户创建两种爬虫:\n\n自定义爬虫\n可配置爬虫\n\n前者可以通过Web界面和创建项目目录的方式来添加,后者由于没有源代码,只能通过Web界面来添加。\n"},"Usage/Spider/CustomizedSpider.html":{"url":"Usage/Spider/CustomizedSpider.html","title":"自定义爬虫","keywords":"","body":"自定义爬虫\n自定义爬虫是指用户可以添加的任何语言任何框架的爬虫,高度自定义化。当用户添加好自定义爬虫之后,Crawlab就可以将其集成到爬虫管理的系统中来。\n自定义爬虫的添加有两种方式:\n\n通过Web界面上传爬虫\n通过创建项目目录\n\n通过Web界面上传\n在通过Web界面上传之前,需要将爬虫项目文件打包成zip格式。\n\n然后,在侧边栏点击爬虫导航至爬虫列表,点击添加爬虫按钮,选择自定义爬虫,点击上传按钮,选择刚刚打包好的zip文件。上传成功后,爬虫列表中会出现新添加的自定义爬虫。这样就算添加好了。\n这个方式稍微有些繁琐,但是对于无法轻松获取服务器的读写权限时是非常有用的,适合在生产环境上使用。\n通过添加项目目录\nCrawlab会自动发现PROJECT_SOURCE_FILE_FOLDER目录下的所有爬虫目录,并将这些目录生成自定义爬虫并集成到Crawlab中。因此,将爬虫项目目录拷贝到PROJECT_SOURCE_FILE_FOLDER目录下,就可以添加一个爬虫了。\n这种方式非常方便,但是需要获得主机服务器的读写权限,因而比较适合在开发环境上采用。\n配置爬虫\n在定义爬虫中,我们需要配置一下执行命令(运行爬虫时后台执行的shell命令)和结果集(通过CRAWLAB_COLLECTION传递给爬虫程序,爬虫程序存储结果的地方),然后点击保存按钮保存爬虫信息。\n\n接下来,我们就可以部署、运行自定义爬虫了。\n"},"Usage/Spider/ConfigurableSpider.html":{"url":"Usage/Spider/ConfigurableSpider.html","title":"可配置爬虫","keywords":"","body":"可配置爬虫\n可配置爬虫是版本v0.2.1开发的功能。目的是将具有相似网站结构的爬虫项目可配置化,将开发爬虫的过程流程化,大大提高爬虫开发效率。\nCrawlab的可配置爬虫是基于Scrapy的,因此天生支持并发。而且,可配置爬虫完全支持自定义爬虫的一般功能,因此也支持任务调度、任务监控、日志监控、数据分析。\n添加爬虫\n在侧边栏点击爬虫导航至爬虫列表,点击添加爬虫按钮。\n\n点击可配置爬虫。\n\n输入完基本信息,点击添加。\n\n配置爬虫\n添加完成后,可以看到刚刚添加的可配置爬虫出现了在最下方,点击查看进入到爬虫详情。\n\n点击配置标签进入到配置页面。接下来,我们需要对爬虫规则进行配置。\n\n这里已经有一些配置好的初始输入项。我们简单介绍一下各自的含义。\n抓取类别\n这也是爬虫抓取采用的策略,也就是爬虫遍历网页是如何进行的。作为第一个版本,我们有仅列表、仅详情页、列表+详情页。\n\n仅列表页。这也是最简单的形式,爬虫遍历列表上的列表项,将数据抓取下来。\n仅详情页。爬虫只抓取详情页。\n列表+详情页。爬虫先遍历列表页,将列表项中的详情页地址提取出来并跟进抓取详情页。\n\n这里我们选择列表+详情页。\n列表项选择器 & 分页选择器\n列表项的匹和分页按钮的匹配查询,由CSS或XPath来进行匹配。\n开始URL\n爬虫最开始遍历的网址。\n遵守Robots协议\n这个默认是开启的。如果开启,爬虫将先抓取网站的robots.txt并判断页面是否可抓;否则,不会对此进行验证。用户可以选择将其关闭。请注意,任何无视Robots协议的行为都有法律风险。\n列表页字段 & 详情页字段\n这些都是再列表页或详情页中需要提取的字段。字段由CSS选择器或者XPath来匹配提取。可以选择文本或者属性。\n在检查完目标网页的元素CSS选择器之后,我们输入列表项选择器、开始URL、列表页/详情页等信息。注意勾选url为详情页URL。\n\n点击保存、预览,查看预览内容。\n\n"},"Usage/Spider/Deploy.html":{"url":"Usage/Spider/Deploy.html","title":"部署爬虫","keywords":"","body":"部署爬虫\n这里的爬虫部署是指自定义爬虫的部署,因为可配置爬虫已经内嵌到Crawlab中了,所有节点都可以使用,不需要额外部署。简单来说,就是将主机上的爬虫源代码通过HTTP的方式打包传输至worker节点上,因此节点就可以运行传输过来的爬虫了。\n部署爬虫很简单,有三种方式:\n\n在爬虫列表中点击部署所有爬虫,将所有爬虫部署到所有在线节点中;\n在爬虫列表中点击操作列的部署按钮,将指定爬虫部署到所有在线节点中;\n在爬虫详情的概览标签中,点击部署按钮,将指定爬虫部署到所有在线节点中。\n\n部署好之后,我们就可以运行爬虫了。\n"},"Usage/Spider/Run.html":{"url":"Usage/Spider/Run.html","title":"运行爬虫","keywords":"","body":"运行爬虫\n我们有两种运行爬虫的方式:\n\n手动触发\n定时任务触发\n\n手动触发\n\n在爬虫列表中操作列点击运行按钮,或者\n在爬虫详情中概览标签下点击运行按钮,或者\n对于自定义爬虫,可以在配置标签下点击运行按钮\n\n然后,Crawlab会提示任务已经派发到队列中去了,然后你可以在爬虫详情左侧看到新创建的任务。点击创建时间可以导航至任务详情。\n定时任务触发\n定时任务触发是比较常用的功能,对于增量抓取或对实时性有要求的任务很重要。这在定时任务中会详细介绍。\n"},"Usage/Spider/Analytics.html":{"url":"Usage/Spider/Analytics.html","title":"统计数据","keywords":"","body":"统计数据\n在运行了一段时间之后,爬虫会积累一些统计数据,例如运行成功率、任务数、运行时长等指标。Crawlab将这些指标汇总并呈现给开发者。\n要查看统计数据的话,只需要在爬虫详情中,点击分析标签,就可以看到爬虫的统计数据了。\n\n"},"Usage/Task/":{"url":"Usage/Task/","title":"任务","keywords":"","body":""},"Usage/Schedule/":{"url":"Usage/Schedule/","title":"定时任务","keywords":"","body":""},"Usage/Site/":{"url":"Usage/Site/","title":"网站","keywords":"","body":""},"Architecture/":{"url":"Architecture/","title":"架构","keywords":"","body":"架构\n"},"Architecture/Celery.html":{"url":"Architecture/Celery.html","title":"Celery","keywords":"","body":"Celery\n"},"Architecture/App.html":{"url":"Architecture/App.html","title":"App","keywords":"","body":"App\n"},"Examples/":{"url":"Examples/","title":"样例","keywords":"","body":"Examples\n"}}} \ No newline at end of file