Jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。下面我将带大家走进项目实战!
1.创建SpringBoot项目
打开IDEA,创建一个新的SpringBoot项目,输入对应的名称,位置,Java环境以及SDK,点击下一步即可完成创建。
点击下一步后,还需要引入Spring Web的依赖,选择完毕后,点击完成即可。
2.导入项目依赖
在pom.xml中导入本次项目所需要的依赖。
<!-- 数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- mybatis-plus 是自己开发的 并非官方的-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--解析网页jsoup-->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.10.2</version>
</dependency>
3.查看京东商城的属性标签
右击右侧链接,即可进入京东官网,以搜索Java为例京东,进入京东官网后,点击F12,查看页面的布局情况可知,商品列表都在一个id为J_goodsList的div中,而具体的每一个商品信息列表都在一个li标签里面,每一个li标签(商品信息)都包括商品价格(p-price),商品名称(p-name)以及商品图片(p-img)等信息。具体如下图所示。
4.创建数据库表结构
根据分析了京东商品的属性结构后,下面就需要创建数据库表结构。具体操作如下所示:
打开SQLyog,创建Item数据库并在该数据库中创建book数据库表。具体的创建数据库以及创建表的sq语句如下所示:
由于商品查询出来的信息较长,所以使用VARCHAR(200),保证数据库表大小能够存储对应的字段。
CREATE DATABASE Item;
CREATE TABLE book(
id INT PRIMARY KEY COMMENT '主键ID',
img VARCHAR(200) COMMENT '书籍地址',
NAME VARCHAR(200) COMMENT '书籍名称',
price VARCHAR(200) COMMENT '书籍价格'
);
5.连接数据库
在SpringBoot项目中的application.properties中配置连接数据库的信息,具体如下所示:
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.url=jdbc:mysql://localhost:3306/item?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
注意:如果是Mysql8.0则需要引入对应的时区设置。
6.创建商品实体类
连接好数据库后,就需要创建商品实体类。
在创建好的SpringBoot项目下创建pojo软件包(存放实体类),在该软件包中创建book实体类,用于存储商品数据。具体代码如下所示
package com.xing.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Book {
private int id;//主键
private String img;//商品图片
private String name;//商品名称
private String price;//商品价格
}
7.创建mapper接口
因为是采用Mybatis-Plus,所以我们只需要定义一个BookMapper接口继承BaseMapper即可 ,这样一来就将所有简单的CRUD(增删改查)都已经编写完成,不在需要编写大量的配置文件了。
package com.xing.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xing.pojo.Book;
import org.springframework.stereotype.Repository;
@Repository
public interface BookMapper extends BaseMapper<Book> {
//定义一个mapper接口 继承BaseMapper<Book>即可
//如此就将所有的CRUD语句写完了
}
注意:编写完mapper层以后,我们还需要在主程序入口扫描mapper包下的所有接口
8.编写测试类代码
本次插入的所有数据是有关Java的商品,读者可以执行修改
String url=“https://search.jd.com/Search?keyword=java”;里面的keyword后面的值来实现其他类型信息的查询,当然也可以将下面的代码封装成方法来实现动态的查询。
package com.xing;
import com.xing.mapper.BookMapper;
import com.xing.pojo.Book;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
@SpringBootTest
class JsoupHtmlParseApplicationTests {
@Autowired
BookMapper bookMapper;
@Test
void contextLoads() throws IOException {
//定义需要解析的网页地址
String url="https://search.jd.com/Search?keyword=java";
//这里的document就是浏览器里面的document
Document document = Jsoup.parse(new URL(url), 30000);
//通过J_goodsList获取所有的商品信息
Element element = document.getElementById("J_goodsList");
//在element里面获取所有的Li标签 每一个Li标签对应的是一个商品
Elements elements = element.getElementsByTag("li");
int id=0;
//依次遍历每一个商品 并将商品信息写入数据库中
for (Element el : elements) {
Book book=new Book();
id++;
//京东的图片数量较多,所以图片的加载采取懒加载,被存储在data-lazy-img里面,而不是src中,用户可以通过打印element来查看
String img = el.getElementsByTag("img").eq(0).attr("data-lazy-img");
String price=el.getElementsByClass("p-price").eq(0).text();
String name = el.getElementsByClass("p-name").eq(0).text();
book.setId(id);
book.setImg(img);
book.setPrice(price);
book.setName(name);
bookMapper.insert(book);
}
System.out.println("批量插入数据成功");
}
}
需要注意的是:由于京东需要加载的图片加多,所以京东的网站采用的是懒加载的机制加载图片,因为通过src属性无法获取到图片的地址信息,我们可以通过打印element来查看图片的真实存储地方。
9.插入结果展示
按照上面的步骤执行代码,即可以实现批量的插入数据,即可以节省大量的时间,而且可以保证数据的都是最新的数据。