百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Java 多线程爬虫框架 AiPa(java多线程开源框架)

ccwgpt 2024-10-13 01:33 43 浏览 0 评论

一款小巧、灵活的Java多线程爬虫框架(AiPa)爱爬

1.简介

AiPa 是一款小巧,灵活,扩展性高的多线程爬虫框架。

AiPa 依赖当下最简单的HTML解析器Jsoup。

AiPa 只需要使用者提供网址集合,即可在多线程下自动爬取,并对一些异常进行处理。

2.Maven

直接引入

<dependency>
 <groupId>cn.yueshutong</groupId>
 <artifactId>AiPa</artifactId>
 <version>1.0.0.RELEASE</version>
</dependency>

3.使用

先来看下一个简单完整的示例程序:

必须实现的接口

public class MyAiPaWorker implements AiPaWorker {
 @Override
 public String run(Document doc, AiPaUtil util) {
 //使用JSOUP进行HTML解析获取想要的div节点和属性
 //保存在数据库或本地文件中
 //新增aiPaUtil工具类可以再次请求网址
 return doc.title() + doc.body().text();
 }
 @Override
 public Boolean fail(String link) {
 //任务执行失败
 //可以记录失败网址
 //记录日志
 return false;
 }
}

Main方法

 public static void main(String[] args) throws InstantiationException, IllegalAccessException, ExecutionException, InterruptedException {
 //准备网址集合
 List<String> linkList = new ArrayList<>();
 linkList.add("http://jb39.com/jibing/FeiQiZhong265988.htm");
 linkList.add("http://jb39.com/jibing/XiaoErGuoDu262953.htm");
 linkList.add("http://jb39.com/jibing/XinShengErShiFei250995.htm");
 linkList.add("http://jb39.com/jibing/GaoYuanFeiShuiZhong260310.htm");
 linkList.add("http://jb39.com/zhengzhuang/LuoYin337449.htm");
 //第一步:新建AiPa实例
 AiPaExecutor aiPaExecutor = AiPa.newInstance(new MyAiPaWorker()).setCharset(Charset.forName("GBK"));
 //第二步:提交任务
 for (int i = 0; i < 10; i++) {
 aiPaExecutor.submit(linkList);
 }
 //第三步:读取返回值
 List<Future> futureList = aiPaExecutor.getFutureList();
 for (int i = 0; i < futureList.size(); i++) {
 //get() 方法会阻塞当前线程直到获取返回值
 System.out.println(futureList.get(i).get());
 }
 //第四步:关闭线程池
 aiPaExecutor.shutdown();
 }

通过AiPa.newInstance()方法直接创建一个新的AiPa实例,该方法必须要传入 AiPaWorker 接口的实现类。

3.1 AiPaWorker接口

AiPaWorker 接口是用户必须要实现的业务类。

该接口方法如下:

public interface AiPaWorker<T,S> {
 /**
 * 如何解析爬下来的HTML文档?
 * @param doc JSOUP提供的文档
 * @param util 爬虫工具类
 * @return
 */
 T run(Document doc, AiPaUtil util);
 /**
 * run方法异常则执行fail方法
 * @param link 网址
 * @return
 */
 S fail(String link);
}

run()方法是用户自定义处理爬取的HTML内容,一般是利用Jsoup的Document类进行解析,获取节点或属性等,然后保存到数据库或本地文件中。如果在业务方法需要再次请求URL,可以使用工具类Util。

fail()方法是当run()方法出现异常或爬取网页时异常,多次处理无效的情况下进入的方法,该方法的参数为此次出错的网址。一般是对其进行日志记录等操作。

3.2 解码,最多失败次数,请求头

通过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

上面的一般情况下够用了,如果对这些不满意,嫌太少啥的,下面给了更优秀的解决方案。

3.3 自定义爬虫方法

在上面的演示程序中,我们使用了submit()方法进行提交任务,默认是使用了Jsoup+上面的那些非加粗属性进行爬取,一般情况下够用,如果要一个一个的扩展Jsoup的方法太累了,于是我想到把爬虫方法提供给用户重,让用户自己去扩展,想用什么爬,想设置什么属性都可以。

下面请看使用Demo:

