Java爬虫-jsoup

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("=====================");
    }
}

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值