java爬虫系列(一)——爬虫入门[通俗易懂]
大家好,又见面了,我是你们的朋友全栈君。
爬虫框架介绍
java爬虫框架非常多,比如较早的有Heritrix,轻量级的crawler4j,还有现在最火的WebMagic。 他们各有各的优势和劣势,我这里顺便简单介绍一下吧。
Heritrix
优势
java的第一批爬虫框架,拥有独立的后台页面,可以实现界面操作去爬去网页。
劣势
相对其他框架,代码相对臃肿,上手难度较高,解析网页不如其他框架灵活。
简单demo地址
https://github.com/a252937166/Heritrix
crawler4j
优势
代码相当轻量级,可实现多线程爬取,上手难度低。
劣势
封装程度太低,很多功能需要开发者自己封装实现,多线程下,很容易重复爬取相同资源。
简单demo地址
https://github.com/a252937166/crawler4j
WebMagic
优势
这框架我们公司在用,各方面都比较完美吧,上手难度低,社区活跃度也较高,有问题可以得到及时反馈。
劣势
没有持久层框架的封装,需要自己实现。
简单demo地址
这个框架我没有自己的demo,大家可以去开发者的GitHub看看 https://github.com/code4craft/webmagic
快速入门
seimicrawler
我这里推荐使用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 {
@Override
public String[] startUrls() {
//两个是测试去重的
return new String[]{
"http://www.cnblogs.com/","http://www.cnblogs.com/"};
}
@Override
public 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");
}
}
以上代码就表示启动basic
爬虫,运行main
函数就开始爬取网页了。
图(1)
同系列文章
java爬虫系列(二)——爬取动态网页 java爬虫系列(三)——漫画网站爬取实战 java爬虫系列(四)——动态网页爬虫升级版 java爬虫系列(五)——今日头条文章爬虫实战
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/156729.html原文链接:https://javaforall.cn
相关文章
- 本地环境下启动openFaas创建的Java的云函数
- java传真发送,用Java发送传真解决之道
- java标识符与关键字_4、Java标识符和关键字
- java中applet是什么意思_Java Applet与Java Application的区别
- java语言的平台无关性是指什么,《深入Java虚拟机》学习笔记二:平台无关性
- java图书馆新地址_最受Java开发者喜爱的5款开源IDE盘点
- JAVA的使用_Java集成开发环境
- Java中JDK和JRE的区别是什么?它们的作用分别是什么?「建议收藏」
- java 3DES (DESede/ECB/PKCS5Padding) 加解密
- 面向对象Java开发——对象的内存原理和内存图
- Deep Java Library_java atomicinteger
- JAVA生成uuid_java接口default方法
- Java方法重载_java入门方法的使用
- java爬虫问题二: 使用jsoup爬取数据class选择器中空格多选择怎么解决
- 从java到JavaScript(2):对比Java/Go/Swift/Rust看Dart
- JavaWeb项目导入MyEclipse后变为JAVA项目项目【解决方法】详解程序员
- java使用正则抓捕网上邮箱详解编程语言
- 程序Linux下构建Java应用:从入门到精通(linux下开发java)
- 实现Linux上的Java环境:从安装到配置(linux安装java环境)
- Java并发编程:线程池的使用详解编程语言
- java spring boot消息队列 RabbitMQ详解编程语言
- 删除Linux中的Java程序(linux删除java)
- 实现Redis基于Java实现的过期策略(redisjava过期)