一、Jsoup介绍
jsoup 是一款基于 Java 的HTML解析器,它提供了一套非常省力的API,不但能直接解析某个URL地址、HTML文本内容,而且还能通过类似于DOM、CSS或者jQuery的方法来操作数据,所以 jsoup 也可以被当做爬虫工具使用。
相关概念
Document :文档对象。每份HTML页面都是一个文档对象,Document 是 jsoup 体系中最顶层的结构。
Element:元素对象。一个 Document 中可以着包含着多个 Element 对象,可以使用 Element 对象来遍历节点提取数据或者直接操作HTML。
Elements:元素对象集合,类似于List。
Node:节点对象。标签名称、属性等都是节点对象,节点对象用来存储数据。
类继承关系:Document 继承自 Element ,Element 继承自 Node。
一般执行流程:先获取 Document 对象,然后获取 Element 对象,最后再通过 Node 对象获取数据。
二、实战
2.1、创建一个springboot项目,并导入依赖
<!--添加fastjson依赖--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.7</version></dependency><!--添加Jsoup依赖--><dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.13.1</version></dependency>
2.2、创建实体类,用于封装商品信息
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Content {private String title;private String img;private String price;// 可以自己添加属性完善功能
}
2.3、写一个工具类,解析网页
public static List<Content> parseJD(String keyword) throws IOException {/// 使用前需要联网// 请求urlString url = "http://search.jd.com/search?keyword=" + keyword;// 1.解析网页(jsoup 解析返回的对象是浏览器Document对象)Document document = Jsoup.parse(new URL(url), 30000);// 使用document可以使用在js对document的所有操作// 2.获取元素(通过id),id自己查网页Element j_goodsList = document.getElementById("J_goodsList");// 3.获取J_goodsList ul 每一个Elements lis = j_goodsList.getElementsByTag("li");// System.out.println(lis);// 4.获取li下的 img、price、name// list存储所有li下的内容List<Content> contents = new ArrayList<Content>();for (Element li : lis) {// 由于网站图片使用懒加载,将src属性替换为data-lazy-imgString img = li.getElementsByTag("img").eq(0).attr("data-lazy-img");// 获取li下 第一张图片String name = li.getElementsByClass("p-name").eq(0).text();String price = li.getElementsByClass("p-price").eq(0).text();// 封装为对象Content content = new Content(name,img,price);// 添加到list中contents.add(content);}// System.out.println(contents);// 5.返回 listreturn contents;}
2.4、测试
// 测试一下public static void main(String[] args) throws IOException {HtmlParseUtil.parseJD("java").forEach(System.out::println);}
成功爬取到java相关信息的数据
如果有兴趣的小伙伴,也可以和ElasticSearch联动,创建一个索引将爬取的数据入在索引库中,当做搜索库!