准备写个爬虫, 可以怎么搞?
先定义一个最简单的使用场景,给你一个url,把这个url中指定的内容爬下来,然后停止
1. 基本数据结构
一个配置项,包含塞入的 url 和 获取规则
抓取的结果,除了根据匹配的规则获取的结果之外,把整个html的数据也保存下来,这样实际使用者就可以更灵活的重新定义获取规则
说明:这里采用jsoup来解析html
2. 爬取任务
爬取网页的具体逻辑就放在这里了 一个爬取的任务 ,爬虫嘛,正常来讲都会塞到一个线程中去执行,虽然我们是第一篇,也不至于low到直接放到主线程去做 面向接口编程,所以我们定义了一个 的接口
这里定义了两个方法,在job执行之前和之后的回调,加上主要某些逻辑可以放在这里来做(如打日志,耗时统计等),将辅助的代码从爬取的代码中抽取,使代码结构更整洁
因为 多了两个方法,所以就衍生了这个抽象类,不然每个具体的实现都得去实现这两个方法,有点蛋疼
然后就是借用了一丝模板设计模式的思路,把run方法也实现了,单独拎了一个方法给子类来实现,具体的抓取网页的逻辑
一个最简单的实现类,直接利用了JDK的URL方法来抓去网页,然后利用jsoup进行html结构解析,这个实现中有较多的硬编码,先看着,下面就着手第一步优化
上面一个最简单的爬虫就完成了,就需要拉出来看看,是否可以正常的工作了
就拿自己的博客作为测试网址,目标是获取 title + content,所以测试代码如下
代码演示示意图如下
从返回的结果可以看出,抓取到的title中包含了博客标题 + 作着,主要的解析是使用的 jsoup,所以这些抓去的规则可以参考jsoup的使用方式
仅针对这个最简单的爬虫,我们开始着手上面的两个优化点
1. 改用 HttpClient 来执行网络请求
使用httpClient,重新改上面的获取网页代码(暂不考虑配置项的情况), 对比之后发现代码会简洁很多
这里加了一个对返回的code进行判断,兼容了一把访问不到数据的情况,对应的返回结果中,新加了一个表示状态的对象
然后再进行测试,结果发现返回状态为 403, 主要是没有设置一些必要的请求参数,被拦截了,手动塞几个参数再试则ok
2. http配置项
显然每次都这么手动塞入参数是不可选的,我们有必要透出一个接口,由用户自己来指定一些请求和返回参数
首先我们可以确认下都有些什么样的配置项
新增一个配置文件,配置参数主要为
新建一个 工具类,来具体的执行Http请求, 下面我们暂先实现Get/Post两个请求方式,后续可以再这里进行扩展和优化
然后我们的 doFetchPage 方法将简洁很多
上面我们实现的是一个最简陋,最基础的东西了,但是这个基本上又算是满足了核心的功能点,但距离一个真正的爬虫框架还差那些呢 ?
另一个核心的就是:
爬了一个网址之后,解析这个网址中的链接,继续爬!!!
下一篇则将在本此的基础上,考虑如何实现上面这个功能点;写这个博客的思路,将是先做一个实现需求场景的东西出来,,可能在开始实现时,很多东西都比较挫,兼容性扩展性易用性啥的都不怎么样,计划是在完成基本的需求点之后,然后再着手去优化看不顺眼的地方
坚持,希望可以持之以恒,完善这个东西
项目地址:
上面的分了两步,均可以在对应的tag中找到响应的代码,主要代码都在core模块下
第一步对应的tag为:
优化后对应的tag为:
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/java-jiao-cheng/4523.html