发布时间:2025-12-09 16:17:08 浏览次数:4
java爬虫框架非常多,比如较早的有Heritrix,轻量级的crawler4j,还有现在最火的WebMagic。
他们各有各的优势和劣势,我这里顺便简单介绍一下吧。
java的第一批爬虫框架,拥有独立的后台页面,可以实现界面操作去爬去网页。
相对其他框架,代码相对臃肿,上手难度较高,解析网页不如其他框架灵活。
https://github.com/a252937166/Heritrix
代码相当轻量级,可实现多线程爬取,上手难度低。
封装程度太低,很多功能需要开发者自己封装实现,多线程下,很容易重复爬取相同资源。
https://github.com/a252937166/crawler4j
这框架我们公司在用,各方面都比较完美吧,上手难度低,社区活跃度也较高,有问题可以得到及时反馈。
没有持久层框架的封装,需要自己实现。
这个框架我没有自己的demo,大家可以去开发者的GitHub看看
https://github.com/code4craft/webmagic
我这里推荐使用seimicrawler,个人感觉这个框架配合JsoupXpath,解析网页真心非常方便,而且框架整合了spring,用起来也很顺手。
中文官网地址:http://seimicrawler.org/
官方Github地址:https://github.com/zhegexiaohuozi/SeimiCrawler
自己修改项目地址:https://github.com/a252937166/seimicrawler/
下载源码,解压后把demo目录的文件单独拿出来,project目录不用管,里面是这个框架的一些源码,demo直接maven依赖它就可以了。
以maven的形式,导入demo,等待jar拉取玩,项目不报错就说明导入成功了。
打开crawlers文件夹,里面每个文件都是一个爬虫,我们可以学习一下Basic,这是开发者写的最简单的爬虫demo,其他的都可以以此内推。
package com.ouyang.crawlers;import cn.wanghaomiao.seimi.annotation.Crawler;import cn.wanghaomiao.seimi.def.BaseSeimiCrawler;import cn.wanghaomiao.seimi.struct.Request;import cn.wanghaomiao.seimi.struct.Response;import cn.wanghaomiao.xpath.model.JXDocument;import java.util.HashMap;import java.util.List;import java.util.Map;/*** @author 汪浩淼 [et.tw@163.com]* @since 2015/10/21.*/@Crawler(name = "basic")public class Basic extends BaseSeimiCrawler {@Overridepublic String[] startUrls() {//两个是测试去重的return new String[]{"http://www.cnblogs.com/","http://www.cnblogs.com/"};}@Overridepublic void start(Response response) {JXDocument doc = response.document();try {List<Object> urls = doc.sel("//a[@class='titlelnk']/@href");logger.info("{}", urls.size());Map map = new HashMap();map.put("ddd","aaa");for (Object s:urls){push(new Request(s.toString(),"getTitle").setParams(map));}} catch (Exception e) {e.printStackTrace();}}public void getTitle(Response response){JXDocument doc = response.document();try {logger.info("url:{} {}", response.getUrl(), doc.sel("//h1[@class='postTitle']/a/text()|//a[@id='cb_post_title_url']/text()"));//do something} catch (Exception e) {e.printStackTrace();}}}我来解释一下,response.document()表示把网页返回信息解析为一个JXDocument类,JXDocument支持JsoupXpath语法,比如//a[@class='titlelnk']/@href,表示从网页根目录下,查找<a class='titlelnk'></>,并获取其href的值。具体语法可以见http://www.w3school.com.cn/xpath/xpath_syntax.asp。
爬虫需要实现的具体业务,在start()方法里实现就行了,想要继续爬取新的网页,用push()实现,push()会新开启一个线程,push(new Request(s.toString(),"getTitle").setParams(map),表示爬取s.toString(),这个网页,并且回调getTitle()方法。
@Crawler(name = "basic")表示爬虫名字。
可以写一个main函数,new 一个Semi()对象,调用其goRun()方法机型了。
public class Boot {public static void main(String[] args){Seimi s = new Seimi();s.goRun("basic");}} 图(1)java爬虫系列(二)——爬取动态网页
java爬虫系列(三)——漫画网站爬取实战
java爬虫系列(四)——动态网页爬虫升级版
java爬虫系列(五)——今日头条文章爬虫实战