共计 2287 个字符,预计需要花费 6 分钟才能阅读完成。
Jsoup 学习笔记
在平常开发中我们经常需要去另外的网站去爬取一些数据,对于正则不太懂又想偷懒的同学就可以使用 Jsoup。Jsoup 是 Java 世界的一款 HTML 解析工具,它支持用 CSS Selector 方式选择 DOM 元素,也可过滤 HTML 文本,防止 XSS 攻击。
LZ 学习 Jsoup 是为了抓取某些网站上的数据,为了能将自己学到的能跟大家分享,才写了这篇文章。
好了先上代码:
下面是一个抓取网站数据的例子
package com.wjj.utils;
import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
/**
* @author 作者 : 榨菜哥
* @version 创建时间:2016 年 8 月 18 日 下午 3:47:57
* 类说明:学习 Jsoup 爬取网页上的内容(注释很详细,适合初学者)*/
public class JsoupTest {public static void webCrawler(String url) {
try {
// 获取整个页面文件
Document document = Jsoup.connect(url)
// 需要加上 userAgent 才能伪装成浏览器而不会被网站屏蔽 IP
//(这种做法可能也会被某些网站拉黑 IP 一段时间,由于不太稳定到底是不是代码的问题,还在测试中...)
.userAgent("Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36")
// 加上 cookie 信息
.cookie("auth", "token")
// 设置超时
.timeout(30000)
// 用 get() 方式请求网址,也可以 post() 方式
.get();
// 坑:过滤 html 里面的空格,防止输出   时乱码
document = Jsoup.parse(document.toString().replace("",""));
// 对上述 <div class="article-body"> 内的所有 tr 元素进行遍历
//(定位精确,以免在页面中选择到其他 table 里面的 tr 标签)Elements elements = document.select("div.article-body");
// 获取所有的 tr 元素
for (Element tr : elements.select("tr")) {
// 获取每个 tr 元素里面的所有的 td 元素
Elements tds = tr.select("td");
// 获取所有 td 元素内的内容
for (Element td : tds) {
// 输出格式还算能看,不要在意细节,取出值才是我们想要的
System.out.format("%15s", td.text().trim() + "\t");
}
System.out.println();}
} catch (IOException e) {e.printStackTrace();
}
}
public static void main(String[] args) {
// 以新浪的一个页面作为例子
//(如果放新浪的链接不妥,请在下面评论处留言,我会整改,无心冒犯,只有学习)webCrawler("http://hz.house.sina.com.cn/scan/2016-08-17/22406171686957689921786.shtml?wt_source=nscan_xwzw_bt");
}
}
- Jsoup 抓取页面的流程:先模拟成浏览器去连接需要被访问的页面,用 get/post 来获取整个页面的 html 代码,得到的值为 Document 类型。最终原理其实就是通过 HttpURLConnection 去创建一个连接,然后得到返回的值。
- 如果只纯粹需要内容的话,可以先将容易乱码的特殊页面字符先过滤掉,如“”等。
- 接下来就是对元素进行选择了,选择自己想要获取的 html 代码块,如:Elements elements = document.select(“div.article-body”) 就得到了 <div class=”article-body”> 这一整块 html 代码或者 elements.select(“tr”) 得到的是 tr 及 tr 里面的所有元素;
- Elements 是元素的集合,源码为:public class Elements extends ArrayList<Element>;而 Element 则是一个 Node 节点。
-
Element 类里面有很多方法,举几个常用的:
- text() 方法,是获取当前节点及子节点的所有 html 标签和样式以外的内容,eg:中文、转义符号等等
- tagName() 方法,是获取当前 html 标签元素的名称,eg:body, table, tr 等等
- children() 方法,是获取当前标签元素的所有子元素,返回类型也是 Elements。
- 其他方法的功能有:替换原先元素的属性、获取父节点、转换成字符串的 toString 方法等等就不一一列举了
小结:在抓取页面内容的同时,还有另外一种方法,就是正则匹配,替换掉所有不想要的标签元素和样式等内容,只留下自己想要的。当然正则匹配跟 Jsoup 搭配起来一起使用,效果更佳。(等学会了正则表达式,再写一篇文章。提醒!!!链接地址可能因时间推移发生内容改变,到时候可能抓取到错误信息!)
正文完
发表至: java
2019-09-10