整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

Java实现爬虫技术Jsoup实例讲解


soup介绍

Jsoup是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。


Jsoup主要功能

注册中心:

  • 解析HTML:URL、文件或字符串中解析HTML。
  • 查找\取出数据:使用DOM或CSS选择器来查找、取出数据。
  • 操作HTML(增册改):可操作HTML元素、属性、文本。



以实例来讲解Jsoup使用

步骤:创建项目、pom.xml引入、创建启动类、运行项目。



中文伪代码

需求:我们要爬取Docker技术文章,这个网站页面左边为菜单,右边为内容。

经过分析:菜单里的url,是在css的class:left-navigation下面的a标签下,并且url以/article/index/开始的。

内容:直接在css的class:article_content下面的html。开始写代码了:

  • 首先:抓取网页:Document doc = Jsoup.connect(purl).get()。
  • 开始用Jsoup对doc的查找来取得菜单,代码里是handleParent方法里面。
  • 得到所有的菜单url,我们就可以开始抓取全部页面。
  • 还是Document doc = Jsoup.connect(srcurl).get();这句把网页抓取下来
  • 开始用Jsoup对doc的查找,标题、关键词、描述,内容。打日志显示出来。

pom.xml引入


<dependency>
 <groupId>org.jsoup</groupId>
 <artifactId>jsoup</artifactId>
 <version>1.11.3</version>
</dependency>

创建启动类

.Jsoup简述

Java中支持的爬虫框架有很多,比如WebMagic、Spider、Jsoup等。今天我们使用Jsoup来实现一个简单的爬虫程序。

​Jsoup拥有十分方便的api来处理html文档,比如参考了DOM对象的文档遍历方法,参考了CSS选择器的用法等等,因此我们可以使用Jsoup快速地掌握爬取页面数据的技巧。

2.快速开始

1)编写HTML页面

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

<title>Insert title here</title>

</head>

<body>

<table>

<thead>

<tr>

<td>商品名字</td>

<td>商品图片</td>

</tr>

</thead>

<tbody>

<tr>

<td class="pname">product1</td>

<td class="pimg"><img src="img/1.bmp"/></td>

</tr>

<tr>

<td class="pname">product2</td>

<td class="pimg"><img src="img/2.bmp"/></td>

</tr>

</tbody>

</table>

</body>

</html>

页面中表格的商品信息是我们要爬取的数据。其中属性pname类的商品名称,以及属于pimg类的商品图片。

2)使用HttpClient读取HTML页面

HttpClient是一个处理Http协议数据的工具,使用它可以将HTML页面作为输入流读进java程序中。可以从http://hc.apache.org/下载HttpClient的jar包。

//获得HttpClient对象

HttpClient httpClient = new DefaultHttpClient();

//定义要爬取数据的目标页面url

String url = "http://localhost:8080/MyShop/shop.jsp";

//使用HttpGet对象绑定url

HttpGet httpGet = new HttpGet(url);

//访问url获得响应消息封装在HttpResponse对象中

HttpResponse httpResponse = httpClient.execute(httpGet);

//entity中是响应消息的实体

HttpEntity entity = httpResponse.getEntity();

//使用EntityUtils的toString获得url指定页面的字符串内容,即html本身

String html = EntityUtils.toString(entity);

System.out.println(html);

3)使用Jsoup解析html字符串

通过引入Jsoup工具,直接调用parse方法来解析一个描述html页面内容的字符串来获得一个Document对象。该Document对象以操作DOM树的方式来获得html页面上指定的内容。相关API可以参考Jsoup官方文档:https://jsoup.org/cookbook/

下面我们使用Jsoup来获取上述html中指定的商品名称和价格的信息。

//JSOUP解析页面数据,获得Document对象

Document doc = Jsoup.parse(html);

//在Document对象的select方法中使用选择器来获得指定的元素,该选择器与CSS及Jquery的选择器相同。

Elements eles = doc.select("table tbody tr .pname");

Element ele = eles.get(0);

//获得指定元素的文本内容

System.out.println(ele.text());

Elements ele_imgs = doc.select("table tbody img");

//获得指定元素的src属性的值

String img_src = ele_imgs.get(0).attr("src");

System.out.println(img_src);

至此,我们已经实现使用HttpClient+Jsoup爬取HTML页面数据的功能。接下来,我们让效果更直观一些,比如将爬取的数据存到数据库中,将图片存到服务器上。

3.保存爬取的页面数据

1)保存普通数据到数据库中

将爬取的数据封装进实体Bean中,并存到数据库内。

//将数据封装到Javabean中

Product p = new Product();

p.setPid(UUID.randomUUID().toString());

p.setPname(ele.text());

p.setPimg(img_src);

//将存入数据库中

ProductDao dao = new ProductDao();

try {

dao.addProduct(p);

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

//dao的操作

public void addProduct(Product p) throws SQLException {

QueryRunner qr = new QueryRunner(JDBCUtil.getDataSource());

String sql = "insert into product values(?,?,?)";

qr.update(sql,p.getPid(),p.getPname(),p.getPimg());

}

2)保存图片到服务器上

直接通过下载图片的方式将图片保存到服务器本地。

private void downloadImg(HttpServletRequest request,Product p) throws ClientProtocolException, IOException {

//获得图片的原url

String url = "http://localhost:8080"+p.getPimg();

//使用HttpClient获得图片资源

HttpClient httpClient = new DefaultHttpClient();

HttpGet httpGet = new HttpGet(url);

HttpResponse httpResponse = httpClient.execute(httpGet);

//获得请求的图片资源的输入流

InputStream is = httpResponse.getEntity().getContent();

//在服务器本地创建文件,用于接收图片

String img_name = p.getPimg().substring(p.getPimg().lastIndexOf("/")+1);

String realPath = request.getRealPath("/Download/"+img_name);

File dir = new File(request.getRealPath("/Download"));

if(!dir.exists()){

//如果文件夹不存在,则创建

dir.mkdirs();

}

//读写数据,保存图片

File file = new File(realPath);

FileOutputStream fos = new FileOutputStream(file);

int b = 0;

while((b = is.read())!=-1){

fos.write(b);

}

fos.close();

}

4.总结

本案简单实现了使用HttpClient+Jsoup爬取网络数据,对于爬虫技术本身,还有很多值得深挖的地方,以后再为大家讲解。

soup

抓取网页后,需要对网页解析,可以使用字符串处理工具解析页面,也可以使用正则表达式

jsoup 的作用:是一款 Java 的HTML 解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于JQuery的操作方法来取出和操作数据

jsoup的主要功能如下:

1.从一个URL,文件或字符串中解析HTML;

2.使用DOM或CSS选择器来查找、取出数据;

3.可操作HTML元素、属性、文本;

创建练习类

解析URL

第一个参数是访问的url,第二个参数是访问的超时时间

使用标签选择器,获取title标签中的内容

输出结果

读取文件

准备一个简易的HTML文件

获取这个

读取文件,获取字符串,代码及结果

使用dom方式遍历文档

解析文件获取document对象

依据id获取,这个是id的内容,我们获取这个内容

编写代码,显示结果

依据标签获取,我们获取这个标签的内容

代码及结果

依据class获取,获取内容

代码和结果

依据属性,属性内容

代码和结果

接下来从元素中获取数据

首先从元素中获取ID

从元素中获取className

文本

代码及结果

如果内容是两个class

那么代码及结果

从元素中获取属性

代码及结果

获取元素的所有属性

代码及结果

从元素中获取文本内容,这个之前有,代码和结果