25 Star 47 Fork 18

gitclebeg / nlp-spider-dynamic

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
README.md 6.92 KB
一键复制 编辑 原始数据 按行查看 历史
gitclebeg 提交于 2019-06-12 10:27 . 更新 README.md

nlp-spider-dynamic

专门为自然语言处理系统组件爬取数据的组件,动态信息爬取的网络爬虫

这个爬虫的特点是主要针对动态网页信息爬取的垂直爬虫。设计思路与八爪鱼采集器类似。

注意此爬虫纯属个人开发兴趣而开发,有任何问题欢迎各位提交bug。邮箱地址:276708284@qq.com

目前正在完善,有些功能可能有bug,敬请期待...

1、说明

动态网站的抓取和静态网站抓取最大的不同就是要解析JS。

    1. 一种方式是跟踪JS的真实请求(难度大)
    1. 一种方式是直接模拟浏览器解析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		将演示如何循环抓取一个店铺的所有商品(翻页循环抓取)

其它任务类似,数据保存的名字,以及方式都是在配置文件中定义的。 配置好一只爬虫之后,启动程序爬虫就会自动生成需要保存的数据文件。

  1. 爬虫执行 执行 org.wisdomdata.main.MainCrawler 将配置文件所在地址添加到 tasksFiles 即可启动程序,目前只能支持一只爬虫,将来可能会支持分布式爬虫。

3、架构设计

采用Selenium,一个最大的限制是多线程的并发控制。 最好的方式是采用WebDriver单例模式。采用Spring框架可以容易实现。

垂直网络爬虫不仅仅只是下载页面,下载页面只是它的一个组件。

    1. 页面处理
还需要针对性的页面进行处理,比如:
在页面上点击一个按钮(本质是执行一段JS);
在页面上跳转直接(比如:加载一个新的页面)
碰到特殊情况处理(比如:弹出验证码输入框,提取不到页面内容等等)
页面内容提取(包括链接,以及主题指标数据)
    1. 链接处理
如何保存批量提取的链接?
垂直爬虫得到的链接比较少量。
    1. 爬取策略
如何增量爬取数据?
如何解决爬虫被封的问题?

这些过程抽象出来,非常符合编程语言里面的三大程序流程结构:

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、项目相关信息

一只可以抓取动态信息的爬虫高定制爬虫

一只神奇的爬虫

Java
1
https://gitee.com/gitclebeg/nlp-spider-dynamic.git
git@gitee.com:gitclebeg/nlp-spider-dynamic.git
gitclebeg
nlp-spider-dynamic
nlp-spider-dynamic
master

搜索帮助