当前位置:网站首页 > Java教程 > 正文

java 简单爬虫教程



准备写个爬虫, 可以怎么搞?

先定义一个最简单的使用场景,给你一个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为:

  • 上一篇: cmd编程教程java
  • 下一篇: java 线程教程
  • 版权声明


    相关文章:

  • cmd编程教程java2025-03-30 08:58:02
  • java编码教程2025-03-30 08:58:02
  • java web servlet教程2025-03-30 08:58:02
  • java虚拟机回收教程2025-03-30 08:58:02
  • java中编译教程2025-03-30 08:58:02
  • java 线程教程2025-03-30 08:58:02
  • java 343集教程2025-03-30 08:58:02
  • java485教程视频2025-03-30 08:58:02
  • java web程序设计教程 pdf2025-03-30 08:58:02
  • java 基本教程视频2025-03-30 08:58:02