# 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