java爬虫抓取网页数据(JavaHTML解析器解析用包解析URL地址的应用)

优采云 发布时间: 2021-10-17 07:19

  java爬虫抓取网页数据(JavaHTML解析器解析用包解析URL地址的应用)

  Java爬虫介绍(二)——Jsoup解析原创HTML页面链接:

  在上一节中,我们获取了页面的 HTML 源代码,但这些源代码是提供给浏览器解析的。我们需要的数据其实就是页面上博客的标题、作者、简介、发布日期等。我们需要一种方法来从 HTML 源代码中解析和提取这些信息,然后将其存储在文本或数据库中。在本篇博客中,我们将介绍使用Jsoup包来帮助我们解析页面和提取数据。

  Jsoup 是一个 Java HTML 解析器,可以直接解析 URL 地址或解析 HTML 内容。它的主要功能包括解析 HTML 页面、通过 DOM 或 CSS 选择器搜索和提取数据以及更改 HTML 内容。Jsoup的使用也很简单。使用Jsoup.parse(String str)方法解析我们之前获取的HTML内容,得到一个Documend类。剩下的工作就是从Document中选择我们需要的数据。例如,假设我们有一个收录以下内容的 HTML 页面:

  

第一篇博客

第二篇博客

第三篇博客

  通过Jsoup,我们可以将上述三个博客的标题提取成一个List。使用方法如下:

  首先我们通过maven引入Jsoup

  

org.jsoup

jsoup

1.10.3

  然后写Java进行分析。

  package org.hfutec.example;

import org.jsoup.Jsoup;

import org.jsoup.nodes.Document;

import org.jsoup.nodes.Element;

import org.jsoup.select.Elements;

import java.util.ArrayList;

import java.util.List;

/*******

* created by DuFei at 2017.08.25 21:00

* web crawler example

* ******/

public class DataLearnerCrawler {

public static void main(String[] args) {

List titles = new ArrayList();

List urls = new ArrayList();

//假设我们获取的HTML的字符内容如下

String html = "<a href=\"url1\">第一篇博客</a><a href=\"url2\">第二篇博客</a><a href=\"url3\">第三篇博客</a>";

//第一步,将字符内容解析成一个Document类

Document doc = Jsoup.parse(html);

//第二步,根据我们需要得到的标签,选择提取相应标签的内容

Elements elements = doc.select("div[id=blog_list]").select("div[class=blog_title]");

for( Element element : elements ){

String title = element.text();

titles.add(title);

urls.add(element.select("a").attr("href"));

}

//输出测试

for( String title : titles ){

System.out.println(title);

}

for( String url : urls ){

System.out.println(url);

}

}

}

  我们简单介绍一下Jsoup的解析过程。第一步是调用parse()方法将字符对象变成Document对象,然后我们对这个对象进行操作。通常,提取数据是根据标签选择数据。select() 方法和 /css 选择器的语法格式相同。一般提取某个标签,其属性值就是指定的内容。结果是一个Elements的集合,也就是Elements(因为可能有很多合格的标签,所以结果是一个集合)。select() 方法可以一直持续到我们想要的标签集被选中为止(注意我们不必逐级选择标签,直接在我们需要的标签上写select()方法即可这里的代码可以直接写成 Elements elements = doc.select("

  

  e39b4f52-98fc-4ed5-9c43-15b1dc04f823.jpg

  更多Jsoup解析操作请参考:1、 2、

  一个实例

  下面我们就按照前面爬取数据的例子学习官方网站博客列表来讲解一个例子。我们已经知道可以使用 Jsoup 来解析抓取到的 HTML 页面内容。那么如何查看我们需要的内容对应的标签呢?以Chrome浏览器为例,我们需要抓取这个页面的博客。首先用Chrome浏览器打开网址,然后右击博客标题,点击“检查”,得到HTML页面。如下所示。

  

  94f6bf06-312a-4781-97c8-99d2b9d57884.jpg

  

  d810463f-c23d-4dae-98cc-08764fbbef85.jpg

  

  d310a4ae-c2e0-45f1-8637-9f8b390baa3b.jpg

  图4 确认当前博客HTML代码的一致性

  经过上面的操作,我们已经可以看到所有的博客标题等信息都存储在了class=card div中。所以,我们只需要关注这个标签中的内容是如何组织的。如下图所示,我们需要的信息所属的标签,点击小三角展开即可。

  

  7e161a6f-bbff-44e3-a422-08d18102cbb3.jpg

  因此,解析博客列表的代码可以写成如下。

  package org.hfutec.example;

import org.apache.http.HttpEntity;

import org.apache.http.client.methods.CloseableHttpResponse;

import org.apache.http.client.methods.HttpGet;

import org.apache.http.impl.client.CloseableHttpClient;

import org.apache.http.impl.client.HttpClients;

import org.apache.http.util.EntityUtils;

import org.jsoup.Jsoup;

import org.jsoup.nodes.Document;

import org.jsoup.nodes.Element;

import org.jsoup.select.Elements;

import java.io.IOException;

/*******

* created by DuFei at 2017.08.25 21:00

* web crawler example

* ******/

public class DataLearnerCrawler {

public static void main(String[] args) {

String url = "http://www.datalearner.com/blog_list";

String rawHTML = null;

try {

rawHTML = getHTMLContent(url);

} catch (IOException e) {

e.printStackTrace();

}

//将当前页面转换成Jsoup的Document对象

Document doc = Jsoup.parse(rawHTML);

//获取所有的博客列表集合

Elements blogList = doc.select("div[class=card]");

//针对每个博客内容进行解析,并输出

for( Element element : blogList ){

String title = element.select("h4[class=card-title]").text();

String introduction = element.select("p[class=card-text]").text();

String author = element.select("span[class=fa fa-user]").text();

System.out.println("Title:\t"+title);

System.out.println("introduction:\t"+introduction);

System.out.println("Author:\t"+author);

System.out.println("--------------------------");

}

}

//根据url地址获取对应页面的HTML内容,我们将上一节中的内容打包成了一个方法,方便调用

private static String getHTMLContent( String url ) throws IOException {

//建立一个新的请求客户端

CloseableHttpClient httpClient = HttpClients.createDefault();

//使用HttpGet方式请求网址

HttpGet httpGet = new HttpGet(url);

//获取网址的返回结果

CloseableHttpResponse response = httpClient.execute(httpGet);

//获取返回结果中的实体

HttpEntity entity = response.getEntity();

String content = EntityUtils.toString(entity);

//关闭HttpEntity流

EntityUtils.consume(entity);

return content;

}

}

  

  e248e590-b1c7-4df3-b9ab-074fb86095ec.jpg

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线