public class MyAiPaUtil extends AiPaUtil {
 @Override
 public Document getHtmlDocument(String link) throws IOException {
 // 你可以不用JSOUP,可以使用其它方法进行HTTP请求,但最后需要转为Document格式
 // 你也可以使用Jsoup实现定制属性
 Connection connection = Jsoup.connect(link).method(Connection.Method.GET);
 String body = connection.execute().charset("GBK").body();
 
 return Jsoup.parse(body);
 }
}

然后,再调用submit方法提交任务,代码示例:

aiPaExecutor.submit(linkList, MyAiPaUtil.class);

注意:当你重写爬虫方法后,3.2小节的非加粗属性都会失效。

3.3 读取返回值与获取线程池

如果你想要读取返回值来看下任务是否执行成功,你可以使用看下上面的程示例序是如何做的。

public List<Future> getFutureList()

getFutureList()方法会返回任务执行之后的结果集合,集合中的成员都是Future类。调用Future对象的 get() 方法会等待当前任务执行完成再返回结果值,也就是会阻塞当前线程。该类还有很多方法,比如get(long timeout, TimeUnit unit),设置等待时间等等。

public ExecutorService getExecutor()

该方法会返回AiPa当前使用的Executor线程池,你获取到该线程池后,需要一些使用线程池的一些方法可以自行使用。

3.4 如何应对爬取网页时的异常

对于网页爬取时的异常,这真的是个痛点。原因真的很多,你的网络不行,网站服务器的网络不行,在网上有说把请求头中Connection设置为close,不用keep-alive。这个以我爬取几百兆数据的经验告诉你,然并卵。

于是我想出了一种无赖打法,反复爬。爬一次不行就两次,爬两次不行就三次,只要网页是可以正常响应的,基本这个策略没多少问题。当然,万一真的是某个网页就那么独树一帜呢,所以我们设置一个最大值,对于爬取超过最大值的,放弃记录下来,看看啥子情况。在我的这个框架中,也给出了fail()方法专门处理这个问题。

4.测试用例

在Java SE测试中。没有使用数据库等,直接控制台打印是没问题的。

在Spring Boot中写了个测试用例,爬取数据保存到数据库,运行也没问题。

@RunWith(SpringRunner.class)
@SpringBootTest
public class InterApplicationTests {
 @Autowired
 private DemoResponse demoResponse;
 @Test
 public void context() throws ExecutionException, InterruptedException {
 AiPaExecutor executor = AiPa.newInstance(new AiPaWorker() {
 @Override
 public Boolean run(Document document, AiPaUtil util) {
 String title = document.title();
 demoResponse.save(new DemoEntity(title));
 return true;
 }
 @Override
 public Boolean fail(String s) {
 demoResponse.save(new DemoEntity(s));
 return false;
 }
 }).setCharset(Charset.forName("GBK"));
 List<String> linkList = new ArrayList<>();
 linkList.add("http://jb39.com/jibing/FeiQiZhong265988.htm");
 linkList.add("http://jb39.com/jibing/XiaoErGuoDu262953.htm");
 linkList.add("http://jb39.com/jibing/XinShengErShiFei250995.htm");
 linkList.add("http://jb39.com/jibing/GaoYuanFeiShuiZhong260310.htm");
 linkList.add("http://jb39.com/zhengzhuang/LuoYin337449.htm");
 executor.submit(linkList);
 List<Future> list = executor.getFutureList();
 for (int i = 0; i < list.size(); i++) {
 //get() 方法会阻塞当前线程直到获取返回值
 System.out.println(list.get(i).get());
 }
 executor.shutdown();
 }
}

运行结果:

Hibernate: insert into demo (title) values (?)
Hibernate: insert into demo (title) values (?)
Hibernate: insert into demo (title) values (?)
Hibernate: insert into demo (title) values (?)
Hibernate: insert into demo (title) values (?)

相关推荐

PPT 139 | 粉色渐变小清新春暖花开PPT模板

春暖花开,这是你制作PPT的世界粉色渐变小清新春暖花开PPT模板,共22P适用场合:工作总结/个人汇报/演讲培训等喜欢的可以赞一个更多类似PPT模板,搜【小清新】也可以,在线编辑,一键下载...

