# nlp-spider-dynamic
**Repository Path**: gitclebeg/nlp-spider-dynamic
## Basic Information
- **Project Name**: nlp-spider-dynamic
- **Description**: nlp项目基础框架:爬虫,针对动态网页(JS)的专有爬虫
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 50
- **Forks**: 19
- **Created**: 2015-04-13
- **Last Updated**: 2025-05-20
## Categories & Tags
**Categories**: spider
**Tags**: None
## README
# nlp-spider-dynamic
### 专门为自然语言处理系统组件爬取数据的组件,动态信息爬取的网络爬虫
这个爬虫的特点是主要针对动态网页信息爬取的垂直爬虫。设计思路与八爪鱼采集器类似。
### 注意此爬虫纯属个人开发兴趣而开发,有任何问题欢迎各位提交bug。邮箱地址:276708284@qq.com
目前正在完善,有些功能可能有bug,敬请期待...
## 1、说明
动态网站的抓取和静态网站抓取最大的不同就是要解析JS。
* 1) 一种方式是跟踪JS的真实请求(难度大)
* 2) 一种方式是直接模拟浏览器解析JS
本程序采用第二种方式,利用Selenium浏览器测试框架,实现了一个可以解析页面JS的 web 网络爬虫,从而可以抓取动态网页信息。
## 2、新手教程
1. driver 目录(存放的是selenium需要运行的driver)
不同的平台,请参考这个教程,自行编译
里面目前只是提供windows GhostDriver
已经集成在 Phantomjs.exe
2. 简单爬取例子
在tasks\test_ghost下面的配置文件分别举例说明如何配置爬虫抓取各种网页,下面是每个文件的说明:
```
jd_1product.xml 演示如何抓取一个简单商品页上的信息(商品名,动态评论数)
jd_products_comments.xml 演示如何抓取一个商品的评论(内容循环提取)
jd_shop_allproducts.cml 将演示如何循环抓取一个店铺的所有商品(翻页循环抓取)
```
其它任务类似,数据保存的名字,以及方式都是在配置文件中定义的。
配置好一只爬虫之后,启动程序爬虫就会自动生成需要保存的数据文件。
3. 爬虫执行
执行 org.wisdomdata.main.MainCrawler
将配置文件所在地址添加到 tasksFiles
即可启动程序,目前只能支持一只爬虫,将来可能会支持分布式爬虫。
## 3、架构设计
采用Selenium,一个最大的限制是多线程的并发控制。
最好的方式是采用WebDriver单例模式。采用Spring框架可以容易实现。
垂直网络爬虫不仅仅只是下载页面,下载页面只是它的一个组件。
* 1) 页面处理
```
还需要针对性的页面进行处理,比如:
在页面上点击一个按钮(本质是执行一段JS);
在页面上跳转直接(比如:加载一个新的页面)
碰到特殊情况处理(比如:弹出验证码输入框,提取不到页面内容等等)
页面内容提取(包括链接,以及主题指标数据)
```
* 2) 链接处理
```
如何保存批量提取的链接?
垂直爬虫得到的链接比较少量。
```
* 3) 爬取策略
```
如何增量爬取数据?
如何解决爬虫被封的问题?
```
这些过程抽象出来,非常符合编程语言里面的三大程序流程结构:
#### 1、顺序 2、循环 3、条件
由这三个组合起来就可以完成任何复杂的程序流程。
一个垂直网站的爬取,也可以用上面的三个过程组合起来进行描述:
比如在爬取一个网站的时候:
```
do for 循环列表页(循环方式 点击下一页,结束条件(指定最大次数等))
do for 每一个内容页面(循环方式 依次抓取,结束条件)
提取信息(异步提取,同步提取)
done
点击下一页
done
```
比如更加复杂一点的网站:
```
do
填写表单,点击提交,指定页面跳转
done
do then
do 循环列表页(循环方式 点击下一页,结束条件(指定最大次数等))
提取信息
done
do then
点击某个按钮
do
do for 循环内容
提取信息(
if (未提取到信息,或者提取到信息有什么问题)
dosome
endif
done
done
点击按钮
done
done
```
基于这样的逻辑,开发了这个系统。
## 4、如何结合设计一只爬虫
#### 爬虫设计抽象出来就是程序设计语言都有的三个处理结构。
* 1) 业务逻辑处理器(包含多个内容抽取器)
```
判断(需要判断条件,符合就执行,不符合就执行另外的)
循环(需要开始条件,循环间隔,循环结束条件)
顺序(就是一系列执行下去)
```
* 2) 内容抽取器(底层由一系列原子抽取动作组成,这些原始抽象动作都是需要先满足一定条件的)
```
判断(需要判断条件,符合就执行,不符合就执行另外的)
循环(需要开始条件,循环间隔,循环结束条件)
顺序(就是一系列执行下去)
```
* 3) 状态转移动作 *
#### 每一个状态转移动作之后都会产生一个新的页面,而且跳转之前都需要判断
#### 比如:(事务支持,要么原子动作全部执行,要么全部失败)
```
点击下一页(是否存在点击下一页这个按钮,没有怎么办?)
点击某个按钮加载一段新页面(是否存在需要这个按钮,没有怎么办?)
跳转到一个新的页面(新页面链接是否是有效链接?)
```
(上面的每一个动作里面包含原子动作,执行某个点击按钮的动作)
* 4) 抽取信息去重保存组件
上面每一个处理过程都是嵌套的,也就是说可能循环里面有判断,判断里面有循环等等
####而且相对于爬虫来说:
####上面的每一个处理过程,都必须打开一个页面作为基准。
```
业务逻辑处理器里面包含转移动作组合
转移动作组里面包含系列内容抽取器
内容抽取器里面可能包含业务逻辑组
```
### 4.1 举例说明:
```
1) 单独爬取一个网站,需要的组件
顺序执行处理器1(
跳转到一个新页面的转移动作(
顺序抽取器(多个单元抽取器,去重保存组件)
)
)
2) 登录页面抓取
顺序执行处理器2(
登录动作组(无抽取动作)
顺序执行处理器1
)
3) 循环页面抓取
循环执行处理器2(
循环初始化条件
循环执行动作(抽取器)
循环结束条件
)
4) 页面点击抓取
顺序执行处理器3(
跳转到一个新页面的转移动作(
顺序抽取器(多个单元抽取器,去重保存组件)
)
点击页面按钮动作组(
顺序抽取器(多个单元抽取器,去重保存组件)?
)
)
```
这上面四种情况组合起来还能组合成更加复杂的情况。
抽象处理就是:
1. 处理器里面有动作组
2. 每个动作里面有抽取器组
3. 每个抽取器里面有保存组件以及原子抽取器
## 5、项目相关信息
### 一只可以抓取动态信息的爬虫高定制爬虫
* 项目主页地址: http://git.oschina.net/webcollector/WebCollector
### 一只神奇的爬虫
* 项目主页地址: https://github.com/code4craft/webmagic http://webmagic.io/docs/zh/
* 框架设计说明: http://my.oschina.net/flashsword/blog/145796