java爬虫抓取网页数据(通过案例展示如何使用Jsoup进行解析案例中将获取博客园首页 )

优采云 发布时间: 2021-12-18 09:19

  java爬虫抓取网页数据(通过案例展示如何使用Jsoup进行解析案例中将获取博客园首页

)

  下面的例子展示了如何使用 Jsoup 进行分析。在这种情况下,将获得博客花园首页的标题和第一页的博客列表文章。

  

  请看代码(在前面代码的基础上进行操作,如果不知道如何使用httpclient,请跳转页面阅读):

  引入依赖

  

org.jsoup

jsoup

1.12.1

  实现代码。在实现代码之前,先分析一下html结构。标题不用说了,文章列表呢?浏览器按F12查看页面元素源码,会发现list是一个大div,id="post_list",每篇文章文章都是一个小div,class="post_item"

  

  然后就可以开始代码了,Jsoup的核心代码如下(整体源码会在文章的最后给出):

  

  

/**

* 下面是Jsoup展现自我的平台

*/

//6.Jsoup解析html

Document document = Jsoup.parse(html);

//像js一样,通过标签获取title

System.out.println(document.getElementsByTag("title").first());

//像js一样,通过id 获取文章列表元素对象

Element postList = document.getElementById("post_list");

//像js一样,通过class 获取列表下的所有博客

Elements postItems = postList.getElementsByClass("post_item");

//循环处理每篇博客

for (Element postItem : postItems) {

//像jquery选择器一样,获取文章标题元素

Elements titleEle = postItem.select(".post_item_body a[class='titlelnk']");

System.out.println("文章标题:" + titleEle.text());;

System.out.println("文章地址:" + titleEle.attr("href"));

//像jquery选择器一样,获取文章作者元素

Elements footEle = postItem.select(".post_item_foot a[class='lightblue']");

System.out.println("文章作者:" + footEle.text());;

System.out.println("作者主页:" + footEle.attr("href"));

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

}

  

  根据上面的代码,你会发现我通过Jsoup.parse(String html)方法解析httpclient获取到的html内容获取Document,然后文档可以通过两种方式获取它的子元素:像js一样,它可以通过 getElementXXXX 获取。像 jquery 选择器一样传递 select() 方法。无论哪种方式都可以,我个人推荐选择方法。对于元素中的属性,比如超链接地址,可以使用 element.attr(String) 方法获取,对于元素的文本内容,可以使用 element.text() 方法获取。

  执行代码,查看结果(不得不感慨博客园的园友真是厉害。从上面对首页html结构的分析,到Jsoup分析的代码的执行,还有这么多首页在这一段时间文章)

  

  由于新的文章发布太快,上面的截图和这里的输出有些不同。

  三、Jsoup的其他用法

  我Jsoup除了可以发挥httpclient小哥的工作成果外,还可以自己动手,自己抓取页面,然后自己分析。上面已经展示了分析技巧,下面展示如何自己抓取页面。其实很简单。不同的是我直接拿到文档,不需要通过Jsoup.parse()方法解析。

  

  除了直接获取在线资源,我还可以分析本地资源:

  代码:

  

  

public static void main(String[] args) {

try {

Document document = Jsoup.parse(new File("d://1.html"), "utf-8");

System.out.println(document);

} catch (IOException e) {

e.printStackTrace();

}

}

  

  四、Jsoup 另一个值得一提的功能

  你一定有过这样的经历。在你页面的文本框中,如果你输入了html元素,保存后页面布局很可能会乱七八糟。如果能过滤一下内容就完美了。

  碰巧我可以用 Jsoup 做到这一点。

  

public static void main(String[] args) {

String unsafe = "<p><a href=&#39;网址&#39; onclick=&#39;stealCookies()&#39;>博客园</a>";

System.out.println("unsafe: " + unsafe);

String safe = Jsoup.clean(unsafe, Whitelist.basic());

System.out.println("safe: " + safe);

}</p>

  通过 Jsoup.clean 方法,使用白名单进行过滤。结果:

  

unsafe: <p><a href=&#39;网址&#39; onclick=&#39;stealCookies()&#39;>博客园</a>

safe:

  <a rel="nofollow">博客园</a></p>

  五、结论

  通过以上,大家都相信我很厉害了。不仅可以解析HttpClient抓取到的html元素,还可以自己抓取页面dom,还可以加载解析本地保存的html文件。

  另外,我可以通过白名单过滤字符串,过滤掉一些不安全的字符。

  最重要的是,以上所有函数的API调用都比较简单。

  ============华丽的分割线============

  码字不易,点赞再走~~

  最后附上案例分析中博客园首页文章列表的完整源码:

  

  

  

package httpclient_learn;

import java.io.IOException;

import org.apache.http.HttpEntity;

import org.apache.http.HttpStatus;

import org.apache.http.client.ClientProtocolException;

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

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

import org.apache.http.client.utils.HttpClientUtils;

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;

public class HttpClientTest {

public static void main(String[] args) {

//1.生成httpclient,相当于该打开一个浏览器

CloseableHttpClient httpClient = HttpClients.createDefault();

CloseableHttpResponse response = null;

//2.创建get请求,相当于在浏览器地址栏输入 网址

HttpGet request = new HttpGet("https://www.cnblogs.com/");

//设置请求头,将爬虫伪装成浏览器

request.setHeader("User-Agent","Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36");

// HttpHost proxy = new HttpHost("60.13.42.232", 9999);

// RequestConfig config = RequestConfig.custom().setProxy(proxy).build();

// request.setConfig(config);

try {

//3.执行get请求,相当于在输入地址栏后敲回车键

response = httpClient.execute(request);

//4.判断响应状态为200,进行处理

if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {

//5.获取响应内容

HttpEntity httpEntity = response.getEntity();

String html = EntityUtils.toString(httpEntity, "utf-8");

System.out.println(html);

/**

* 下面是Jsoup展现自我的平台

*/

//6.Jsoup解析html

Document document = Jsoup.parse(html);

//像js一样,通过标签获取title

System.out.println(document.getElementsByTag("title").first());

//像js一样,通过id 获取文章列表元素对象

Element postList = document.getElementById("post_list");

//像js一样,通过class 获取列表下的所有博客

Elements postItems = postList.getElementsByClass("post_item");

//循环处理每篇博客

for (Element postItem : postItems) {

//像jquery选择器一样,获取文章标题元素

Elements titleEle = postItem.select(".post_item_body a[class=&#39;titlelnk&#39;]");

System.out.println("文章标题:" + titleEle.text());;

System.out.println("文章地址:" + titleEle.attr("href"));

//像jquery选择器一样,获取文章作者元素

Elements footEle = postItem.select(".post_item_foot a[class=&#39;lightblue&#39;]");

System.out.println("文章作者:" + footEle.text());;

System.out.println("作者主页:" + footEle.attr("href"));

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

}

} else {

//如果返回状态不是200,比如404(页面不存在)等,根据情况做处理,这里略

System.out.println("返回状态不是200");

System.out.println(EntityUtils.toString(response.getEntity(), "utf-8"));

}

} catch (ClientProtocolException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} finally {

//6.关闭

HttpClientUtils.closeQuietly(response);

HttpClientUtils.closeQuietly(httpClient);

}

}

}

  

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线