Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说小爬虫Java自动生成工具AiPa,往往牛逼的程序员都是被逼出来的!,希望能够帮助你!!!。
1.简介
AiPa 是一款小巧,灵活,扩展性高的多线程爬虫框架。
AiPa 依赖当下最简单的HTML解析器Jsoup。
AiPa 只需要使用者提供网址集合,即可在多线程下自动爬取,并对一些异常进行处理。
小编整理了一份java学习资料,私信回复【01】,获取源码。
2.Maven
直接引入
3.使用
先来看下一个简单完整的示例程序:
必须实现的接口
Main方法
通过AiPa.newInstance()方法直接创建一个新的AiPa实例,该方法必须要传入 AiPaWorker 接口的实现类。
3.1 自定义爬虫方法
在上面的演示程序中,我们使用了submit()方法进行提交任务,默认是使用了Jsoup+上面的那些非加粗属性进行爬取,一般情况下够用,如果要一个一个的扩展Jsoup的方法太累了,于是我想到把爬虫方法提供给用户重,让用户自己去扩展,想用什么爬,想设置什么属性都可以。
下面请看使用Demo:
然后,再调用submit方法提交任务,代码示例:
注意:当你重写爬虫方法后,3.2小节的非加粗属性都会失效。
3.2 读取返回值与获取线程池
如果你想要读取返回值来看下任务是否执行成功,你可以使用看下上面的程示例序是如何做的。
getFutureList()方法会返回任务执行之后的结果集合,集合中的成员都是Future类。调用Future对象的 get() 方法会等待当前任务执行完成再返回结果值,也就是会阻塞当前线程。该类还有很多方法,比如get(long timeout, TimeUnit unit),设置等待时间等等。
该方法会返回AiPa当前使用的Executor线程池,你获取到该线程池后,需要一些使用线程池的一些方法可以自行使用。
3.3 如何应对爬取网页时的异常
对于网页爬取时的异常,这真的是个痛点。原因真的很多,你的网络不行,网站服务器的网络不行,在网上有说把请求头中Connection设置为close,不用keep-alive。这个以我爬取几百兆数据的经验告诉你,然并卵。
于是我想出了一种无赖打法,反复爬。爬一次不行就两次,爬两次不行就三次,只要网页是可以正常响应的,基本这个策略没多少问题。当然,万一真的是某个网页就那么独树一帜呢,所以我们设置一个最大值,对于爬取超过最大值的,放弃记录下来,看看啥子情况。在我的这个框架中,也给出了fail()方法专门处理这个问题。
3.4 AiPaWorker接口
AiPaWorker 接口是用户必须要实现的业务类。
该接口方法如下:
run()方法是用户自定义处理爬取的HTML内容,一般是利用Jsoup的Document类进行解析,获取节点或属性等,然后保存到数据库或本地文件中。如果在业务方法需要再次请求URL,可以使用工具类Util。
fail()方法是当run()方法出现异常或爬取网页时异常,多次处理无效的情况下进入的方法,该方法的参数为此次出错的网址。一般是对其进行日志记录等操作。
3.5 解码,最多失败次数,请求头
通过AiPa获取实例后,可以直接在后面跟着设置一大堆属性,比如:setCharset、setThreads、setMaxFailCount等,这些属性啥意思,下面以表格的形式说明一下:
方法说明setThreads工作线程数,默认CPU数量+1,你也可以设置CPU*2等等setMaxFailCount最大失败次数,也就是爬网站出现异常,再次爬一共尝试多少次,默认5setCharset网页的编码,碰到乱码设置这个,默认UTF-8setHeader设置请求头,只接受Map<String,String>类型,默认nullsetMethod设置请求方法,默认Method.GETsetTimeout请求解析的等待时间,默认30秒。setUserAgent设置请求的UA,默认电脑版。setCookies设置Cookie集合,默认null
上面的一般情况下够用了,如果对这些不满意,嫌太少啥的,下面给了更优秀的解决方案。
4.测试用例
在Java SE测试中。没有使用数据库等,直接控制台打印是没问题的。
在Spring Boot中写了个测试用例,爬取数据保存到数据库,运行也没问题。
声明:本文内容来源于网络,如有侵权请联系删除
今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。