框架完整岗位竞聘报告PPT模板

需要源文件de可私!氢元素为您提供PPT模板、PNG元素免费、办公模板。工作述职汇报、计划总结、培训课件、节日庆典、营销策划、商业计划、宣传企业、产品发布、个人简历、毕业答辩、岗位竞聘、护理培训,...

PPT与视频相关的几个操作要点

都知道PPT中可以插入视频,而2010及以上版本插入后还可以对视频做各种处理,另外别忘了还可以直接将PPT导出成视频格式。插入视频方式往PPT中插入视频,除了【插入】|【视频】|【PC上的视频】这种方...

书写主题品管圈汇报PPT模板,主题框架,简约设计,品管圈必备

Hello大家好,我是帮帮。今天跟大家分享一张书写主题品管圈汇报PPT模板,主题框架,简约设计,品管圈必备。有个好消息!为了方便大家更快的掌握技巧,寻找捷径。请大家点击文章末尾的“了解更多”,在里面找...

【教学成果框架图】国家级获奖案例解析与可视化方案(实战版)

教学成果逻辑框架图的绘制精髓总结为“逻辑为骨,视觉为翼”。下面结合具体案例,手把手教你制作既专业又美观的成果框架图。一、设计理念:教育逻辑与视觉传达的融合教学成果框架图需体现三重逻辑:教育目标层(立德...

工作总结PPT模板完整框架 (30)

年中汇报PPT的超强框架来袭,职场人士的必备神器!

这套框架堪称完美,适用于各类工作汇报场景。它逻辑清晰,内容丰富,涵盖个人介绍、工作回顾、业绩成果、问题分析以及未来工作计划等常见汇报模块。PPT已包含600多页,所有元素均可自由编辑,数据图表也能轻松...

三个说话框架,提升逻辑思维,让你清晰表达

#暑期创作大赛#建立清晰的逻辑思维:三个说话框架的力量我们生活在一个充满语言交流的世界中。无论是在学校,工作场所,还是在社交场合,我们都需要有效地表达我们的观点和想法。然而,许多人都有表达上的困扰,他...

《石头记》人物原型故事之逻辑框架(一)

话说空空道人将《石头记》带往人世,又经东鲁孔梅溪醒题《风月宝鉴》,曹雪芹定名《金陵十二钗》,加之警幻仙子提醒防备新谱《红楼梦十二支曲》。蛮以为他人在闲适风月故事之于能够了然背后真实故事,怎耐一万年老怪...

如何搭建高效沟通与精彩演讲的逻辑结构

对于大多数人而言,说话有逻辑这件事难于登天。很多人在演讲、工作汇报中都会遇到诸如“我不知道你在说什么”、“你的重点是什么”、“你说话毫无逻辑”此类的评价,被认为是说话缺乏逻辑的人。那么如何成为一个说话...

「书讯」论证逻辑框架下说理写作模式研究

《论证逻辑框架下说理写作模式研究》作者:金建龙出版日期:2018年11月开本:16开出版社:经济管理出版社小编推荐提升大学生批判意识和理性说理能力是新时代背景下高等教育中通识教育和博雅教育的全新探索...

【一元脑花】青少年4D逻辑训练的基本框架

一、核心训练模块多维认知构建资源分布图谱:通过分析社会资源层级与流动规律,建立立体空间认知模型2DOC时空维度整合:将历史局势演变(纵向时间轴)与未来趋势预判(横向可能性轴)结合训练2DOC动态干预系...

提升写作逻辑,这5个框架你搭建好了吗?

每个人都有写作的愿望,也都想表达心中浩荡的情感,但多年过后,许多人依旧卡在“无话可说”“写不出结构”的怪圈里。有人慨叹:“浮云一别后,流水十年间”,梦想与现实总有一道沟壑横亘——此岸是满腹心事,彼岸...

2023年主观题法治思想知识框架图

...

学霸:2天吃透初一语文上学期核心预习知识框架图|暑假弯道超车

学霸:2天吃透初一语文上学期核心预习知识框架图|暑假弯道超车。具体如下:查看作者的个人主页获悉剩余的~...

取消回复欢迎 发表评论: