jsoup是一款Java的HTML解析器,主要用来对HTML解析。在爬虫的时候,当我们用HttpClient之类的框架,获取到网页源码之后,需要从网页源码中取出我们想要的内容,就可以使用jsoup这类HTML解析器了。可以非常轻松的实现。
虽然jsoup也支持从某个地址直接去爬取网页源码,但是只支持HTTP,HTTPS协议,支持不够丰富。所以,主要还是用来对HTML进行解析。
#Jsoup地址
https://www.open-open.com/jsoup/
#在maven中央仓库的地址
https://mvnrepository.com/artifact/org.jsoup/jsoup/1.11.3
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.11.3</version>
</dependency>
Jsoup使用起来类似于JQuery,都是通过id、class、标签来进行DOM操作
public static void main(String[] args) throws IOException {
Document doc = Jsoup.connect("https://www.bilibili.com/").get();
//标题
System.out.println(doc.title());
//keyword
System.out.println(doc.text());
//获取class为t的DOM集合
Elements elements = doc.getElementsByClass("t");
for (Element element : elements) {
System.out.println(element.html());
}
}
其中Jsoup.connect("xxx")方法返回一个org.jsoup.Connection对象。
在Connection对象中,可以执行get或者post来执行请求。但是在执行请求之前,可以使用Connection对象来设置一些请求信息。比如:头信息,cookie,请求等待时间,代理等等来模拟浏览器的行为。
Map<String,String> header = new HashMap<>();
header.put("Server","Apache ");
header.put("Date","Tue, 03 Dec 2019 06:37:08 GMT");
header.put("Content-Type","text/html;charset=UTF-8");
header.put("Transfer-Encoding","chunked");
header.put("Connection","keep-alive");
header.put("Vary","Accept-Encoding");
header.put("X-Han","shotFirst");
header.put("Content-Language","en-ENGLISH");
header.put("Set-Cookie","org.springframework.web.servlet.i18n.CookieLocaleResolver.LOCALE=en_ENGLISH; Path=/");
header.put("Expires","Mon, 01 Jan 1999 00:00:00 GMT");
header.put("Pragma","no-cache");
header.put("Cteonnt-Length","164070");
header.put("Content-Encoding","gzip");
header.put("referer","http://localhost/");
Document doc = Jsoup.connect("https://homestarlight.manufacturer.globalsources.com/si/6008853576646/Homepage.htm?source=GSOLBigPP_A")
.userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36")
.headers(header)
.timeout(30000)
.get();
注:以上请求头都是抄PostMan抄来的,一般抄PostMan就能获取到绝大多数网站的DOM结构
Document中提供了两类方法来获取注定的元素:1:DOM法、2:类JQuery法
1:DOM法
Document doc = Jsoup.connect("url").get();
//通过id来获取
doc.getElementById("username");
//通过标签名字来获取
doc.getElementsByTag("a");
//通过类名来获取
doc.getElementsByClass("nav-item");
//通过属性名字来获取
doc.getElementsByAttribute("id");
//通过指定的属性名字,属性值来获取
doc.getElementsByAttributeValue("class", "nav-item");
//获取所有元素
Elements allElements = doc.getAllElements();
2、通过类似于css或jQuery的选择器来查找元素
public Elements select(String cssQuery)
File input = new File("/tmp/input.html");
Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");
//带有href属性的a元素
Elements links = doc.select("a[href]");
//扩展名为.png的图片
Elements pngs = doc.select("img[src$=.png]");
//class等于masthead的div标签
Element masthead = doc.select("div.masthead").first();
//在h3元素之后的a元素
Elements resultLinks = doc.select("h3.r > a");
//查找class为nav-link-ul的<ul>标签下带href属性的<a>标签
Elements elements = doc.select("ul.nav-link-ul a[href]");
如果一个标签有多个class如何查询,如下图所示<ul>有两个class

//多个class之间用.连接
Elements select = document.select("ul.spNav.clear
获取到元素后,可以通过如下方法读取该元素的属性、值、html内容
attr(String key)获取属性attr(String key, String value)设置属性
attributes()获取所有属性
id(), className() and classNames()
text()获取文本内容text(String value) 设置文本内容
html()获取元素内HTMLhtml(String value)设置元素内的HTML内容
outerHtml()获取元素外HTML内容
data()获取数据内容(例如:script和style标签)
tag() and tagName()
删除DOM里的某个标签或class(Document或Element都能用):
//删除element里全部div标签
element.select("div").remove();
//删除document里所有<div class="spContact clearfix"></div>标签
document.select("div.spContact.clearfix").remove();
//删除所有div里class属性
document.select("div").removeAttr("class")
例如爬取B站头部导航:
public static void main(String[] args) throws IOException {
Map<String, String> header = new HashMap<>();
header.put("Server", "Apache ");
header.put("Date", "Tue, 03 Dec 2019 06:37:08 GMT");
header.put("Content-Type", "text/html;charset=UTF-8");
header.put("Transfer-Encoding", "chunked");
header.put("Connection", "keep-alive");
header.put("Vary", "Accept-Encoding");
header.put("X-Han", "shotFirst");
header.put("Content-Language", "en-ENGLISH");
header.put("Set-Cookie", "org.springframework.web.servlet.i18n.CookieLocaleResolver.LOCALE=en_ENGLISH; Path=/");
header.put("Expires", "Mon, 01 Jan 1999 00:00:00 GMT");
header.put("Pragma", "no-cache");
header.put("Cteonnt-Length", "164070");
header.put("Content-Encoding", "gzip");
header.put("referer", "http://localhost/");
Document doc = Jsoup.connect("https://www.bilibili.com/")
.userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36")
.headers(header)
.timeout(30000)
.get();
//查找class为nav-link-ul的<ul>标签下带href的<a>标签
Elements elements = doc.select("ul.nav-link-ul a[href]");
for (Element element : elements) {
System.out.println("html:" + element.html());
System.out.println("text:" + element.text());
System.out.println("attributes:" + element.attributes());
System.out.println("attr:" + element.attr("href"));
System.out.println("tag:" + element.tag());
System.out.println("tagName:" + element.tagName());
System.out.println("=====================");
}
}